diff options
author | Étienne Mollier <emollier@debian.org> | 2022-11-24 22:00:41 +0100 |
---|---|---|
committer | Étienne Mollier <emollier@debian.org> | 2022-11-24 22:00:41 +0100 |
commit | 7fbbe1ae4143dd6e3e069ed2147f67f859ea5918 (patch) | |
tree | 6336add764774512a104dffcd7552a7fa82dc6b3 | |
parent | 05fe631d28d2e4010116108e091d625ad80f11de (diff) | |
parent | 47d579b4aee6df7d94c40788e5c4d2464e154842 (diff) |
Update upstream source from tag 'upstream/2.2.2+ds'
Update to upstream version '2.2.2+ds'
with Debian dir 65b8953dc0df4414e9139b9336eda41942b84921
84 files changed, 0 insertions, 83737 deletions
diff --git a/inc/Module/Install.pm b/inc/Module/Install.pm deleted file mode 100644 index 7ba98c2..0000000 --- a/inc/Module/Install.pm +++ /dev/null @@ -1,451 +0,0 @@ -#line 1 -package Module::Install; - -# For any maintainers: -# The load order for Module::Install is a bit magic. -# It goes something like this... -# -# IF ( host has Module::Install installed, creating author mode ) { -# 1. Makefile.PL calls "use inc::Module::Install" -# 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install -# 3. The installed version of inc::Module::Install loads -# 4. inc::Module::Install calls "require Module::Install" -# 5. The ./inc/ version of Module::Install loads -# } ELSE { -# 1. Makefile.PL calls "use inc::Module::Install" -# 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install -# 3. The ./inc/ version of Module::Install loads -# } - -use 5.006; -use strict 'vars'; -use Cwd (); -use File::Find (); -use File::Path (); - -use vars qw{$VERSION $MAIN}; -BEGIN { - # All Module::Install core packages now require synchronised versions. - # This will be used to ensure we don't accidentally load old or - # different versions of modules. - # This is not enforced yet, but will be some time in the next few - # releases once we can make sure it won't clash with custom - # Module::Install extensions. - $VERSION = '1.19'; - - # Storage for the pseudo-singleton - $MAIN = undef; - - *inc::Module::Install::VERSION = *VERSION; - @inc::Module::Install::ISA = __PACKAGE__; - -} - -sub import { - my $class = shift; - my $self = $class->new(@_); - my $who = $self->_caller; - - #------------------------------------------------------------- - # all of the following checks should be included in import(), - # to allow "eval 'require Module::Install; 1' to test - # installation of Module::Install. (RT #51267) - #------------------------------------------------------------- - - # Whether or not inc::Module::Install is actually loaded, the - # $INC{inc/Module/Install.pm} is what will still get set as long as - # the caller loaded module this in the documented manner. - # If not set, the caller may NOT have loaded the bundled version, and thus - # they may not have a MI version that works with the Makefile.PL. This would - # result in false errors or unexpected behaviour. And we don't want that. - my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; - unless ( $INC{$file} ) { die <<"END_DIE" } - -Please invoke ${\__PACKAGE__} with: - - use inc::${\__PACKAGE__}; - -not: - - use ${\__PACKAGE__}; - -END_DIE - - # This reportedly fixes a rare Win32 UTC file time issue, but - # as this is a non-cross-platform XS module not in the core, - # we shouldn't really depend on it. See RT #24194 for detail. - # (Also, this module only supports Perl 5.6 and above). - eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; - - # If the script that is loading Module::Install is from the future, - # then make will detect this and cause it to re-run over and over - # again. This is bad. Rather than taking action to touch it (which - # is unreliable on some platforms and requires write permissions) - # for now we should catch this and refuse to run. - if ( -f $0 ) { - my $s = (stat($0))[9]; - - # If the modification time is only slightly in the future, - # sleep briefly to remove the problem. - my $a = $s - time; - if ( $a > 0 and $a < 5 ) { sleep 5 } - - # Too far in the future, throw an error. - my $t = time; - if ( $s > $t ) { die <<"END_DIE" } - -Your installer $0 has a modification time in the future ($s > $t). - -This is known to create infinite loops in make. - -Please correct this, then run $0 again. - -END_DIE - } - - - # Build.PL was formerly supported, but no longer is due to excessive - # difficulty in implementing every single feature twice. - if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } - -Module::Install no longer supports Build.PL. - -It was impossible to maintain duel backends, and has been deprecated. - -Please remove all Build.PL files and only use the Makefile.PL installer. - -END_DIE - - #------------------------------------------------------------- - - # To save some more typing in Module::Install installers, every... - # use inc::Module::Install - # ...also acts as an implicit use strict. - $^H |= strict::bits(qw(refs subs vars)); - - #------------------------------------------------------------- - - unless ( -f $self->{file} ) { - foreach my $key (keys %INC) { - delete $INC{$key} if $key =~ /Module\/Install/; - } - - local $^W; - require "$self->{path}/$self->{dispatch}.pm"; - File::Path::mkpath("$self->{prefix}/$self->{author}"); - $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); - $self->{admin}->init; - @_ = ($class, _self => $self); - goto &{"$self->{name}::import"}; - } - - local $^W; - *{"${who}::AUTOLOAD"} = $self->autoload; - $self->preload; - - # Unregister loader and worker packages so subdirs can use them again - delete $INC{'inc/Module/Install.pm'}; - delete $INC{'Module/Install.pm'}; - - # Save to the singleton - $MAIN = $self; - - return 1; -} - -sub autoload { - my $self = shift; - my $who = $self->_caller; - my $cwd = Cwd::getcwd(); - my $sym = "${who}::AUTOLOAD"; - $sym->{$cwd} = sub { - my $pwd = Cwd::getcwd(); - if ( my $code = $sym->{$pwd} ) { - # Delegate back to parent dirs - goto &$code unless $cwd eq $pwd; - } - unless ($$sym =~ s/([^:]+)$//) { - # XXX: it looks like we can't retrieve the missing function - # via $$sym (usually $main::AUTOLOAD) in this case. - # I'm still wondering if we should slurp Makefile.PL to - # get some context or not ... - my ($package, $file, $line) = caller; - die <<"EOT"; -Unknown function is found at $file line $line. -Execution of $file aborted due to runtime errors. - -If you're a contributor to a project, you may need to install -some Module::Install extensions from CPAN (or other repository). -If you're a user of a module, please contact the author. -EOT - } - my $method = $1; - if ( uc($method) eq $method ) { - # Do nothing - return; - } elsif ( $method =~ /^_/ and $self->can($method) ) { - # Dispatch to the root M:I class - return $self->$method(@_); - } - - # Dispatch to the appropriate plugin - unshift @_, ( $self, $1 ); - goto &{$self->can('call')}; - }; -} - -sub preload { - my $self = shift; - unless ( $self->{extensions} ) { - $self->load_extensions( - "$self->{prefix}/$self->{path}", $self - ); - } - - my @exts = @{$self->{extensions}}; - unless ( @exts ) { - @exts = $self->{admin}->load_all_extensions; - } - - my %seen; - foreach my $obj ( @exts ) { - while (my ($method, $glob) = each %{ref($obj) . '::'}) { - next unless $obj->can($method); - next if $method =~ /^_/; - next if $method eq uc($method); - $seen{$method}++; - } - } - - my $who = $self->_caller; - foreach my $name ( sort keys %seen ) { - local $^W; - *{"${who}::$name"} = sub { - ${"${who}::AUTOLOAD"} = "${who}::$name"; - goto &{"${who}::AUTOLOAD"}; - }; - } -} - -sub new { - my ($class, %args) = @_; - - delete $INC{'FindBin.pm'}; - { - # to suppress the redefine warning - local $SIG{__WARN__} = sub {}; - require FindBin; - } - - # ignore the prefix on extension modules built from top level. - my $base_path = Cwd::abs_path($FindBin::Bin); - unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { - delete $args{prefix}; - } - return $args{_self} if $args{_self}; - - $base_path = VMS::Filespec::unixify($base_path) if $^O eq 'VMS'; - - $args{dispatch} ||= 'Admin'; - $args{prefix} ||= 'inc'; - $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); - $args{bundle} ||= 'inc/BUNDLES'; - $args{base} ||= $base_path; - $class =~ s/^\Q$args{prefix}\E:://; - $args{name} ||= $class; - $args{version} ||= $class->VERSION; - unless ( $args{path} ) { - $args{path} = $args{name}; - $args{path} =~ s!::!/!g; - } - $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; - $args{wrote} = 0; - - bless( \%args, $class ); -} - -sub call { - my ($self, $method) = @_; - my $obj = $self->load($method) or return; - splice(@_, 0, 2, $obj); - goto &{$obj->can($method)}; -} - -sub load { - my ($self, $method) = @_; - - $self->load_extensions( - "$self->{prefix}/$self->{path}", $self - ) unless $self->{extensions}; - - foreach my $obj (@{$self->{extensions}}) { - return $obj if $obj->can($method); - } - - my $admin = $self->{admin} or die <<"END_DIE"; -The '$method' method does not exist in the '$self->{prefix}' path! -Please remove the '$self->{prefix}' directory and run $0 again to load it. -END_DIE - - my $obj = $admin->load($method, 1); - push @{$self->{extensions}}, $obj; - - $obj; -} - -sub load_extensions { - my ($self, $path, $top) = @_; - - my $should_reload = 0; - unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { - unshift @INC, $self->{prefix}; - $should_reload = 1; - } - - foreach my $rv ( $self->find_extensions($path) ) { - my ($file, $pkg) = @{$rv}; - next if $self->{pathnames}{$pkg}; - - local $@; - my $new = eval { local $^W; require $file; $pkg->can('new') }; - unless ( $new ) { - warn $@ if $@; - next; - } - $self->{pathnames}{$pkg} = - $should_reload ? delete $INC{$file} : $INC{$file}; - push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); - } - - $self->{extensions} ||= []; -} - -sub find_extensions { - my ($self, $path) = @_; - - my @found; - File::Find::find( {no_chdir => 1, wanted => sub { - my $file = $File::Find::name; - return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; - my $subpath = $1; - return if lc($subpath) eq lc($self->{dispatch}); - - $file = "$self->{path}/$subpath.pm"; - my $pkg = "$self->{name}::$subpath"; - $pkg =~ s!/!::!g; - - # If we have a mixed-case package name, assume case has been preserved - # correctly. Otherwise, root through the file to locate the case-preserved - # version of the package name. - if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { - my $content = Module::Install::_read($File::Find::name); - my $in_pod = 0; - foreach ( split /\n/, $content ) { - $in_pod = 1 if /^=\w/; - $in_pod = 0 if /^=cut/; - next if ($in_pod || /^=cut/); # skip pod text - next if /^\s*#/; # and comments - if ( m/^\s*package\s+($pkg)\s*;/i ) { - $pkg = $1; - last; - } - } - } - - push @found, [ $file, $pkg ]; - }}, $path ) if -d $path; - - @found; -} - - - - - -##################################################################### -# Common Utility Functions - -sub _caller { - my $depth = 0; - my $call = caller($depth); - while ( $call eq __PACKAGE__ ) { - $depth++; - $call = caller($depth); - } - return $call; -} - -sub _read { - local *FH; - open( FH, '<', $_[0] ) or die "open($_[0]): $!"; - binmode FH; - my $string = do { local $/; <FH> }; - close FH or die "close($_[0]): $!"; - return $string; -} - -sub _readperl { - my $string = Module::Install::_read($_[0]); - $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; - $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; - $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; - return $string; -} - -sub _readpod { - my $string = Module::Install::_read($_[0]); - $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; - return $string if $_[0] =~ /\.pod\z/; - $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; - $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; - $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; - $string =~ s/^\n+//s; - return $string; -} - -sub _write { - local *FH; - open( FH, '>', $_[0] ) or die "open($_[0]): $!"; - binmode FH; - foreach ( 1 .. $#_ ) { - print FH $_[$_] or die "print($_[0]): $!"; - } - close FH or die "close($_[0]): $!"; -} - -# _version is for processing module versions (eg, 1.03_05) not -# Perl versions (eg, 5.8.1). -sub _version { - my $s = shift || 0; - my $d =()= $s =~ /(\.)/g; - if ( $d >= 2 ) { - # Normalise multipart versions - $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; - } - $s =~ s/^(\d+)\.?//; - my $l = $1 || 0; - my @v = map { - $_ . '0' x (3 - length $_) - } $s =~ /(\d{1,3})\D?/g; - $l = $l . '.' . join '', @v if @v; - return $l + 0; -} - -sub _cmp { - _version($_[1]) <=> _version($_[2]); -} - -# Cloned from Params::Util::_CLASS -sub _CLASS { - ( - defined $_[0] - and - ! ref $_[0] - and - $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s - ) ? $_[0] : undef; -} - -1; - -# Copyright 2008 - 2012 Adam Kennedy. diff --git a/inc/Module/Install/Base.pm b/inc/Module/Install/Base.pm deleted file mode 100644 index 9fa42c2..0000000 --- a/inc/Module/Install/Base.pm +++ /dev/null @@ -1,83 +0,0 @@ -#line 1 -package Module::Install::Base; - -use strict 'vars'; -use vars qw{$VERSION}; -BEGIN { - $VERSION = '1.19'; -} - -# Suspend handler for "redefined" warnings -BEGIN { - my $w = $SIG{__WARN__}; - $SIG{__WARN__} = sub { $w }; -} - -#line 42 - -sub new { - my $class = shift; - unless ( defined &{"${class}::call"} ) { - *{"${class}::call"} = sub { shift->_top->call(@_) }; - } - unless ( defined &{"${class}::load"} ) { - *{"${class}::load"} = sub { shift->_top->load(@_) }; - } - bless { @_ }, $class; -} - -#line 61 - -sub AUTOLOAD { - local $@; - my $func = eval { shift->_top->autoload } or return; - goto &$func; -} - -#line 75 - -sub _top { - $_[0]->{_top}; -} - -#line 90 - -sub admin { - $_[0]->_top->{admin} - or - Module::Install::Base::FakeAdmin->new; -} - -#line 106 - -sub is_admin { - ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); -} - -sub DESTROY {} - -package Module::Install::Base::FakeAdmin; - -use vars qw{$VERSION}; -BEGIN { - $VERSION = $Module::Install::Base::VERSION; -} - -my $fake; - -sub new { - $fake ||= bless(\@_, $_[0]); -} - -sub AUTOLOAD {} - -sub DESTROY {} - -# Restore warning handler -BEGIN { - $SIG{__WARN__} = $SIG{__WARN__}->(); -} - -1; - -#line 159 diff --git a/inc/Module/Install/Can.pm b/inc/Module/Install/Can.pm deleted file mode 100644 index d65c753..0000000 --- a/inc/Module/Install/Can.pm +++ /dev/null @@ -1,163 +0,0 @@ -#line 1 -package Module::Install::Can; - -use strict; -use Config (); -use ExtUtils::MakeMaker (); -use Module::Install::Base (); - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = 'Module::Install::Base'; - $ISCORE = 1; -} - -# check if we can load some module -### Upgrade this to not have to load the module if possible -sub can_use { - my ($self, $mod, $ver) = @_; - $mod =~ s{::|\\}{/}g; - $mod .= '.pm' unless $mod =~ /\.pm$/i; - - my $pkg = $mod; - $pkg =~ s{/}{::}g; - $pkg =~ s{\.pm$}{}i; - - local $@; - eval { require $mod; $pkg->VERSION($ver || 0); 1 }; -} - -# Check if we can run some command -sub can_run { - my ($self, $cmd) = @_; - - my $_cmd = $cmd; - return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); - - for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { - next if $dir eq ''; - require File::Spec; - my $abs = File::Spec->catfile($dir, $cmd); - return $abs if (-x $abs or $abs = MM->maybe_command($abs)); - } - - return; -} - -# Can our C compiler environment build XS files -sub can_xs { - my $self = shift; - - # Ensure we have the CBuilder module - $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); - - # Do we have the configure_requires checker? - local $@; - eval "require ExtUtils::CBuilder;"; - if ( $@ ) { - # They don't obey configure_requires, so it is - # someone old and delicate. Try to avoid hurting - # them by falling back to an older simpler test. - return $self->can_cc(); - } - - # Do we have a working C compiler - my $builder = ExtUtils::CBuilder->new( - quiet => 1, - ); - unless ( $builder->have_compiler ) { - # No working C compiler - return 0; - } - - # Write a C file representative of what XS becomes - require File::Temp; - my ( $FH, $tmpfile ) = File::Temp::tempfile( - "compilexs-XXXXX", - SUFFIX => '.c', - ); - binmode $FH; - print $FH <<'END_C'; -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" - -int main(int argc, char **argv) { - return 0; -} - -int boot_sanexs() { - return 1; -} - -END_C - close $FH; - - # Can the C compiler access the same headers XS does - my @libs = (); - my $object = undef; - eval { - local $^W = 0; - $object = $builder->compile( - source => $tmpfile, - ); - @libs = $builder->link( - objects => $object, - module_name => 'sanexs', - ); - }; - my $result = $@ ? 0 : 1; - - # Clean up all the build files - foreach ( $tmpfile, $object, @libs ) { - next unless defined $_; - 1 while unlink; - } - - return $result; -} - -# Can we locate a (the) C compiler -sub can_cc { - my $self = shift; - - if ($^O eq 'VMS') { - require ExtUtils::CBuilder; - my $builder = ExtUtils::CBuilder->new( - quiet => 1, - ); - return $builder->have_compiler; - } - - my @chunks = split(/ /, $Config::Config{cc}) or return; - - # $Config{cc} may contain args; try to find out the program part - while (@chunks) { - return $self->can_run("@chunks") || (pop(@chunks), next); - } - - return; -} - -# Fix Cygwin bug on maybe_command(); -if ( $^O eq 'cygwin' ) { - require ExtUtils::MM_Cygwin; - require ExtUtils::MM_Win32; - if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { - *ExtUtils::MM_Cygwin::maybe_command = sub { - my ($self, $file) = @_; - if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { - ExtUtils::MM_Win32->maybe_command($file); - } else { - ExtUtils::MM_Unix->maybe_command($file); - } - } - } -} - -1; - -__END__ - -#line 245 diff --git a/inc/Module/Install/Fetch.pm b/inc/Module/Install/Fetch.pm deleted file mode 100644 index 3072b08..0000000 --- a/inc/Module/Install/Fetch.pm +++ /dev/null @@ -1,93 +0,0 @@ -#line 1 -package Module::Install::Fetch; - -use strict; -use Module::Install::Base (); - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = 'Module::Install::Base'; - $ISCORE = 1; -} - -sub get_file { - my ($self, %args) = @_; - my ($scheme, $host, $path, $file) = - $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; - - if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { - $args{url} = $args{ftp_url} - or (warn("LWP support unavailable!\n"), return); - ($scheme, $host, $path, $file) = - $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; - } - - $|++; - print "Fetching '$file' from $host... "; - - unless (eval { require Socket; Socket::inet_aton($host) }) { - warn "'$host' resolve failed!\n"; - return; - } - - return unless $scheme eq 'ftp' or $scheme eq 'http'; - - require Cwd; - my $dir = Cwd::getcwd(); - chdir $args{local_dir} or return if exists $args{local_dir}; - - if (eval { require LWP::Simple; 1 }) { - LWP::Simple::mirror($args{url}, $file); - } - elsif (eval { require Net::FTP; 1 }) { eval { - # use Net::FTP to get past firewall - my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); - $ftp->login("anonymous", 'anonymous@example.com'); - $ftp->cwd($path); - $ftp->binary; - $ftp->get($file) or (warn("$!\n"), return); - $ftp->quit; - } } - elsif (my $ftp = $self->can_run('ftp')) { eval { - # no Net::FTP, fallback to ftp.exe - require FileHandle; - my $fh = FileHandle->new; - - local $SIG{CHLD} = 'IGNORE'; - unless ($fh->open("|$ftp -n")) { - warn "Couldn't open ftp: $!\n"; - chdir $dir; return; - } - - my @dialog = split(/\n/, <<"END_FTP"); -open $host -user anonymous anonymous\@example.com -cd $path -binary -get $file $file -quit -END_FTP - foreach (@dialog) { $fh->print("$_\n") } - $fh->close; - } } - else { - warn "No working 'ftp' program available!\n"; - chdir $dir; return; - } - - unless (-f $file) { - warn "Fetching failed: $@\n"; - chdir $dir; return; - } - - return if exists $args{size} and -s $file != $args{size}; - system($args{run}) if exists $args{run}; - unlink($file) if $args{remove}; - - print(((!exists $args{check_for} or -e $args{check_for}) - ? "done!" : "failed! ($!)"), "\n"); - chdir $dir; return !$?; -} - -1; diff --git a/inc/Module/Install/Makefile.pm b/inc/Module/Install/Makefile.pm deleted file mode 100644 index 13a4464..0000000 --- a/inc/Module/Install/Makefile.pm +++ /dev/null @@ -1,418 +0,0 @@ -#line 1 -package Module::Install::Makefile; - -use strict 'vars'; -use ExtUtils::MakeMaker (); -use Module::Install::Base (); -use Fcntl qw/:flock :seek/; - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = 'Module::Install::Base'; - $ISCORE = 1; -} - -sub Makefile { $_[0] } - -my %seen = (); - -sub prompt { - shift; - - # Infinite loop protection - my @c = caller(); - if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { - die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; - } - - # In automated testing or non-interactive session, always use defaults - if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { - local $ENV{PERL_MM_USE_DEFAULT} = 1; - goto &ExtUtils::MakeMaker::prompt; - } else { - goto &ExtUtils::MakeMaker::prompt; - } -} - -# Store a cleaned up version of the MakeMaker version, -# since we need to behave differently in a variety of -# ways based on the MM version. -my $makemaker = eval $ExtUtils::MakeMaker::VERSION; - -# If we are passed a param, do a "newer than" comparison. -# Otherwise, just return the MakeMaker version. -sub makemaker { - ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 -} - -# Ripped from ExtUtils::MakeMaker 6.56, and slightly modified -# as we only need to know here whether the attribute is an array -# or a hash or something else (which may or may not be appendable). -my %makemaker_argtype = ( - C => 'ARRAY', - CONFIG => 'ARRAY', -# CONFIGURE => 'CODE', # ignore - DIR => 'ARRAY', - DL_FUNCS => 'HASH', - DL_VARS => 'ARRAY', - EXCLUDE_EXT => 'ARRAY', - EXE_FILES => 'ARRAY', - FUNCLIST => 'ARRAY', - H => 'ARRAY', - IMPORTS => 'HASH', - INCLUDE_EXT => 'ARRAY', - LIBS => 'ARRAY', # ignore '' - MAN1PODS => 'HASH', - MAN3PODS => 'HASH', - META_ADD => 'HASH', - META_MERGE => 'HASH', - PL_FILES => 'HASH', - PM => 'HASH', - PMLIBDIRS => 'ARRAY', - PMLIBPARENTDIRS => 'ARRAY', - PREREQ_PM => 'HASH', - CONFIGURE_REQUIRES => 'HASH', - SKIP => 'ARRAY', - TYPEMAPS => 'ARRAY', - XS => 'HASH', -# VERSION => ['version',''], # ignore -# _KEEP_AFTER_FLUSH => '', - - clean => 'HASH', - depend => 'HASH', - dist => 'HASH', - dynamic_lib=> 'HASH', - linkext => 'HASH', - macro => 'HASH', - postamble => 'HASH', - realclean => 'HASH', - test => 'HASH', - tool_autosplit => 'HASH', - - # special cases where you can use makemaker_append - CCFLAGS => 'APPENDABLE', - DEFINE => 'APPENDABLE', - INC => 'APPENDABLE', - LDDLFLAGS => 'APPENDABLE', - LDFROM => 'APPENDABLE', -); - -sub makemaker_args { - my ($self, %new_args) = @_; - my $args = ( $self->{makemaker_args} ||= {} ); - foreach my $key (keys %new_args) { - if ($makemaker_argtype{$key}) { - if ($makemaker_argtype{$key} eq 'ARRAY') { - $args->{$key} = [] unless defined $args->{$key}; - unless (ref $args->{$key} eq 'ARRAY') { - $args->{$key} = [$args->{$key}] - } - push @{$args->{$key}}, - ref $new_args{$key} eq 'ARRAY' - ? @{$new_args{$key}} - : $new_args{$key}; - } - elsif ($makemaker_argtype{$key} eq 'HASH') { - $args->{$key} = {} unless defined $args->{$key}; - foreach my $skey (keys %{ $new_args{$key} }) { - $args->{$key}{$skey} = $new_args{$key}{$skey}; - } - } - elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { - $self->makemaker_append($key => $new_args{$key}); - } - } - else { - if (defined $args->{$key}) { - warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; - } - $args->{$key} = $new_args{$key}; - } - } - return $args; -} - -# For mm args that take multiple space-separated args, -# append an argument to the current list. -sub makemaker_append { - my $self = shift; - my $name = shift; - my $args = $self->makemaker_args; - $args->{$name} = defined $args->{$name} - ? join( ' ', $args->{$name}, @_ ) - : join( ' ', @_ ); -} - -sub build_subdirs { - my $self = shift; - my $subdirs = $self->makemaker_args->{DIR} ||= []; - for my $subdir (@_) { - push @$subdirs, $subdir; - } -} - -sub clean_files { - my $self = shift; - my $clean = $self->makemaker_args->{clean} ||= {}; - %$clean = ( - %$clean, - FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), - ); -} - -sub realclean_files { - my $self = shift; - my $realclean = $self->makemaker_args->{realclean} ||= {}; - %$realclean = ( - %$realclean, - FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), - ); -} - -sub libs { - my $self = shift; - my $libs = ref $_[0] ? shift : [ shift ]; - $self->makemaker_args( LIBS => $libs ); -} - -sub inc { - my $self = shift; - $self->makemaker_args( INC => shift ); -} - -sub _wanted_t { -} - -sub tests_recursive { - my $self = shift; - my $dir = shift || 't'; - unless ( -d $dir ) { - die "tests_recursive dir '$dir' does not exist"; - } - my %tests = map { $_ => 1 } split / /, ($self->tests || ''); - require File::Find; - File::Find::find( - sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, - $dir - ); - $self->tests( join ' ', sort keys %tests ); -} - -sub write { - my $self = shift; - die "&Makefile->write() takes no arguments\n" if @_; - - # Check the current Perl version - my $perl_version = $self->perl_version; - if ( $perl_version ) { - eval "use $perl_version; 1" - or die "ERROR: perl: Version $] is installed, " - . "but we need version >= $perl_version"; - } - - # Make sure we have a new enough MakeMaker - require ExtUtils::MakeMaker; - - if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { - # This previous attempted to inherit the version of - # ExtUtils::MakeMaker in use by the module author, but this - # was found to be untenable as some authors build releases - # using future dev versions of EU:MM that nobody else has. - # Instead, #toolchain suggests we use 6.59 which is the most - # stable version on CPAN at time of writing and is, to quote - # ribasushi, "not terminally fucked, > and tested enough". - # TODO: We will now need to maintain this over time to push - # the version up as new versions are released. - $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); - $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); - } else { - # Allow legacy-compatibility with 5.005 by depending on the - # most recent EU:MM that supported 5.005. - $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); - $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); - } - - # Generate the MakeMaker params - my $args = $self->makemaker_args; - $args->{DISTNAME} = $self->name; - $args->{NAME} = $self->module_name || $self->name; - $args->{NAME} =~ s/-/::/g; - $args->{VERSION} = $self->version or die <<'EOT'; -ERROR: Can't determine distribution version. Please specify it -explicitly via 'version' in Makefile.PL, or set a valid $VERSION -in a module, and provide its file path via 'version_from' (or -'all_from' if you prefer) in Makefile.PL. -EOT - - if ( $self->tests ) { - my @tests = split ' ', $self->tests; - my %seen; - $args->{test} = { - TESTS => (join ' ', grep {!$seen{$_}++} @tests), - }; - } elsif ( $Module::Install::ExtraTests::use_extratests ) { - # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. - # So, just ignore our xt tests here. - } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { - $args->{test} = { - TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), - }; - } - if ( $] >= 5.005 ) { - $args->{ABSTRACT} = $self->abstract; - $args->{AUTHOR} = join ', ', @{$self->author || []}; - } - if ( $self->makemaker(6.10) ) { - $args->{NO_META} = 1; - #$args->{NO_MYMETA} = 1; - } - if ( $self->makemaker(6.17) and $self->sign ) { - $args->{SIGN} = 1; - } - unless ( $self->is_admin ) { - delete $args->{SIGN}; - } - if ( $self->makemaker(6.31) and $self->license ) { - $args->{LICENSE} = $self->license; - } - - my $prereq = ($args->{PREREQ_PM} ||= {}); - %$prereq = ( %$prereq, - map { @$_ } # flatten [module => version] - map { @$_ } - grep $_, - ($self->requires) - ); - - # Remove any reference to perl, PREREQ_PM doesn't support it - delete $args->{PREREQ_PM}->{perl}; - - # Merge both kinds of requires into BUILD_REQUIRES - my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); - %$build_prereq = ( %$build_prereq, - map { @$_ } # flatten [module => version] - map { @$_ } - grep $_, - ($self->configure_requires, $self->build_requires) - ); - - # Remove any reference to perl, BUILD_REQUIRES doesn't support it - delete $args->{BUILD_REQUIRES}->{perl}; - - # Delete bundled dists from prereq_pm, add it to Makefile DIR - my $subdirs = ($args->{DIR} || []); - if ($self->bundles) { - my %processed; - foreach my $bundle (@{ $self->bundles }) { - my ($mod_name, $dist_dir) = @$bundle; - delete $prereq->{$mod_name}; - $dist_dir = File::Basename::basename($dist_dir); # dir for building this module - if (not exists $processed{$dist_dir}) { - if (-d $dist_dir) { - # List as sub-directory to be processed by make - push @$subdirs, $dist_dir; - } - # Else do nothing: the module is already present on the system - $processed{$dist_dir} = undef; - } - } - } - - unless ( $self->makemaker('6.55_03') ) { - %$prereq = (%$prereq,%$build_prereq); - delete $args->{BUILD_REQUIRES}; - } - - if ( my $perl_version = $self->perl_version ) { - eval "use $perl_version; 1" - or die "ERROR: perl: Version $] is installed, " - . "but we need version >= $perl_version"; - - if ( $self->makemaker(6.48) ) { - $args->{MIN_PERL_VERSION} = $perl_version; - } - } - - if ($self->installdirs) { - warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; - $args->{INSTALLDIRS} = $self->installdirs; - } - - my %args = map { - ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) - } keys %$args; - - my $user_preop = delete $args{dist}->{PREOP}; - if ( my $preop = $self->admin->preop($user_preop) ) { - foreach my $key ( keys %$preop ) { - $args{dist}->{$key} = $preop->{$key}; - } - } - - my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); - $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); -} - -sub fix_up_makefile { - my $self = shift; - my $makefile_name = shift; - my $top_class = ref($self->_top) || ''; - my $top_version = $self->_top->VERSION || ''; - - my $preamble = $self->preamble - ? "# Preamble by $top_class $top_version\n" - . $self->preamble - : ''; - my $postamble = "# Postamble by $top_class $top_version\n" - . ($self->postamble || ''); - - local *MAKEFILE; - open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; - eval { flock MAKEFILE, LOCK_EX }; - my $makefile = do { local $/; <MAKEFILE> }; - - $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; - $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; - $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; - $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; - $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; - - # Module::Install will never be used to build the Core Perl - # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks - # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist - $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; - #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; - - # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. - $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; - - # XXX - This is currently unused; not sure if it breaks other MM-users - # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; - - seek MAKEFILE, 0, SEEK_SET; - truncate MAKEFILE, 0; - print MAKEFILE "$preamble$makefile$postamble" or die $!; - close MAKEFILE or die $!; - - 1; -} - -sub preamble { - my ($self, $text) = @_; - $self->{preamble} = $text . $self->{preamble} if defined $text; - $self->{preamble}; -} - -sub postamble { - my ($self, $text) = @_; - $self->{postamble} ||= $self->admin->postamble; - $self->{postamble} .= $text if defined $text; - $self->{postamble} -} - -1; - -__END__ - -#line 544 diff --git a/inc/Module/Install/Metadata.pm b/inc/Module/Install/Metadata.pm deleted file mode 100644 index 11bf971..0000000 --- a/inc/Module/Install/Metadata.pm +++ /dev/null @@ -1,722 +0,0 @@ -#line 1 -package Module::Install::Metadata; - -use strict 'vars'; -use Module::Install::Base (); - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = 'Module::Install::Base'; - $ISCORE = 1; -} - -my @boolean_keys = qw{ - sign -}; - -my @scalar_keys = qw{ - name - module_name - abstract - version - distribution_type - tests - installdirs -}; - -my @tuple_keys = qw{ - configure_requires - build_requires - requires - recommends - bundles - resources -}; - -my @resource_keys = qw{ - homepage - bugtracker - repository -}; - -my @array_keys = qw{ - keywords - author -}; - -*authors = \&author; - -sub Meta { shift } -sub Meta_BooleanKeys { @boolean_keys } -sub Meta_ScalarKeys { @scalar_keys } -sub Meta_TupleKeys { @tuple_keys } -sub Meta_ResourceKeys { @resource_keys } -sub Meta_ArrayKeys { @array_keys } - -foreach my $key ( @boolean_keys ) { - *$key = sub { - my $self = shift; - if ( defined wantarray and not @_ ) { - return $self->{values}->{$key}; - } - $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); - return $self; - }; -} - -foreach my $key ( @scalar_keys ) { - *$key = sub { - my $self = shift; - return $self->{values}->{$key} if defined wantarray and !@_; - $self->{values}->{$key} = shift; - return $self; - }; -} - -foreach my $key ( @array_keys ) { - *$key = sub { - my $self = shift; - return $self->{values}->{$key} if defined wantarray and !@_; - $self->{values}->{$key} ||= []; - push @{$self->{values}->{$key}}, @_; - return $self; - }; -} - -foreach my $key ( @resource_keys ) { - *$key = sub { - my $self = shift; - unless ( @_ ) { - return () unless $self->{values}->{resources}; - return map { $_->[1] } - grep { $_->[0] eq $key } - @{ $self->{values}->{resources} }; - } - return $self->{values}->{resources}->{$key} unless @_; - my $uri = shift or die( - "Did not provide a value to $key()" - ); - $self->resources( $key => $uri ); - return 1; - }; -} - -foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { - *$key = sub { - my $self = shift; - return $self->{values}->{$key} unless @_; - my @added; - while ( @_ ) { - my $module = shift or last; - my $version = shift || 0; - push @added, [ $module, $version ]; - } - push @{ $self->{values}->{$key} }, @added; - return map {@$_} @added; - }; -} - -# Resource handling -my %lc_resource = map { $_ => 1 } qw{ - homepage - license - bugtracker - repository -}; - -sub resources { - my $self = shift; - while ( @_ ) { - my $name = shift or last; - my $value = shift or next; - if ( $name eq lc $name and ! $lc_resource{$name} ) { - die("Unsupported reserved lowercase resource '$name'"); - } - $self->{values}->{resources} ||= []; - push @{ $self->{values}->{resources} }, [ $name, $value ]; - } - $self->{values}->{resources}; -} - -# Aliases for build_requires that will have alternative -# meanings in some future version of META.yml. -sub test_requires { shift->build_requires(@_) } -sub install_requires { shift->build_requires(@_) } - -# Aliases for installdirs options -sub install_as_core { $_[0]->installdirs('perl') } -sub install_as_cpan { $_[0]->installdirs('site') } -sub install_as_site { $_[0]->installdirs('site') } -sub install_as_vendor { $_[0]->installdirs('vendor') } - -sub dynamic_config { - my $self = shift; - my $value = @_ ? shift : 1; - if ( $self->{values}->{dynamic_config} ) { - # Once dynamic we never change to static, for safety - return 0; - } - $self->{values}->{dynamic_config} = $value ? 1 : 0; - return 1; -} - -# Convenience command -sub static_config { - shift->dynamic_config(0); -} - -sub perl_version { - my $self = shift; - return $self->{values}->{perl_version} unless @_; - my $version = shift or die( - "Did not provide a value to perl_version()" - ); - - # Normalize the version - $version = $self->_perl_version($version); - - # We don't support the really old versions - unless ( $version >= 5.005 ) { - die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; - } - - $self->{values}->{perl_version} = $version; -} - -sub all_from { - my ( $self, $file ) = @_; - - unless ( defined($file) ) { - my $name = $self->name or die( - "all_from called with no args without setting name() first" - ); - $file = join('/', 'lib', split(/-/, $name)) . '.pm'; - $file =~ s{.*/}{} unless -e $file; - unless ( -e $file ) { - die("all_from cannot find $file from $name"); - } - } - unless ( -f $file ) { - die("The path '$file' does not exist, or is not a file"); - } - - $self->{values}{all_from} = $file; - - # Some methods pull from POD instead of code. - # If there is a matching .pod, use that instead - my $pod = $file; - $pod =~ s/\.pm$/.pod/i; - $pod = $file unless -e $pod; - - # Pull the different values - $self->name_from($file) unless $self->name; - $self->version_from($file) unless $self->version; - $self->perl_version_from($file) unless $self->perl_version; - $self->author_from($pod) unless @{$self->author || []}; - $self->license_from($pod) unless $self->license; - $self->abstract_from($pod) unless $self->abstract; - - return 1; -} - -sub provides { - my $self = shift; - my $provides = ( $self->{values}->{provides} ||= {} ); - %$provides = (%$provides, @_) if @_; - return $provides; -} - -sub auto_provides { - my $self = shift; - return $self unless $self->is_admin; - unless (-e 'MANIFEST') { - warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; - return $self; - } - # Avoid spurious warnings as we are not checking manifest here. - local $SIG{__WARN__} = sub {1}; - require ExtUtils::Manifest; - local *ExtUtils::Manifest::manicheck = sub { return }; - - require Module::Build; - my $build = Module::Build->new( - dist_name => $self->name, - dist_version => $self->version, - license => $self->license, - ); - $self->provides( %{ $build->find_dist_packages || {} } ); -} - -sub feature { - my $self = shift; - my $name = shift; - my $features = ( $self->{values}->{features} ||= [] ); - my $mods; - - if ( @_ == 1 and ref( $_[0] ) ) { - # The user used ->feature like ->features by passing in the second - # argument as a reference. Accomodate for that. - $mods = $_[0]; - } else { - $mods = \@_; - } - - my $count = 0; - push @$features, ( - $name => [ - map { - ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ - } @$mods - ] - ); - - return @$features; -} - -sub features { - my $self = shift; - while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { - $self->feature( $name, @$mods ); - } - return $self->{values}->{features} - ? @{ $self->{values}->{features} } - : (); -} - -sub no_index { - my $self = shift; - my $type = shift; - push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; - return $self->{values}->{no_index}; -} - -sub read { - my $self = shift; - $self->include_deps( 'YAML::Tiny', 0 ); - - require YAML::Tiny; - my $data = YAML::Tiny::LoadFile('META.yml'); - - # Call methods explicitly in case user has already set some values. - while ( my ( $key, $value ) = each %$data ) { - next unless $self->can($key); - if ( ref $value eq 'HASH' ) { - while ( my ( $module, $version ) = each %$value ) { - $self->can($key)->($self, $module => $version ); - } - } else { - $self->can($key)->($self, $value); - } - } - return $self; -} - -sub write { - my $self = shift; - return $self unless $self->is_admin; - $self->admin->write_meta; - return $self; -} - -sub version_from { - require ExtUtils::MM_Unix; - my ( $self, $file ) = @_; - $self->version( ExtUtils::MM_Unix->parse_version($file) ); - - # for version integrity check - $self->makemaker_args( VERSION_FROM => $file ); -} - -sub abstract_from { - require ExtUtils::MM_Unix; - my ( $self, $file ) = @_; - $self->abstract( - bless( - { DISTNAME => $self->name }, - 'ExtUtils::MM_Unix' - )->parse_abstract($file) - ); -} - -# Add both distribution and module name -sub name_from { - my ($self, $file) = @_; - if ( - Module::Install::_read($file) =~ m/ - ^ \s* - package \s* - ([\w:]+) - [\s|;]* - /ixms - ) { - my ($name, $module_name) = ($1, $1); - $name =~ s{::}{-}g; - $self->name($name); - unless ( $self->module_name ) { - $self->module_name($module_name); - } - } else { - die("Cannot determine name from $file\n"); - } -} - -sub _extract_perl_version { - if ( - $_[0] =~ m/ - ^\s* - (?:use|require) \s* - v? - ([\d_\.]+) - \s* ; - /ixms - ) { - my $perl_version = $1; - $perl_version =~ s{_}{}g; - return $perl_version; - } else { - return; - } -} - -sub perl_version_from { - my $self = shift; - my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); - if ($perl_version) { - $self->perl_version($perl_version); - } else { - warn "Cannot determine perl version info from $_[0]\n"; - return; - } -} - -sub author_from { - my $self = shift; - my $content = Module::Install::_read($_[0]); - if ($content =~ m/ - =head \d \s+ (?:authors?)\b \s* - ([^\n]*) - | - =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* - .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* - ([^\n]*) - /ixms) { - my $author = $1 || $2; - - # XXX: ugly but should work anyway... - if (eval "require Pod::Escapes; 1") { - # Pod::Escapes has a mapping table. - # It's in core of perl >= 5.9.3, and should be installed - # as one of the Pod::Simple's prereqs, which is a prereq - # of Pod::Text 3.x (see also below). - $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } - { - defined $2 - ? chr($2) - : defined $Pod::Escapes::Name2character_number{$1} - ? chr($Pod::Escapes::Name2character_number{$1}) - : do { - warn "Unknown escape: E<$1>"; - "E<$1>"; - }; - }gex; - } - elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { - # Pod::Text < 3.0 has yet another mapping table, - # though the table name of 2.x and 1.x are different. - # (1.x is in core of Perl < 5.6, 2.x is in core of - # Perl < 5.9.3) - my $mapping = ($Pod::Text::VERSION < 2) - ? \%Pod::Text::HTML_Escapes - : \%Pod::Text::ESCAPES; - $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } - { - defined $2 - ? chr($2) - : defined $mapping->{$1} - ? $mapping->{$1} - : do { - warn "Unknown escape: E<$1>"; - "E<$1>"; - }; - }gex; - } - else { - $author =~ s{E<lt>}{<}g; - $author =~ s{E<gt>}{>}g; - } - $self->author($author); - } else { - warn "Cannot determine author info from $_[0]\n"; - } -} - -#Stolen from M::B -my %license_urls = ( - perl => 'http://dev.perl.org/licenses/', - apache => 'http://apache.org/licenses/LICENSE-2.0', - apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', - artistic => 'http://opensource.org/licenses/artistic-license.php', - artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', - lgpl => 'http://opensource.org/licenses/lgpl-license.php', - lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', - lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', - bsd => 'http://opensource.org/licenses/bsd-license.php', - gpl => 'http://opensource.org/licenses/gpl-license.php', - gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', - gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', - mit => 'http://opensource.org/licenses/mit-license.php', - mozilla => 'http://opensource.org/licenses/mozilla1.1.php', - open_source => undef, - unrestricted => undef, - restrictive => undef, - unknown => undef, -); - -sub license { - my $self = shift; - return $self->{values}->{license} unless @_; - my $license = shift or die( - 'Did not provide a value to license()' - ); - $license = __extract_license($license) || lc $license; - $self->{values}->{license} = $license; - - # Automatically fill in license URLs - if ( $license_urls{$license} ) { - $self->resources( license => $license_urls{$license} ); - } - - return 1; -} - -sub _extract_license { - my $pod = shift; - my $matched; - return __extract_license( - ($matched) = $pod =~ m/ - (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) - (=head \d.*|=cut.*|)\z - /xms - ) || __extract_license( - ($matched) = $pod =~ m/ - (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) - (=head \d.*|=cut.*|)\z - /xms - ); -} - -sub __extract_license { - my $license_text = shift or return; - my @phrases = ( - '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, - '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, - 'Artistic and GPL' => 'perl', 1, - 'GNU general public license' => 'gpl', 1, - 'GNU public license' => 'gpl', 1, - 'GNU lesser general public license' => 'lgpl', 1, - 'GNU lesser public license' => 'lgpl', 1, - 'GNU library general public license' => 'lgpl', 1, - 'GNU library public license' => 'lgpl', 1, - 'GNU Free Documentation license' => 'unrestricted', 1, - 'GNU Affero General Public License' => 'open_source', 1, - '(?:Free)?BSD license' => 'bsd', 1, - 'Artistic license 2\.0' => 'artistic_2', 1, - 'Artistic license' => 'artistic', 1, - 'Apache (?:Software )?license' => 'apache', 1, - 'GPL' => 'gpl', 1, - 'LGPL' => 'lgpl', 1, - 'BSD' => 'bsd', 1, - 'Artistic' => 'artistic', 1, - 'MIT' => 'mit', 1, - 'Mozilla Public License' => 'mozilla', 1, - 'Q Public License' => 'open_source', 1, - 'OpenSSL License' => 'unrestricted', 1, - 'SSLeay License' => 'unrestricted', 1, - 'zlib License' => 'open_source', 1, - 'proprietary' => 'proprietary', 0, - ); - while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { - $pattern =~ s#\s+#\\s+#gs; - if ( $license_text =~ /\b$pattern\b/i ) { - return $license; - } - } - return ''; -} - -sub license_from { - my $self = shift; - if (my $license=_extract_license(Module::Install::_read($_[0]))) { - $self->license($license); - } else { - warn "Cannot determine license info from $_[0]\n"; - return 'unknown'; - } -} - -sub _extract_bugtracker { - my @links = $_[0] =~ m#L<( - https?\Q://rt.cpan.org/\E[^>]+| - https?\Q://github.com/\E[\w_]+/[\w_]+/issues| - https?\Q://code.google.com/p/\E[\w_\-]+/issues/list - )>#gx; - my %links; - @links{@links}=(); - @links=keys %links; - return @links; -} - -sub bugtracker_from { - my $self = shift; - my $content = Module::Install::_read($_[0]); - my @links = _extract_bugtracker($content); - unless ( @links ) { - warn "Cannot determine bugtracker info from $_[0]\n"; - return 0; - } - if ( @links > 1 ) { - warn "Found more than one bugtracker link in $_[0]\n"; - return 0; - } - - # Set the bugtracker - bugtracker( $links[0] ); - return 1; -} - -sub requires_from { - my $self = shift; - my $content = Module::Install::_readperl($_[0]); - my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; - while ( @requires ) { - my $module = shift @requires; - my $version = shift @requires; - $self->requires( $module => $version ); - } -} - -sub test_requires_from { - my $self = shift; - my $content = Module::Install::_readperl($_[0]); - my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; - while ( @requires ) { - my $module = shift @requires; - my $version = shift @requires; - $self->test_requires( $module => $version ); - } -} - -# Convert triple-part versions (eg, 5.6.1 or 5.8.9) to -# numbers (eg, 5.006001 or 5.008009). -# Also, convert double-part versions (eg, 5.8) -sub _perl_version { - my $v = $_[-1]; - $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; - $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; - $v =~ s/(\.\d\d\d)000$/$1/; - $v =~ s/_.+$//; - if ( ref($v) ) { - # Numify - $v = $v + 0; - } - return $v; -} - -sub add_metadata { - my $self = shift; - my %hash = @_; - for my $key (keys %hash) { - warn "add_metadata: $key is not prefixed with 'x_'.\n" . - "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; - $self->{values}->{$key} = $hash{$key}; - } -} - - -###################################################################### -# MYMETA Support - -sub WriteMyMeta { - die "WriteMyMeta has been deprecated"; -} - -sub write_mymeta_yaml { - my $self = shift; - - # We need YAML::Tiny to write the MYMETA.yml file - unless ( eval { require YAML::Tiny; 1; } ) { - return 1; - } - - # Generate the data - my $meta = $self->_write_mymeta_data or return 1; - - # Save as the MYMETA.yml file - print "Writing MYMETA.yml\n"; - YAML::Tiny::DumpFile('MYMETA.yml', $meta); -} - -sub write_mymeta_json { - my $self = shift; - - # We need JSON to write the MYMETA.json file - unless ( eval { require JSON; 1; } ) { - return 1; - } - - # Generate the data - my $meta = $self->_write_mymeta_data or return 1; - - # Save as the MYMETA.yml file - print "Writing MYMETA.json\n"; - Module::Install::_write( - 'MYMETA.json', - JSON->new->pretty(1)->canonical->encode($meta), - ); -} - -sub _write_mymeta_data { - my $self = shift; - - # If there's no existing META.yml there is nothing we can do - return undef unless -f 'META.yml'; - - # We need Parse::CPAN::Meta to load the file - unless ( eval { require Parse::CPAN::Meta; 1; } ) { - return undef; - } - - # Merge the perl version into the dependencies - my $val = $self->Meta->{values}; - my $perl = delete $val->{perl_version}; - if ( $perl ) { - $val->{requires} ||= []; - my $requires = $val->{requires}; - - # Canonize to three-dot version after Perl 5.6 - if ( $perl >= 5.006 ) { - $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e - } - unshift @$requires, [ perl => $perl ]; - } - - # Load the advisory META.yml file - my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); - my $meta = $yaml[0]; - - # Overwrite the non-configure dependency hashes - delete $meta->{requires}; - delete $meta->{build_requires}; - delete $meta->{recommends}; - if ( exists $val->{requires} ) { - $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; - } - if ( exists $val->{build_requires} ) { - $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; - } - - return $meta; -} - -1; diff --git a/inc/Module/Install/Win32.pm b/inc/Module/Install/Win32.pm deleted file mode 100644 index f7aa615..0000000 --- a/inc/Module/Install/Win32.pm +++ /dev/null @@ -1,64 +0,0 @@ -#line 1 -package Module::Install::Win32; - -use strict; -use Module::Install::Base (); - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = 'Module::Install::Base'; - $ISCORE = 1; -} - -# determine if the user needs nmake, and download it if needed -sub check_nmake { - my $self = shift; - $self->load('can_run'); - $self->load('get_file'); - - require Config; - return unless ( - $^O eq 'MSWin32' and - $Config::Config{make} and - $Config::Config{make} =~ /^nmake\b/i and - ! $self->can_run('nmake') - ); - - print "The required 'nmake' executable not found, fetching it...\n"; - - require File::Basename; - my $rv = $self->get_file( - url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', - ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', - local_dir => File::Basename::dirname($^X), - size => 51928, - run => 'Nmake15.exe /o > nul', - check_for => 'Nmake.exe', - remove => 1, - ); - - die <<'END_MESSAGE' unless $rv; - -------------------------------------------------------------------------------- - -Since you are using Microsoft Windows, you will need the 'nmake' utility -before installation. It's available at: - - http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe - or - ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe - -Please download the file manually, save it to a directory in %PATH% (e.g. -C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to -that directory, and run "Nmake15.exe" from there; that will create the -'nmake.exe' file needed by this module. - -You may then resume the installation process described in README. - -------------------------------------------------------------------------------- -END_MESSAGE - -} - -1; diff --git a/inc/Module/Install/WriteAll.pm b/inc/Module/Install/WriteAll.pm deleted file mode 100644 index 2db861a..0000000 --- a/inc/Module/Install/WriteAll.pm +++ /dev/null @@ -1,63 +0,0 @@ -#line 1 -package Module::Install::WriteAll; - -use strict; -use Module::Install::Base (); - -use vars qw{$VERSION @ISA $ISCORE}; -BEGIN { - $VERSION = '1.19'; - @ISA = qw{Module::Install::Base}; - $ISCORE = 1; -} - -sub WriteAll { - my $self = shift; - my %args = ( - meta => 1, - sign => 0, - inline => 0, - check_nmake => 1, - @_, - ); - - $self->sign(1) if $args{sign}; - $self->admin->WriteAll(%args) if $self->is_admin; - - $self->check_nmake if $args{check_nmake}; - unless ( $self->makemaker_args->{PL_FILES} ) { - # XXX: This still may be a bit over-defensive... - unless ($self->makemaker(6.25)) { - $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; - } - } - - # Until ExtUtils::MakeMaker support MYMETA.yml, make sure - # we clean it up properly ourself. - $self->realclean_files('MYMETA.yml'); - - if ( $args{inline} ) { - $self->Inline->write; - } else { - $self->Makefile->write; - } - - # The Makefile write process adds a couple of dependencies, - # so write the META.yml files after the Makefile. - if ( $args{meta} ) { - $self->Meta->write; - } - - # Experimental support for MYMETA - if ( $ENV{X_MYMETA} ) { - if ( $ENV{X_MYMETA} eq 'JSON' ) { - $self->Meta->write_mymeta_json; - } else { - $self->Meta->write_mymeta_yaml; - } - } - - return 1; -} - -1; diff --git a/inc/Module/Install/XSUtil.pm b/inc/Module/Install/XSUtil.pm deleted file mode 100644 index b11e6ef..0000000 --- a/inc/Module/Install/XSUtil.pm +++ /dev/null @@ -1,819 +0,0 @@ -#line 1 -package Module::Install::XSUtil; - -use 5.005_03; - -$VERSION = '0.45'; - -use Module::Install::Base; -@ISA = qw(Module::Install::Base); - -use strict; - -use Config; - -use File::Spec; -use File::Find; - -use constant _VERBOSE => $ENV{MI_VERBOSE} ? 1 : 0; - -my %ConfigureRequires = ( - 'ExtUtils::ParseXS' => 3.18, # shipped with Perl 5.18.0 -); - -my %BuildRequires = ( -); - -my %Requires = ( - 'XSLoader' => 0.02, -); - -my %ToInstall; - -my $UseC99 = 0; -my $UseCplusplus = 0; - -sub _verbose{ - print STDERR q{# }, @_, "\n"; -} - -sub _xs_debugging{ - return $ENV{XS_DEBUG} || scalar( grep{ $_ eq '-g' } @ARGV ); -} - -sub _xs_initialize{ - my($self) = @_; - - unless($self->{xsu_initialized}){ - $self->{xsu_initialized} = 1; - - if(!$self->cc_available()){ - warn "This distribution requires a C compiler, but it's not available, stopped.\n"; - exit; - } - - $self->configure_requires(%ConfigureRequires); - $self->build_requires(%BuildRequires); - $self->requires(%Requires); - - $self->makemaker_args->{OBJECT} = '$(O_FILES)'; - $self->clean_files('$(O_FILES)'); - $self->clean_files('*.stackdump') if $^O eq 'cygwin'; - - if($self->_xs_debugging()){ - # override $Config{optimize} - if(_is_msvc()){ - $self->makemaker_args->{OPTIMIZE} = '-Zi'; - } - else{ - $self->makemaker_args->{OPTIMIZE} = '-g -ggdb -g3'; - } - $self->cc_define('-DXS_ASSERT'); - } - } - return; -} - -# GNU C Compiler -sub _is_gcc{ - return $Config{gccversion}; -} - -# Microsoft Visual C++ Compiler (cl.exe) -sub _is_msvc{ - return $Config{cc} =~ /\A cl \b /xmsi; -} - -{ - my $cc_available; - - sub cc_available { - return defined $cc_available ? - $cc_available : - ($cc_available = shift->can_cc()) - ; - } - - # cf. https://github.com/sjn/toolchain-site/blob/219db464af9b2f19b04fec05547ac10180a469f3/lancaster-consensus.md - my $want_xs; - sub want_xs { - my($self, $default) = @_; - return $want_xs if defined $want_xs; - - # you're using this module, you must want XS by default - # unless PERL_ONLY is true. - $default = !$ENV{PERL_ONLY} if not defined $default; - - foreach my $arg(@ARGV){ - - my ($k, $v) = split '=', $arg; # MM-style named args - if ($k eq 'PUREPERL_ONLY' && defined $v) { - return $want_xs = !$v; - } - elsif($arg eq '--pp'){ # old-style - return $want_xs = 0; - } - elsif($arg eq '--xs'){ - return $want_xs = 1; - } - } - - if ($ENV{PERL_MM_OPT}) { - my($v) = $ENV{PERL_MM_OPT} =~ /\b PUREPERL_ONLY = (\S+) /xms; - if (defined $v) { - return $want_xs = !$v; - } - } - - return $want_xs = $default; - } -} - -sub use_ppport{ - my($self, $dppp_version) = @_; - return if $self->{_ppport_ok}++; - - $self->_xs_initialize(); - - my $filename = 'ppport.h'; - - $dppp_version ||= 3.19; # the more, the better - $self->configure_requires('Devel::PPPort' => $dppp_version); - $self->build_requires('Devel::PPPort' => $dppp_version); - - print "Writing $filename\n"; - - my $e = do{ - local $@; - eval qq{ - use Devel::PPPort; - Devel::PPPort::WriteFile(q{$filename}); - }; - $@; - }; - if($e){ - print "Cannot create $filename because: $@\n"; - } - - if(-e $filename){ - $self->clean_files($filename); - $self->cc_define('-DUSE_PPPORT'); - $self->cc_append_to_inc('.'); - } - return; -} - -sub use_xshelper { - my($self, $opt) = @_; - $self->_xs_initialize(); - $self->use_ppport(); - - my $file = 'xshelper.h'; - open my $fh, '>', $file or die "Cannot open $file for writing: $!"; - print $fh $self->_xshelper_h(); - close $fh or die "Cannot close $file: $!"; - if(defined $opt) { - if($opt eq '-clean') { - $self->clean_files($file); - } - else { - $self->realclean_files($file); - } - } - return; -} - -sub _gccversion { - my $res = `$Config{cc} --version`; - my ($version) = $res =~ /\(GCC\) ([0-9.]+)/; - no warnings 'numeric', 'uninitialized'; - return sprintf '%g', $version; -} - -sub cc_warnings{ - my($self) = @_; - - $self->_xs_initialize(); - - if(_is_gcc()){ - $self->cc_append_to_ccflags(qw(-Wall)); - - my $gccversion = _gccversion(); - if($gccversion >= 4.0){ - $self->cc_append_to_ccflags(qw(-Wextra)); - if(!($UseC99 or $UseCplusplus)) { - # Note: MSVC++ doesn't support C99, - # so -Wdeclaration-after-statement helps - # ensure C89 specs. - $self->cc_append_to_ccflags(qw(-Wdeclaration-after-statement)); - } - if($gccversion >= 4.1 && !$UseCplusplus) { - $self->cc_append_to_ccflags(qw(-Wc++-compat)); - } - } - else{ - $self->cc_append_to_ccflags(qw(-W -Wno-comment)); - } - } - elsif(_is_msvc()){ - $self->cc_append_to_ccflags(qw(-W3)); - } - else{ - # TODO: support other compilers - } - - return; -} - -sub c99_available { - my($self) = @_; - - return 0 if not $self->cc_available(); - - require File::Temp; - require File::Basename; - - my $tmpfile = File::Temp->new(SUFFIX => '.c'); - - $tmpfile->print(<<'C99'); -// include a C99 header -#include <stdbool.h> -inline // a C99 keyword with C99 style comments -int test_c99() { - int i = 0; - i++; - int j = i - 1; // another C99 feature: declaration after statement - return j; -} -C99 - - $tmpfile->close(); - - system "$Config{cc} -c " . $tmpfile->filename; - - (my $objname = File::Basename::basename($tmpfile->filename)) =~ s/\Q.c\E$/$Config{_o}/; - unlink $objname or warn "Cannot unlink $objname (ignored): $!"; - - return $? == 0; -} - -sub requires_c99 { - my($self) = @_; - if(!$self->c99_available) { - warn "This distribution requires a C99 compiler, but $Config{cc} seems not to support C99, stopped.\n"; - exit; - } - $self->_xs_initialize(); - $UseC99 = 1; - return; -} - -sub requires_cplusplus { - my($self) = @_; - if(!$self->cc_available) { - warn "This distribution requires a C++ compiler, but $Config{cc} seems not to support C++, stopped.\n"; - exit; - } - $self->_xs_initialize(); - $UseCplusplus = 1; - return; -} - -sub cc_append_to_inc{ - my($self, @dirs) = @_; - - $self->_xs_initialize(); - - for my $dir(@dirs){ - unless(-d $dir){ - warn("'$dir' not found: $!\n"); - } - - _verbose "inc: -I$dir" if _VERBOSE; - } - - my $mm = $self->makemaker_args; - my $paths = join q{ }, map{ s{\\}{\\\\}g; qq{"-I$_"} } @dirs; - - if($mm->{INC}){ - $mm->{INC} .= q{ } . $paths; - } - else{ - $mm->{INC} = $paths; - } - return; -} - -sub cc_libs { - my ($self, @libs) = @_; - - @libs = map{ - my($name, $dir) = ref($_) eq 'ARRAY' ? @{$_} : ($_, undef); - my $lib; - if(defined $dir) { - $lib = ($dir =~ /^-/ ? qq{$dir } : qq{-L$dir }); - } - else { - $lib = ''; - } - $lib .= ($name =~ /^-/ ? qq{$name} : qq{-l$name}); - _verbose "libs: $lib" if _VERBOSE; - $lib; - } @libs; - - $self->cc_append_to_libs( @libs ); -} - -sub cc_append_to_libs{ - my($self, @libs) = @_; - - $self->_xs_initialize(); - - return unless @libs; - - my $libs = join q{ }, @libs; - - my $mm = $self->makemaker_args; - - if ($mm->{LIBS}){ - $mm->{LIBS} .= q{ } . $libs; - } - else{ - $mm->{LIBS} = $libs; - } - return $libs; -} - -sub cc_assert_lib { - my ($self, @dcl_args) = @_; - - if ( ! $self->{xsu_loaded_checklib} ) { - my $loaded_lib = 0; - foreach my $checklib (qw(inc::Devel::CheckLib Devel::CheckLib)) { - eval "use $checklib 0.4"; - if (!$@) { - $loaded_lib = 1; - last; - } - } - - if (! $loaded_lib) { - warn "Devel::CheckLib not found in inc/ nor \@INC"; - exit 0; - } - - $self->{xsu_loaded_checklib}++; - $self->configure_requires( "Devel::CheckLib" => "0.4" ); - $self->build_requires( "Devel::CheckLib" => "0.4" ); - } - - Devel::CheckLib::check_lib_or_exit(@dcl_args); -} - -sub cc_append_to_ccflags{ - my($self, @ccflags) = @_; - - $self->_xs_initialize(); - - my $mm = $self->makemaker_args; - - $mm->{CCFLAGS} ||= $Config{ccflags}; - $mm->{CCFLAGS} .= q{ } . join q{ }, @ccflags; - return; -} - -sub cc_define{ - my($self, @defines) = @_; - - $self->_xs_initialize(); - - my $mm = $self->makemaker_args; - if(exists $mm->{DEFINE}){ - $mm->{DEFINE} .= q{ } . join q{ }, @defines; - } - else{ - $mm->{DEFINE} = join q{ }, @defines; - } - return; -} - -sub requires_xs_module { - my $self = shift; - - return $self->requires() unless @_; - - $self->_xs_initialize(); - - my %added = $self->requires(@_); - my(@inc, @libs); - - my $rx_lib = qr{ \. (?: lib | a) \z}xmsi; - my $rx_dll = qr{ \. dll \z}xmsi; # for Cygwin - - while(my $module = each %added){ - my $mod_basedir = File::Spec->join(split /::/, $module); - my $rx_header = qr{\A ( .+ \Q$mod_basedir\E ) .+ \. h(?:pp)? \z}xmsi; - - SCAN_INC: foreach my $inc_dir(@INC){ - my @dirs = grep{ -e } File::Spec->join($inc_dir, 'auto', $mod_basedir), File::Spec->join($inc_dir, $mod_basedir); - - next SCAN_INC unless @dirs; - - my $n_inc = scalar @inc; - find(sub{ - if(my($incdir) = $File::Find::name =~ $rx_header){ - push @inc, $incdir; - } - elsif($File::Find::name =~ $rx_lib){ - my($libname) = $_ =~ /\A (?:lib)? (\w+) /xmsi; - push @libs, [$libname, $File::Find::dir]; - } - elsif($File::Find::name =~ $rx_dll){ - # XXX: hack for Cygwin - my $mm = $self->makemaker_args; - $mm->{macro}->{PERL_ARCHIVE_AFTER} ||= ''; - $mm->{macro}->{PERL_ARCHIVE_AFTER} .= ' ' . $File::Find::name; - } - }, @dirs); - - if($n_inc != scalar @inc){ - last SCAN_INC; - } - } - } - - my %uniq = (); - $self->cc_append_to_inc (grep{ !$uniq{ $_ }++ } @inc); - - %uniq = (); - $self->cc_libs(grep{ !$uniq{ $_->[0] }++ } @libs); - - return %added; -} - -sub cc_src_paths{ - my($self, @dirs) = @_; - - $self->_xs_initialize(); - - return unless @dirs; - - my $mm = $self->makemaker_args; - - my $XS_ref = $mm->{XS} ||= {}; - my $C_ref = $mm->{C} ||= []; - - my $_obj = $Config{_o}; - - my @src_files; - find(sub{ - if(/ \. (?: xs | c (?: c | pp | xx )? ) \z/xmsi){ # *.{xs, c, cc, cpp, cxx} - push @src_files, $File::Find::name; - } - }, @dirs); - - my $xs_to = $UseCplusplus ? '.cpp' : '.c'; - foreach my $src_file(@src_files){ - my $c = $src_file; - if($c =~ s/ \.xs \z/$xs_to/xms){ - $XS_ref->{$src_file} = $c; - - _verbose "xs: $src_file" if _VERBOSE; - } - else{ - _verbose "c: $c" if _VERBOSE; - } - - push @{$C_ref}, $c unless grep{ $_ eq $c } @{$C_ref}; - } - - $self->clean_files(map{ - File::Spec->catfile($_, '*.gcov'), - File::Spec->catfile($_, '*.gcda'), - File::Spec->catfile($_, '*.gcno'), - } @dirs); - $self->cc_append_to_inc('.'); - - return; -} - -sub cc_include_paths{ - my($self, @dirs) = @_; - - $self->_xs_initialize(); - - push @{ $self->{xsu_include_paths} ||= []}, @dirs; - - my $h_map = $self->{xsu_header_map} ||= {}; - - foreach my $dir(@dirs){ - my $prefix = quotemeta( File::Spec->catfile($dir, '') ); - find(sub{ - return unless / \.h(?:pp)? \z/xms; - - (my $h_file = $File::Find::name) =~ s/ \A $prefix //xms; - $h_map->{$h_file} = $File::Find::name; - }, $dir); - } - - $self->cc_append_to_inc(@dirs); - - return; -} - -sub install_headers{ - my $self = shift; - my $h_files; - if(@_ == 0){ - $h_files = $self->{xsu_header_map} or die "install_headers: cc_include_paths not specified.\n"; - } - elsif(@_ == 1 && ref($_[0]) eq 'HASH'){ - $h_files = $_[0]; - } - else{ - $h_files = +{ map{ $_ => undef } @_ }; - } - - $self->_xs_initialize(); - - my @not_found; - my $h_map = $self->{xsu_header_map} || {}; - - while(my($ident, $path) = each %{$h_files}){ - $path ||= $h_map->{$ident} || File::Spec->join('.', $ident); - $path = File::Spec->canonpath($path); - - unless($path && -e $path){ - push @not_found, $ident; - next; - } - - $ToInstall{$path} = File::Spec->join('$(INST_ARCHAUTODIR)', $ident); - - _verbose "install: $path as $ident" if _VERBOSE; - my @funcs = $self->_extract_functions_from_header_file($path); - if(@funcs){ - $self->cc_append_to_funclist(@funcs); - } - } - - if(@not_found){ - die "Header file(s) not found: @not_found\n"; - } - - return; -} - -my $home_directory; - -sub _extract_functions_from_header_file{ - my($self, $h_file) = @_; - - my @functions; - - ($home_directory) = <~> unless defined $home_directory; - - # get header file contents through cpp(1) - my $contents = do { - my $mm = $self->makemaker_args; - - my $cppflags = q{"-I}. File::Spec->join($Config{archlib}, 'CORE') . q{"}; - $cppflags =~ s/~/$home_directory/g; - - $cppflags .= ' ' . $mm->{INC} if $mm->{INC}; - - $cppflags .= ' ' . ($mm->{CCFLAGS} || $Config{ccflags}); - $cppflags .= ' ' . $mm->{DEFINE} if $mm->{DEFINE}; - - my $add_include = _is_msvc() ? '-FI' : '-include'; - $cppflags .= ' ' . join ' ', - map{ qq{$add_include "$_"} } qw(EXTERN.h perl.h XSUB.h); - - my $cppcmd = qq{$Config{cpprun} $cppflags $h_file}; - # remove all the -arch options to workaround gcc errors: - # "-E, -S, -save-temps and -M options are not allowed - # with multiple -arch flags" - $cppcmd =~ s/ -arch \s* \S+ //xmsg; - _verbose("extract functions from: $cppcmd") if _VERBOSE; - `$cppcmd`; - }; - - unless(defined $contents){ - die "Cannot call C pre-processor ($Config{cpprun}): $! ($?)"; - } - - # remove other include file contents - my $chfile = q/\# (?:line)? \s+ \d+ /; - $contents =~ s{ - ^$chfile \s+ (?!"\Q$h_file\E") - .*? - ^(?= $chfile) - }{}xmsig; - - if(_VERBOSE){ - local *H; - open H, "> $h_file.out" - and print H $contents - and close H; - } - - while($contents =~ m{ - ([^\\;\s]+ # type - \s+ - ([a-zA-Z_][a-zA-Z0-9_]*) # function name - \s* - \( [^;#]* \) # argument list - [\w\s\(\)]* # attributes or something - ;) # end of declaration - }xmsg){ - my $decl = $1; - my $name = $2; - - next if $decl =~ /\b typedef \b/xms; - next if $name =~ /^_/xms; # skip something private - - push @functions, $name; - - if(_VERBOSE){ - $decl =~ tr/\n\r\t / /s; - $decl =~ s/ (\Q$name\E) /<$name>/xms; - _verbose("decl: $decl"); - } - } - - return @functions; -} - - -sub cc_append_to_funclist{ - my($self, @functions) = @_; - - $self->_xs_initialize(); - - my $mm = $self->makemaker_args; - - push @{$mm->{FUNCLIST} ||= []}, @functions; - $mm->{DL_FUNCS} ||= { '$(NAME)' => [] }; - - return; -} - -sub _xshelper_h { - my $h = <<'XSHELPER_H'; -:/* THIS FILE IS AUTOMATICALLY GENERATED BY Module::Install::XSUtil $VERSION. */ -:/* -:=head1 NAME -: -:xshelper.h - Helper C header file for XS modules -: -:=head1 DESCRIPTION -: -: // This includes all the perl header files and ppport.h -: #include "xshelper.h" -: -:=head1 SEE ALSO -: -:L<Module::Install::XSUtil>, where this file is distributed as a part of -: -:=head1 AUTHOR -: -:Fuji, Goro (gfx) E<lt>gfuji at cpan.orgE<gt> -: -:=head1 LISENCE -: -:Copyright (c) 2010, Fuji, Goro (gfx). All rights reserved. -: -:This library is free software; you can redistribute it and/or modify -:it under the same terms as Perl itself. -: -:=cut -:*/ -: -:#ifdef __cplusplus -:extern "C" { -:#endif -: -:#define PERL_NO_GET_CONTEXT /* we want efficiency */ -:#include <EXTERN.h> -:#include <perl.h> -:#define NO_XSLOCKS /* for exceptions */ -:#include <XSUB.h> -: -:#ifdef __cplusplus -:} /* extern "C" */ -:#endif -: -:#include "ppport.h" -: -:/* portability stuff not supported by ppport.h yet */ -: -:#ifndef STATIC_INLINE /* from 5.13.4 */ -:# if defined(__GNUC__) || defined(__cplusplus) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) -:# define STATIC_INLINE static inline -:# else -:# define STATIC_INLINE static -:# endif -:#endif /* STATIC_INLINE */ -: -:#ifndef __attribute__format__ -:#define __attribute__format__(a,b,c) /* nothing */ -:#endif -: -:#ifndef LIKELY /* they are just a compiler's hint */ -:#define LIKELY(x) (!!(x)) -:#define UNLIKELY(x) (!!(x)) -:#endif -: -:#ifndef newSVpvs_share -:#define newSVpvs_share(s) Perl_newSVpvn_share(aTHX_ STR_WITH_LEN(s), 0U) -:#endif -: -:#ifndef get_cvs -:#define get_cvs(name, flags) get_cv(name, flags) -:#endif -: -:#ifndef GvNAME_get -:#define GvNAME_get GvNAME -:#endif -:#ifndef GvNAMELEN_get -:#define GvNAMELEN_get GvNAMELEN -:#endif -: -:#ifndef CvGV_set -:#define CvGV_set(cv, gv) (CvGV(cv) = (gv)) -:#endif -: -:/* general utility */ -: -:#if PERL_BCDVERSION >= 0x5008005 -:#define LooksLikeNumber(x) looks_like_number(x) -:#else -:#define LooksLikeNumber(x) (SvPOKp(x) ? looks_like_number(x) : (I32)SvNIOKp(x)) -:#endif -: -:#define newAV_mortal() (AV*)sv_2mortal((SV*)newAV()) -:#define newHV_mortal() (HV*)sv_2mortal((SV*)newHV()) -:#define newRV_inc_mortal(sv) sv_2mortal(newRV_inc(sv)) -:#define newRV_noinc_mortal(sv) sv_2mortal(newRV_noinc(sv)) -: -:#define DECL_BOOT(name) EXTERN_C XS(CAT2(boot_, name)) -:#define CALL_BOOT(name) STMT_START { \ -: PUSHMARK(SP); \ -: CALL_FPTR(CAT2(boot_, name))(aTHX_ cv); \ -: } STMT_END -XSHELPER_H - $h =~ s/^://xmsg; - $h =~ s/\$VERSION\b/$Module::Install::XSUtil::VERSION/xms; - return $h; -} - -package - MY; - -# XXX: We must append to PM inside ExtUtils::MakeMaker->new(). -sub init_PM { - my $self = shift; - - $self->SUPER::init_PM(@_); - - while(my($k, $v) = each %ToInstall){ - $self->{PM}{$k} = $v; - } - return; -} - -# append object file names to CCCMD -sub const_cccmd { - my $self = shift; - - my $cccmd = $self->SUPER::const_cccmd(@_); - return q{} unless $cccmd; - - if (Module::Install::XSUtil::_is_msvc()){ - $cccmd .= ' -Fo$@'; - } - else { - $cccmd .= ' -o $@'; - } - - return $cccmd -} - -sub xs_c { - my($self) = @_; - my $mm = $self->SUPER::xs_c(); - $mm =~ s/ \.c /.cpp/xmsg if $UseCplusplus; - return $mm; -} - -sub xs_o { - my($self) = @_; - my $mm = $self->SUPER::xs_o(); - $mm =~ s/ \.c /.cpp/xmsg if $UseCplusplus; - return $mm; -} - -1; -__END__ - -#line 1030 diff --git a/ldns/LICENSE b/ldns/LICENSE deleted file mode 100644 index 6d4c6be..0000000 --- a/ldns/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2005,2006, NLnetLabs -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of NLnetLabs nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/ldns/Makefile.in b/ldns/Makefile.in deleted file mode 100644 index 442067d..0000000 --- a/ldns/Makefile.in +++ /dev/null @@ -1,1098 +0,0 @@ -# Standard installation pathnames -# See the file LICENSE for the license -SHELL = @SHELL@ -VERSION = @PACKAGE_VERSION@ -version_info = @VERSION_INFO@ -srcdir = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ -bindir = @bindir@ -mandir = @mandir@ -datarootdir = @datarootdir@ -datadir = @datadir@ -libdir = @libdir@ -includedir = @includedir@ -sysconfdir = @sysconfdir@ -doxygen = @doxygen@ -pywrapdir = $(srcdir)/contrib/python -pyldnsxwrapdir = $(srcdir)/contrib/ldnsx -p5_dns_ldns_dir = $(srcdir)/contrib/DNS-LDNS -PERL = @PERL@ -swig = @swig@ -swigpy_flags = -python @SWIGPY3@ -python_site = @PYTHON_SITE_PKG@ -pyldns_inst = @PYLDNSINST@ -pyldns_uninst = @PYLDNSUNINST@ -pyldnsx_inst = @PYLDNSXINST@ -pyldnsx_uninst = @PYLDNSXUNINST@ -libtool = @libtool@ -CONFIG_FILES = @CONFIG_FILES@ - -LDNS_TRUST_ANCHOR_FILE = @LDNS_TRUST_ANCHOR_FILE@ -DEFAULT_CAFILE = @DEFAULT_CAFILE@ -DEFAULT_CAPATH = @DEFAULT_CAPATH@ - -edit = sed \ - -e 's|@LDNS_TRUST_ANCHOR_FILE[@]|$(LDNS_TRUST_ANCHOR_FILE)|g' \ - -e 's|@DEFAULT_CAFILE[@]|$(DEFAULT_CAFILE)|g' \ - -e 's|@DEFAULT_CAPATH[@]|$(DEFAULT_CAPATH)|g' - -# override $U variable which is used by autotools for deansification (for -# K&R C compilers), but causes problems if $U is defined in the env). -U= -CC = @CC@ -CFLAGS = @CFLAGS@ -CPPFLAGS = -I. -I$(srcdir) @CPPFLAGS@ @DEFS@ -DLDNS_TRUST_ANCHOR_FILE="\"$(LDNS_TRUST_ANCHOR_FILE)\"" -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -LIBOBJDIR = compat/ -LIBOBJS = @LIBOBJS@ -PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ -PYTHON_LDFLAGS = @PYTHON_LDFLAGS@ -PYTHON_X_CFLAGS = @PYTHON_X_CFLAGS@ -LIBSSL_CPPFLAGS = @LIBSSL_CPPFLAGS@ -LIBSSL_LDFLAGS = @LIBSSL_LDFLAGS@ -LIBSSL_LIBS = @LIBSSL_LIBS@ -LIBSSL_SSL_LIBS = @LIBSSL_SSL_LIBS@ -LIBPCAP_LIBS = @LIBPCAP_LIBS@ -RUNTIME_PATH = @RUNTIME_PATH@ -LIBTOOL = $(libtool) --tag=CC --quiet -LINT = splint -LINTFLAGS = +quiet -weak -warnposix -unrecog -Din_addr_t=uint32_t -Du_int=unsigned -Du_char=uint8_t -preproc -Drlimit=rlimit64 -D__gnuc_va_list=va_list -# Extra flags from configure -LINTFLAGS += @LINTFLAGS@ -LINTFLAGS += "-DBN_ULONG=unsigned long" -Dkrb5_int32=int "-Dkrb5_ui_4=unsigned int" -DPQ_64BIT=uint64_t -DRC4_INT=unsigned -fixedformalarray -D"ENGINE=unsigned" -D"RSA=unsigned" -D"DSA=unsigned" -D"EVP_PKEY=unsigned" -D"EVP_MD=unsigned" -D"SSL=unsigned" -D"SSL_CTX=unsigned" -D"X509=unsigned" -D"RC4_KEY=unsigned" -D"EVP_MD_CTX=unsigned" -D"EC_KEY=unsigned" -D"EC_POINT=unsigned" -D"EC_GROUP=unsigned" -D"EVP_PKEY_ASN1_METHOD=struct evp_pkey_asn1_method_st" -D"EVP_PKEY_CTX=struct evp_pkey_ctx_st" -# compat with OpenBSD -LINTFLAGS += "-Dsigset_t=long" -# FreeBSD8 -LINTFLAGS += "-D__uint16_t=uint16_t" -D"__pure2=" -D"__wchar_t=wchar_t" -D"__packed=" -D"__aligned(x)=" -# Ubuntu oneiric" -LINTFLAGS += -D"__BEGIN_DECLS=" -D"__ssize_t=ssize_t" -D"__intptr_t=intptr_t" -D"__nonnull(x)=" -D"__THROW=" -D"__wur=" -D"__off_t=unsigned" -D"__off64_t=unsigned" -D"__useconds_t=unsigned" -D"__uid_t=unsigned" -D"__gid_t=unsigned" -D"__attribute_deprecated__=" -D"__pid_t=unsigned" -D"__restrict=" -D"__END_DECLS=" -D"__BEGIN_NAMESPACE_STD=" -D"__END_NAMESPACE_STD=" -D"__BEGIN_NAMESPACE_C99=" -D"__END_NAMESPACE_C99=" -D"__socklen_t=unsigned" -D"sa_family_t=unsigned " -D"__mode_t=unsigned" -D"u_int16_t=uint16_t" -D"u_int32_t=uint32_t" -D"u_int8_t=uint8_t" -D"u_short=unsigned short" -D"__u16=uint16_t" -D"__u32=uint32_t" -D"__u64=uint64_t" -# FreeBSD 9 -LINTFLAGS += -D"_RuneLocale=int" -DEPFLAG = @DEPFLAG@ - -INSTALL = $(srcdir)/install-sh - -LIBLOBJS = $(LIBOBJS:.o=.lo) -LDNS_LOBJS = buffer.lo dane.lo dname.lo dnssec.lo dnssec_sign.lo dnssec_verify.lo dnssec_zone.lo duration.lo error.lo higher.lo host2str.lo host2wire.lo keys.lo net.lo packet.lo parse.lo radix.lo rbtree.lo rdata.lo resolver.lo rr.lo rr_functions.lo sha1.lo sha2.lo str2host.lo tsig.lo update.lo util.lo wire2host.lo zone.lo -LDNS_LOBJS_EX = ^linktest\.c$$ -LDNS_ALL_LOBJS = $(LDNS_LOBJS) $(LIBLOBJS) -LIB = libldns.la - -LDNS_HEADERS = buffer.h dane.h dname.h dnssec.h dnssec_sign.h dnssec_verify.h dnssec_zone.h duration.h error.h higher.h host2str.h host2wire.h keys.h ldns.h packet.h parse.h radix.h rbtree.h rdata.h resolver.h rr_functions.h rr.h sha1.h sha2.h str2host.h tsig.h update.h wire2host.h zone.h -LDNS_HEADERS_EX = ^config\.h|common\.h|util\.h|net\.h$$ -LDNS_HEADERS_GEN= common.h util.h net.h - -PYLDNS_I_FILES = $(pywrapdir)/file_py3.i $(pywrapdir)/ldns_buffer.i $(pywrapdir)/ldns_dname.i $(pywrapdir)/ldns_dnssec.i $(pywrapdir)/ldns.i $(pywrapdir)/ldns_key.i $(pywrapdir)/ldns_packet.i $(pywrapdir)/ldns_rdf.i $(pywrapdir)/ldns_resolver.i $(pywrapdir)/ldns_rr.i $(pywrapdir)/ldns_zone.i - -DRILL_LOBJS = drill/chasetrace.lo drill/dnssec.lo drill/drill.lo drill/drill_util.lo drill/error.lo drill/root.lo drill/securetrace.lo drill/work.lo - -EXAMPLE_LOBJS = examples/ldns-chaos.lo examples/ldns-compare-zones.lo examples/ldns-dane.lo examples/ldnsd.lo examples/ldns-dpa.lo examples/ldns-gen-zone.lo examples/ldns-key2ds.lo examples/ldns-keyfetcher.lo examples/ldns-keygen.lo examples/ldns-mx.lo examples/ldns-notify.lo examples/ldns-nsec3-hash.lo examples/ldns-read-zone.lo examples/ldns-resolver.lo examples/ldns-revoke.lo examples/ldns-rrsig.lo examples/ldns-signzone.lo examples/ldns-test-edns.lo examples/ldns-testns.lo examples/ldns-testpkts.lo examples/ldns-update.lo examples/ldns-verify-zone.lo examples/ldns-version.lo examples/ldns-walk.lo examples/ldns-zcat.lo examples/ldns-zsplit.lo -EXAMPLE_PROGS = examples/ldns-chaos examples/ldns-compare-zones examples/ldnsd examples/ldns-gen-zone examples/ldns-key2ds examples/ldns-keyfetcher examples/ldns-keygen examples/ldns-mx examples/ldns-notify examples/ldns-read-zone examples/ldns-resolver examples/ldns-rrsig examples/ldns-test-edns examples/ldns-update examples/ldns-version examples/ldns-walk examples/ldns-zcat examples/ldns-zsplit -EX_PROGS_BASENM = ldns-chaos ldns-compare-zones ldns-dane ldnsd ldns-dpa ldns-gen-zone ldns-key2ds ldns-keyfetcher ldns-keygen ldns-mx ldns-notify ldns-nsec3-hash ldns-read-zone ldns-resolver ldns-revoke ldns-rrsig ldns-signzone ldns-test-edns ldns-testns ldns-testpkts ldns-update ldns-verify-zone ldns-version ldns-walk ldns-zcat ldns-zsplit -EXAMPLE_PROGS_EX= ^examples/ldns-testpkts\.c|examples/ldns-testns\.c|examples/ldns-dane\.c|examples/ldns-dpa\.c|examples/ldns-nsec3-hash\.c|examples/ldns-revoke\.c|examples/ldns-signzone\.c|examples/ldns-verify-zone\.c$$ -TESTNS = examples/ldns-testns -TESTNS_LOBJS = examples/ldns-testns.lo examples/ldns-testpkts.lo -LDNS_DPA = examples/ldns-dpa -LDNS_DPA_LOBJS = examples/ldns-dpa.lo -LDNS_DANE = examples/ldns-dane -LDNS_DANE_LOBJS = examples/ldns-dane.lo -EX_SSL_PROGS = examples/ldns-nsec3-hash examples/ldns-revoke examples/ldns-signzone examples/ldns-verify-zone -EX_SSL_LOBJS = examples/ldns-nsec3-hash.lo examples/ldns-revoke.lo examples/ldns-signzone.lo examples/ldns-verify-zone.lo - -COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS) -COMP_LIB = $(LIBTOOL) --mode=compile $(CC) $(CPPFLAGS) $(CFLAGS) -LINK = $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -LINK_LIB = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -version-info $(version_info) -no-undefined -LINK_EXE = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LIBSSL_LDFLAGS) - -.PHONY: clean realclean docclean manpages doc lint all lib pyldns test -.PHONY: install uninstall install-doc uninstall-doc uninstall-pyldns -.PHONY: install-h uninstall-h install-lib uninstall-lib install-pyldns - -all: setup-builddir lib linktest manpages @P5_DNS_LDNS@ @PYLDNS@ @DRILL@ @EXAMPLES@ - -.SUFFIXES: .c .o .a .lo .h .i - -.c.lo: - $(COMP_LIB) $(LIBSSL_CPPFLAGS) -c $< -o $@ - -$(LDNS_LOBJS) $(LIBLOBJS) $(DRILL_LOBJS) $(EXAMPLE_LOBJS): - $(COMP_LIB) $(LIBSSL_CPPFLAGS) -c $(srcdir)/$(@:.lo=.c) -o $@ - -setup-builddir: - @if test ! -d compat ; then mkdir compat ; fi - @if test ! -d drill ; then mkdir drill ; fi - @if test ! -d examples ; then mkdir examples ; fi - @if test ! -h config.h ; then ln -s ldns/config.h . ; fi - @if test ! -h lib ; then ln -s .libs lib ; fi ; - @if test ! -d include ; then $(INSTALL) -d include; fi - @if test ! -h include/ldns ; then ln -s ../ldns include/ldns || echo "include/ldns exists"; fi - -putdown-builddir: - rm -f include/ldns lib config.h - test ! -d include || rmdir include || : - if test -d examples -a ! -f examples/README; then rmdir examples || : ; fi - if test -d drill -a ! -f drill/README ; then rmdir drill || : ; fi - if test -d compat -a ! -f compat/malloc.c; then rmdir compat || : ; fi - -drill: no-drill-config-h drill/drill drill/drill.1 -no-drill-config-h: - @if test -e $(srcdir)/drill/config.h -o -e drill/config.h ; \ - then echo "A config.h was detected in the drill subdirectory." ; \ - echo "This does not work when building drill from here." ; \ - echo "Either remove the config.h from the subdirectory" ; \ - echo "or build drill there." ; \ - exit -1 ; \ - fi - -drill/drill: $(DRILL_LOBJS) $(LIB) $(LIBLOBJS) - $(LINK_EXE) $(DRILL_LOBJS) $(LIBLOBJS) $(LIBS) $(LIBSSL_LIBS) -lldns -o drill/drill - -drill/drill.1: $(srcdir)/drill/drill.1.in - $(edit) $(srcdir)/drill/drill.1.in > drill/drill.1 - -install-drill: drill/drill drill/drill.1 - $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) - $(INSTALL) -m 755 -d $(DESTDIR)$(mandir) - $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1 - $(LIBTOOL) --mode=install cp drill/drill $(DESTDIR)$(bindir) - $(INSTALL) -m 644 drill/drill.1 $(DESTDIR)$(mandir)/man1/drill.1 - -uninstall-drill: - rm -f $(DESTDIR)$(bindir)/drill $(DESTDIR)$(mandir)/man1/drill.1 - test ! -d $(DESTDIR)$(mandir) || rmdir -p $(DESTDIR)$(mandir)/man1 || :; - test ! -d $(DESTDIR)$(bindir) || rmdir -p $(DESTDIR)$(bindir) || : ; - -clean-drill: - $(LIBTOOL) --mode clean rm -f $(DRILL_LOBJS) drill/drill drill/drill.1 - -examples: no-examples-config-h $(EXAMPLE_PROGS) $(TESTNS) $(LDNS_DPA) $(LDNS_DANE) $(EX_SSL_PROGS) examples/ldns-dane.1 examples/ldns-verify-zone.1 -no-examples-config-h: - @if test -e $(srcdir)/examples/config.h -o -e examples/config.h ; \ - then echo "A config.h was detected in the examples subdirectory." ; \ - echo "This does not work when building examples from here." ; \ - echo "Either remove the config.h from the subdirectory" ; \ - echo "or build examples there." ; \ - exit -1 ; \ - fi - -$(EXAMPLE_PROGS): - $(LINK_EXE) $@.lo $(LIBLOBJS) $(LIBS) -lldns -o $@ - -$(TESTNS): - $(LINK_EXE) $(TESTNS_LOBJS) $(LIBLOBJS) $(LIBS) -lldns -o $(TESTNS) - -$(LDNS_DPA): - $(LINK_EXE) $(LDNS_DPA_LOBJS) $(LIBLOBJS) $(LIBS) $(LIBPCAP_LIBS) -lldns \ - -o $(LDNS_DPA) - -$(LDNS_DANE): - $(LINK_EXE) $(LDNS_DANE_LOBJS) $(LIBLOBJS) -lldns $(LIBS) $(LIBSSL_SSL_LIBS) \ - -o $(LDNS_DANE) - -$(EX_SSL_PROGS): - $(LINK_EXE) $@.lo $(LIBLOBJS) $(LIBS) $(LIBSSL_LIBS) -lldns -o $@ - -examples/ldns-dane.1: $(srcdir)/examples/ldns-dane.1.in - $(edit) $(srcdir)/examples/ldns-dane.1.in > examples/ldns-dane.1 - -examples/ldns-verify-zone.1: $(srcdir)/examples/ldns-verify-zone.1.in - $(edit) $(srcdir)/examples/ldns-verify-zone.1.in > examples/ldns-verify-zone.1 - -install-examples: $(EXAMPLE_PROGS) $(TESTNS) $(LDNS_DPA) $(LDNS_DANE) $(EX_SSL_PROGS) examples/ldns-dane.1 examples/ldns-verify-zone.1 - $(INSTALL) -m 755 -d $(DESTDIR)$(bindir) - $(INSTALL) -m 755 -d $(DESTDIR)$(mandir) - $(INSTALL) -m 755 -d $(DESTDIR)$(mandir)/man1 - for p in $(EXAMPLE_PROGS) $(TESTNS) $(LDNS_DPA) $(LDNS_DANE) $(EX_SSL_PROGS) ; do \ - $(LIBTOOL) --mode=install cp $$p $(DESTDIR)$(bindir) ; \ - if test -f $$p.1 ; \ - then $(INSTALL) -m 644 $$p.1 $(DESTDIR)$(mandir)/man1 ; \ - else $(INSTALL) -m 644 $(srcdir)/$$p.1 $(DESTDIR)$(mandir)/man1 ; \ - fi ; \ - done - -uninstall-examples: - for p in $(EX_PROGS_BASENM) ; do \ - rm -f $(DESTDIR)$(bindir)/$$p $(DESTDIR)$(mandir)/man1/$$p.1 ;\ - done - test ! -d $(DESTDIR)$(mandir) || rmdir -p $(DESTDIR)$(mandir)/man1 || :; - test ! -d $(DESTDIR)$(bindir) || rmdir -p $(DESTDIR)$(bindir) || : ; - -clean-examples: - $(LIBTOOL) --mode clean rm -f $(EXAMPLE_PROGS) - $(LIBTOOL) --mode clean rm -f $(TESTNS) $(LDNS_DPA) $(LDNS_DANE) $(EX_SSL_PROGS) - $(LIBTOOL) --mode clean rm -f $(EXAMPLE_LOBJS) - $(LIBTOOL) --mode clean rm -f examples/ldns-dane.1 examples/ldns-verify-zone.1 - -linktest: $(srcdir)/linktest.c libldns.la - $(COMP_LIB) $(LIBSSL_CPPFLAGS) -c $(srcdir)/linktest.c -o linktest.lo - $(LINK_EXE) linktest.lo $(LIBS) $(LIBSSL_LIBS) -lldns -o linktest - -lib: libldns.la - -lib-export-all: libldns.la-export-all - -libldns.la: $(LDNS_ALL_LOBJS) - $(LINK_LIB) $(LIBSSL_LDFLAGS) $(LIBSSL_LIBS) -export-symbols-regex '^(ldns_|b32_[pn]to[pn]|mktime_from_utc|qsort_rr_compare_nsec3)' -o libldns.la $(LDNS_ALL_LOBJS) -rpath $(libdir) $(RUNTIME_PATH) - -libldns.la-export-all: $(LDNS_ALL_LOBJS) - $(LINK_LIB) -o libldns.la $(LDNS_ALL_LOBJS) -rpath $(libdir) $(RUNTIME_PATH) - -mancheck: - sh -c 'find . -name \*.\[13\] -exec troff -z {} \;' 2>&1 | sed "s/^\.\///" | sed "s/\(:[0\-9]\+:\)/\1 warning:/g" - -doxygen: - @if test ! -e doc/header.html ; then \ - $(INSTALL) -c -m 644 $(srcdir)/doc/header.html doc/ ; \ - fi ; - $(doxygen) $(srcdir)/libdns.doxygen - -doc: manpages $(doxygen) - @$(INSTALL) -d doc - -manpages: $(srcdir)/doc/function_manpages - @$(INSTALL) -d doc/man/man3 - @if [ -f $(srcdir)/doc/man/man3/ldns_rr.3 ] ; \ - then \ - if test -d ldns ; then \ - echo "is builddir srcdir" > ldns/YES ; \ - if [ ! -f $(srcdir)/ldns/YES ]; then \ - echo "Copying manpages..."; \ - for m in $(srcdir)/doc/man/man3/*.3 ; \ - do \ - $(INSTALL) -c -C -m 444 $${m} doc/man/man3/ ; \ - done; \ - fi ;\ - rm -f ldns/YES; \ - fi; \ - else \ - echo "Generating manpages..."; \ - cat $(srcdir)/ldns/*.h \ - | $(srcdir)/doc/doxyparse.pl -m $(srcdir)/doc/function_manpages \ - | grep -v ^doxygen | grep -v ^cat > doc/ldns_manpages; \ - fi - -manpage-create-errors: $(srcdir)/doc/function_manpages - @$(INSTALL) -d doc - @cat $(srcdir)/ldns/*.h \ - | $(srcdir)/doc/doxyparse.pl -e \ - -m $(srcdir)/doc/function_manpages >/dev/null - -manpage-errors: - @man --version >/dev/null 2>&1 && \ - for m in `cat $(srcdir)/ldns/*.h | $(srcdir)/doc/doxyparse.pl -m $(srcdir)/doc/function_manpages 2>&1 | grep -v ^doxygen | grep -v ^cat` ; do\ - LC_ALL=en_US.UTF-8 MANROFFSEQ='' MANWIDTH=80 \ - man --warnings -E UTF-8 -l -Tutf8 -Z doc/man/man3/$${m}.3 2>&1 >/dev/null \ - | awk "-vpage=$${m}.3" '{printf("%s: ", page);print}'; \ - if ! lexgrog doc/man/man3/$${m}.3 >/dev/null 2>&1 ; \ - then \ - echo doc/man/man3/$${m}.3: manpage-has-bad-whatis-entry; \ - fi; \ - done || echo "WARNING!: Cannot detect manpage errors on `uname`" - -pyldns: _ldns.la - -$(pywrapdir)/ldns_wrapper.c: $(PYLDNS_I_FILES) ldns/config.h - $(swig) $(swigpy_flags) -o $@ $(PYTHON_CPPFLAGS) $(pywrapdir)/ldns.i - -ldns_wrapper.lo: $(pywrapdir)/ldns_wrapper.c ldns/config.h - $(COMP_LIB) -I./include/ldns $(LIBSSL_CPPFLAGS) $(PYTHON_CPPFLAGS) $(PYTHON_X_CFLAGS) -c $(pywrapdir)/ldns_wrapper.c -o $@ - -_ldns.la: ldns_wrapper.lo libldns.la - $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(PYTHON_CFLAGS) $(LDFLAGS) $(PYTHON_LDFLAGS) -module -version-info $(version_info) -no-undefined -o $@ ldns_wrapper.lo -rpath $(python_site) -L. -L.libs -lldns $(LIBS) - -$(p5_dns_ldns_dir)/Makefile: $(p5_dns_ldns_dir)/Makefile.PL - BUILDDIR=`pwd`; cd $(p5_dns_ldns_dir); LD_LIBRARY_PATH="$$BUILDDIR/.libs:$$LD_LIBRARY_PATH" DYLD_LIBRARY_PATH="$$BUILDDIR/.libs:$$DYLD_LIBRARY_PATH" $(PERL) Makefile.PL LIBS="-L$$BUILDDIR/.libs -lldns" INC="-I$$BUILDDIR" - -$(p5_dns_ldns_dir)/blib/arch/auto/DNS/LDNS/LDNS.so: $(p5_dns_ldns_dir)/Makefile - cd $(p5_dns_ldns_dir); $(MAKE) - -p5-dns-ldns: $(p5_dns_ldns_dir)/blib/arch/auto/DNS/LDNS/LDNS.so - -install-p5-dns-ldns: $(p5_dns_ldns_dir)/Makefile - cd $(p5_dns_ldns_dir); $(MAKE) install - -uninstall-p5-dns-ldns: $(p5_dns_ldns_dir)/Makefile - cd $(p5_dns_ldns_dir); $(MAKE) uninstall - -clean-p5-dns-ldns: $(p5_dns_ldns_dir)/Makefile - cd $(p5_dns_ldns_dir); $(MAKE) clean - -test-p5-dns-ldns: $(p5_dns_ldns_dir)/Makefile - cd $(p5_dns_ldns_dir); $(MAKE) test - -install: install-h install-lib install-pc @INSTALL_CONFIG@ install-manpages $(pyldns_inst) $(pyldnsx_inst) @INSTALL_P5_DNS_LDNS@ @INSTALL_DRILL@ @INSTALL_EXAMPLES@ - -uninstall: uninstall-manpages @UNINSTALL_CONFIG@ uninstall-h uninstall-lib uninstall-pc $(pyldns_uninst) $(pyldnsx_uninst) @UNINSTALL_P5_DNS_LDNS@ @UNINSTALL_DRILL@ @UNINSTALL_EXAMPLES@ - -destclean: uninstall - -install-config: - $(INSTALL) -d $(DESTDIR)$(bindir) - $(INSTALL) -c -m 755 packaging/ldns-config $(DESTDIR)$(bindir) - -uninstall-config: - rm -f $(DESTDIR)$(bindir)/ldns-config - test ! -d $(DESTDIR)$(bindir) || rmdir -p $(DESTDIR)$(bindir) || echo "ok, dir already gone" - -install-config-manpage: - ${INSTALL} -d $(DESTDIR)$(mandir)/man1 - ${INSTALL} -c -m 444 $(srcdir)/packaging/ldns-config.1 $(DESTDIR)$(mandir)/man1/ - - -uninstall-config-manpage: - rm -f $(DESTDIR)$(mandir)/man1/ldns-config.1 - test ! -d $(DESTDIR)$(mandir)/man1 || rmdir -p $(DESTDIR)$(mandir)/man1 || echo "ok, dir already gone" - -install-manpages: manpages @INSTALL_CONFIG_MANPAGE@ - ${INSTALL} -d $(DESTDIR)$(mandir)/man3 - for f in doc/man/man3/*; do \ - ${INSTALL} -c -m 444 $$f $(DESTDIR)$(mandir)/man3/; \ - done - -uninstall-manpages: @UNINSTALL_CONFIG_MANPAGE@ - for m in `cat $(srcdir)/ldns/*.h | perl $(srcdir)/doc/doxyparse.pl -m $(srcdir)/doc/function_manpages 2>&1 | grep -v ^doxygen | grep -v ^cat` ; do \ - rm -f $(DESTDIR)$(mandir)/man3/$$m.3 ; done - test ! -d $(DESTDIR)$(mandir)/man3 || rmdir -p $(DESTDIR)$(mandir)/man3 || echo "ok, dir already gone" - -install-h: lib - $(INSTALL) -m 755 -d $(DESTDIR)$(includedir)/ldns - for i in $(LDNS_HEADERS); do \ - $(INSTALL) -c -m 644 $(srcdir)/ldns/$$i $(DESTDIR)$(includedir)/ldns/; done - for i in $(LDNS_HEADERS_GEN); do \ - $(INSTALL) -c -m 644 ldns/$$i $(DESTDIR)$(includedir)/ldns/; done - -uninstall-h: - for i in $(LDNS_HEADERS) $(LDNS_HEADERS_GEN); do \ - rm -f $(DESTDIR)$(includedir)/ldns/$$i; done - test ! -d $(DESTDIR)$(includedir)/ldns || rmdir -p $(DESTDIR)$(includedir)/ldns || echo "ok, dir already gone" - exit 0 - -packaging/libldns.pc: packaging/libldns.pc.in - ./config.status $@ - -install-pc: packaging/libldns.pc - $(INSTALL) -m 644 packaging/libldns.pc $(DESTDIR)$(libdir)/pkgconfig/ldns.pc - -uninstall-pc: - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/pkgconfig/ldns.pc - test ! -d $(DESTDIR)$(libdir)/pkgconfig || rmdir -p $(DESTDIR)$(libdir)/pkgconfig || echo "ok, dir already gone" - -install-lib: lib - $(INSTALL) -m 755 -d $(DESTDIR)$(libdir) - $(LIBTOOL) --mode=install cp libldns.la $(DESTDIR)$(libdir) - $(LIBTOOL) --mode=finish $(DESTDIR)$(libdir) - -uninstall-lib: - $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/libldns.la - test ! -d $(DESTDIR)$(libdir) || rmdir -p $(DESTDIR)$(libdir) || echo "ok, dir already gone" - -install-pyldns: @PYLDNS@ - $(INSTALL) -m 755 -d $(DESTDIR)$(python_site)/ldns - $(INSTALL) -c -m 644 $(pywrapdir)/ldns.py $(DESTDIR)$(python_site)/ldns.py - $(LIBTOOL) --mode=install cp _ldns.la $(DESTDIR)$(python_site) - $(LIBTOOL) --mode=finish $(DESTDIR)$(python_site) - -uninstall-pyldns: - rm -f $(DESTDIR)$(python_site)/ldns/* - test ! -d $(DESTDIR)$(python_site)/ldns || rmdir $(DESTDIR)$(python_site)/ldns || echo "ok, dir already gone" - -install-pyldnsx: - $(INSTALL) -c -m 644 $(pyldnsxwrapdir)/ldnsx.py $(DESTDIR)$(python_site)/ldnsx.py - -uninstall-pyldnsx: - rm -f $(DESTDIR)$(python_site)/ldnsx.py - -clean-manpages: - for m in `cat $(srcdir)/ldns/*.h | $(srcdir)/doc/doxyparse.pl -m $(srcdir)/doc/function_manpages 2>&1 | grep -v ^doxygen | grep -v ^cat` ; do\ - rm -f doc/man/man3/$${m}.3 ; done - rm -f doc/ldns_manpages - test ! -d doc/man/man3 || rmdir -p doc/man/man3 || : - -clean-lib: - $(LIBTOOL) --mode clean rm -f $(LDNS_LOBJS) $(LIBLOBJS) - $(LIBTOOL) --mode clean rm -f linktest libldns.la - $(LIBTOOL) --mode clean rm -f $(pywrapdir)/ldns_wrapper.c - $(LIBTOOL) --mode clean rm -f $(pywrapdir)/ldns.py - -clean: @CLEAN_DRILL@ @CLEAN_EXAMPLES@ @CLEAN_P5_DNS_LDNS@ clean-manpages clean-lib putdown-builddir - -realclean: clean docclean - rm -f config.status - rm -f config.log - rm -f $(CONFIG_FILES) - rm -f ldns/config.h - if test -d packaging -a ! -f packaging/ldns-config.in ; then \ - rmdir packaging || : ; fi - rm -f libtool - if test -d ldns ; then \ - echo "is builddir srcdir" > ldns/YES ; \ - if test -f $(srcdir)/ldns/YES ; then \ - echo Leaving headers files because srcdir == builddir;\ - rm -f ldns/YES; \ - else \ - echo Removing header files in builddir;\ - for f in `(cd $(srcdir); echo ldns/*.h)`; do \ - rm -f $$f ; done ; \ - rm -f ldns/YES; \ - test ! -d ldns || rmdir ldns || : ; \ - fi ;\ - fi - -docclean: - rm -rf doc/html/ - rm -rf doc/man/ - rm -rf doc/latex/ - rm -f doc/*.txt - rm -f doc/*.tex - rm -f doc/ldns_manpages - -distclean: realclean - rm -fr autom4te.cache - rm -f config.guess config.sub configure ltmain.sh ldns/config.h.in - -## No need for changes here - -lint: lint-lib @LINT_DRILL@ @LINT_EXAMPLES@ -lint-lib: - for i in $(srcdir)/*.c; do \ - $(LINT) $(LINTFLAGS) -I. -I$(srcdir) $(srcdir)/$$i ; \ - if test $$? -ne 0 ; then exit 1 ; fi ; \ - done - -lint-drill: - for i in $(srcdir)/drill/*.c; do \ - $(LINT) $(LINTFLAGS) -I. -I$(srcdir) $(srcdir)/$$i ; \ - if test $$? -ne 0 ; then exit 1 ; fi ; \ - done - -lint-examples: - for i in $(srcdir)/examples/*.c; do \ - $(LINT) $(LINTFLAGS) -I. -I$(srcdir) $(srcdir)/$$i ; \ - if test $$? -ne 0 ; then exit 1 ; fi ; \ - done - -tags: $(srcdir)/*.c ldns/*.[ch] - ctags -f $(srcdir)/tags $(srcdir)/*.[ch] ldns/*.[ch] - -allclean: test-clean clean - -test-clean: - tpkg -b test clean - -test: @TEST_P5_DNS_LDNS@ - ./test/test_all.sh - - -# Recreate symbols file, only needed when API changes -# make clean first (and after this make clean; make again) -symbols: lib-export-all - nm -g lib/libldns.so | cut -d " " -f 3 | grep ldns | sort > $(srcdir)/ldns_symbols.def - -TMP_FILE=temporary.tmp -sources: - for mf in $(srcdir)/Makefile.in Makefile ; do \ - if test -e $$mf ; then \ - cp $$mf $$mf.bak ;\ - sed -e 's/^LDNS_LOBJS[ ]*=.*$$/LDNS_LOBJS = '"`(cd $(srcdir); ls -1 *.c | egrep -v '$(LDNS_LOBJS_EX)' | sed 's/\.c/\.lo/g' | tr '\n' ' ')`"'/g' \ - -e 's/^LDNS_HEADERS[ ]*=.*$$/LDNS_HEADERS = '"`(cd $(srcdir)/ldns; ls -1 *.h | egrep -v '$(LDNS_HEADERS_EX)' | tr '\n' ' ')`"'/g' \ - -e 's?^PYLDNS_I_FILES[ ]*=.*$$?PYLDNS_I_FILES = '"`(cd $(srcdir)/contrib; echo python/*.i | sed 's/python/\$$(pywrapdir)/g')`"'?g' \ - -e 's?^DRILL_LOBJS[ ]*=.*$$?DRILL_LOBJS = '"`(cd $(srcdir); echo drill/*.c | sed 's/\.c/\.lo/g')`"'?g' \ - -e 's?^EXAMPLE_LOBJS[ ]*=.*$$?EXAMPLE_LOBJS = '"`(cd $(srcdir); echo examples/*.c | sed 's/\.c/\.lo/g')`"'?g' \ - -e 's?^EXAMPLE_PROGS[ ]*=.*$$?EXAMPLE_PROGS = '"`(cd $(srcdir); ls -1 examples/*.c | egrep -v '$(EXAMPLE_PROGS_EX)' | sed 's/\.c//g' | tr '\n' ' ')`"'?g' \ - -e 's?^EX_PROGS_BASENM[ ]*=.*$$?EX_PROGS_BASENM = '"`(cd $(srcdir); ls -1 examples/*.c | sed -e 's/\.c//g' -e 's?examples/??g' | tr '\n' ' ')`"'?g' \ - $$mf > $(TMP_FILE) ;\ - mv $(TMP_FILE) $$mf ;\ - fi;\ - done - - -# dependency generation -DEPEND_TMP=depend1073.tmp -DEPEND_TMP2=depend1074.tmp -DEPEND_TARGET=Makefile -DEPEND_TARGET2=$(srcdir)/Makefile.in -# actions: generate deplines from gcc, -# then, filter out home/xx, /usr/xx and /opt/xx lines (some cc already do this) -# then, remove empty " \" lines -# then, add srcdir before .c and .h in deps. -# then, remove srcdir from the (generated) parser and lexer. -# and mention the .lo -depend: - if test ! -e config.h ; then ln -s ldns/config.h . ; fi - echo "" > $(DEPEND_TMP) - for builddir in `pwd` ; do \ - for subdir in . compat examples drill; do \ - (cd $(srcdir) ; $(CC) $(DEPFLAG) $(CPPFLAGS) $(CFLAGS) -I$$builddir -I$$subdir $$subdir/*.c) | \ - sed -e 's!'$$HOME'[^ ]* !!g' -e 's!'$$HOME'[^ ]*$$!!g' \ - -e 's!/usr[^ ]* !!g' -e 's!/usr[^ ]*$$!!g' \ - -e 's!/opt[^ ]* !!g' -e 's!/opt[^ ]*$$!!g' | \ - sed -e '/^ \\$$/d' | \ - sed -e 's? *\([^ ]*\.[ch]\)? $$(srcdir)/\1?g' | \ - sed -e 's? *\([^ ]*\.inc\)? $$(srcdir)/\1?g' | \ - sed -e 's?$$(srcdir)/ldns/config.h?ldns/config.h?g' \ - -e 's?$$(srcdir)/config.h?ldns/config.h?g' \ - -e 's?$$(srcdir)/ldns/common.h?ldns/common.h?g' \ - -e 's?$$(srcdir)/ldns/util.h?ldns/util.h?g' \ - -e 's?$$(srcdir)/ldns/net.h?ldns/net.h?g' \ - -e 's!\(.*\)\.o[ :]*!'"$$subdir/"'\1.lo '"$$subdir/"'\1.o: !g' \ - -e 's?^\.\/??g' -e 's? \.\/? ?g' \ - >> $(DEPEND_TMP) ;\ - done; \ - done - for p in $(EXAMPLE_PROGS) $(LDNS_DPA) $(LDNS_DANE) $(EX_SSL_PROGS); do \ - echo "$$p: $$p.lo $$p.o \$$(LIB)" >> $(DEPEND_TMP) ; done - echo "$(TESTNS): `for o in $(TESTNS_LOBJS) ; do \ - echo -n "$$o $${o%lo}o " ; done` \$$(LIB)" \ - >> $(DEPEND_TMP) - cp $(DEPEND_TARGET) $(DEPEND_TMP2) - head -`egrep -n "# Dependencies" $(DEPEND_TARGET) | tail -1 | sed -e 's/:.*$$//'` $(DEPEND_TMP2) > $(DEPEND_TARGET) - cat $(DEPEND_TMP) >> $(DEPEND_TARGET) - @if diff $(DEPEND_TARGET) $(DEPEND_TMP2); then echo " $(DEPEND_TARGET) unchanged"; else echo " Updated $(DEPEND_TARGET))"; fi - @if test -f $(DEPEND_TARGET2); then \ - cp $(DEPEND_TARGET2) $(DEPEND_TMP2); \ - head -`egrep -n "# Dependencies" $(DEPEND_TARGET2) | tail -1 | sed -e 's/:.*$$//'` $(DEPEND_TMP2) > $(DEPEND_TARGET2); \ - cat $(DEPEND_TMP) >> $(DEPEND_TARGET2); \ - if diff $(DEPEND_TARGET2) $(DEPEND_TMP2); then echo " $(DEPEND_TARGET2) unchanged"; else echo " Updated $(DEPEND_TARGET2))"; fi; \ - fi - rm -f $(DEPEND_TMP) $(DEPEND_TMP2) - -# Dependencies - -buffer.lo buffer.o: $(srcdir)/buffer.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dane.lo dane.o: $(srcdir)/dane.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dname.lo dname.o: $(srcdir)/dname.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dnssec.lo dnssec.o: $(srcdir)/dnssec.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dnssec_sign.lo dnssec_sign.o: $(srcdir)/dnssec_sign.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dnssec_verify.lo dnssec_verify.o: $(srcdir)/dnssec_verify.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -dnssec_zone.lo dnssec_zone.o: $(srcdir)/dnssec_zone.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -duration.lo duration.o: $(srcdir)/duration.c ldns/config.h $(srcdir)/ldns/duration.h -error.lo error.o: $(srcdir)/error.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -higher.lo higher.o: $(srcdir)/higher.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -host2str.lo host2str.o: $(srcdir)/host2str.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -host2wire.lo host2wire.o: $(srcdir)/host2wire.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -keys.lo keys.o: $(srcdir)/keys.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -linktest.lo linktest.o: $(srcdir)/linktest.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -net.lo net.o: $(srcdir)/net.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -packet.lo packet.o: $(srcdir)/packet.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -parse.lo parse.o: $(srcdir)/parse.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -radix.lo radix.o: $(srcdir)/radix.c ldns/config.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/error.h ldns/util.h \ - ldns/common.h -rbtree.lo rbtree.o: $(srcdir)/rbtree.c ldns/config.h $(srcdir)/ldns/rbtree.h ldns/util.h ldns/common.h -rdata.lo rdata.o: $(srcdir)/rdata.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -resolver.lo resolver.o: $(srcdir)/resolver.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -rr.lo rr.o: $(srcdir)/rr.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -rr_functions.lo rr_functions.o: $(srcdir)/rr_functions.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -sha1.lo sha1.o: $(srcdir)/sha1.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -sha2.lo sha2.o: $(srcdir)/sha2.c ldns/config.h $(srcdir)/ldns/sha2.h -str2host.lo str2host.o: $(srcdir)/str2host.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -tsig.lo tsig.o: $(srcdir)/tsig.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -update.lo update.o: $(srcdir)/update.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -util.lo util.o: $(srcdir)/util.c ldns/config.h $(srcdir)/ldns/rdata.h ldns/common.h $(srcdir)/ldns/error.h \ - ldns/util.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/buffer.h -wire2host.lo wire2host.o: $(srcdir)/wire2host.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -zone.lo zone.o: $(srcdir)/zone.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -compat/b64_ntop.lo compat/b64_ntop.o: $(srcdir)/compat/b64_ntop.c ldns/config.h -compat/b64_pton.lo compat/b64_pton.o: $(srcdir)/compat/b64_pton.c ldns/config.h -compat/calloc.lo compat/calloc.o: $(srcdir)/compat/calloc.c ldns/config.h -compat/ctime_r.lo compat/ctime_r.o: $(srcdir)/compat/ctime_r.c ldns/config.h -compat/fake-rfc2553.lo compat/fake-rfc2553.o: $(srcdir)/compat/fake-rfc2553.c ldns/config.h ldns/common.h \ - $(srcdir)/compat/fake-rfc2553.h -compat/gmtime_r.lo compat/gmtime_r.o: $(srcdir)/compat/gmtime_r.c ldns/config.h -compat/inet_aton.lo compat/inet_aton.o: $(srcdir)/compat/inet_aton.c ldns/config.h -compat/inet_ntop.lo compat/inet_ntop.o: $(srcdir)/compat/inet_ntop.c ldns/config.h -compat/inet_pton.lo compat/inet_pton.o: $(srcdir)/compat/inet_pton.c ldns/config.h -compat/isascii.lo compat/isascii.o: $(srcdir)/compat/isascii.c ldns/config.h -compat/isblank.lo compat/isblank.o: $(srcdir)/compat/isblank.c ldns/config.h -compat/localtime_r.lo compat/localtime_r.o: $(srcdir)/compat/localtime_r.c ldns/config.h -compat/malloc.lo compat/malloc.o: $(srcdir)/compat/malloc.c ldns/config.h -compat/memmove.lo compat/memmove.o: $(srcdir)/compat/memmove.c ldns/config.h -compat/realloc.lo compat/realloc.o: $(srcdir)/compat/realloc.c ldns/config.h -compat/snprintf.lo compat/snprintf.o: $(srcdir)/compat/snprintf.c ldns/config.h -compat/strlcpy.lo compat/strlcpy.o: $(srcdir)/compat/strlcpy.c ldns/config.h -compat/timegm.lo compat/timegm.o: $(srcdir)/compat/timegm.c ldns/config.h -examples/ldns-chaos.lo examples/ldns-chaos.o: $(srcdir)/examples/ldns-chaos.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-compare-zones.lo examples/ldns-compare-zones.o: $(srcdir)/examples/ldns-compare-zones.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-dane.lo examples/ldns-dane.o: $(srcdir)/examples/ldns-dane.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldnsd.lo examples/ldnsd.o: $(srcdir)/examples/ldnsd.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h \ - $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h \ - $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h \ - $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-dpa.lo examples/ldns-dpa.o: $(srcdir)/examples/ldns-dpa.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h $(srcdir)/examples/ldns-dpa.h -examples/ldns-gen-zone.lo examples/ldns-gen-zone.o: $(srcdir)/examples/ldns-gen-zone.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-key2ds.lo examples/ldns-key2ds.o: $(srcdir)/examples/ldns-key2ds.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-keyfetcher.lo examples/ldns-keyfetcher.o: $(srcdir)/examples/ldns-keyfetcher.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-keygen.lo examples/ldns-keygen.o: $(srcdir)/examples/ldns-keygen.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-mx.lo examples/ldns-mx.o: $(srcdir)/examples/ldns-mx.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-notify.lo examples/ldns-notify.o: $(srcdir)/examples/ldns-notify.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-nsec3-hash.lo examples/ldns-nsec3-hash.o: $(srcdir)/examples/ldns-nsec3-hash.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-read-zone.lo examples/ldns-read-zone.o: $(srcdir)/examples/ldns-read-zone.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-resolver.lo examples/ldns-resolver.o: $(srcdir)/examples/ldns-resolver.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-revoke.lo examples/ldns-revoke.o: $(srcdir)/examples/ldns-revoke.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-rrsig.lo examples/ldns-rrsig.o: $(srcdir)/examples/ldns-rrsig.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-signzone.lo examples/ldns-signzone.o: $(srcdir)/examples/ldns-signzone.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-test-edns.lo examples/ldns-test-edns.o: $(srcdir)/examples/ldns-test-edns.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-testns.lo examples/ldns-testns.o: $(srcdir)/examples/ldns-testns.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h $(srcdir)/examples/ldns-testpkts.h -examples/ldns-testpkts.lo examples/ldns-testpkts.o: $(srcdir)/examples/ldns-testpkts.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h \ - $(srcdir)/examples/ldns-testpkts.h -examples/ldns-update.lo examples/ldns-update.o: $(srcdir)/examples/ldns-update.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-verify-zone.lo examples/ldns-verify-zone.o: $(srcdir)/examples/ldns-verify-zone.c ldns/config.h $(srcdir)/ldns/ldns.h \ - ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h \ - $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h \ - $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h \ - $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h \ - $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h \ - $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h \ - $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-version.lo examples/ldns-version.o: $(srcdir)/examples/ldns-version.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-walk.lo examples/ldns-walk.o: $(srcdir)/examples/ldns-walk.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-zcat.lo examples/ldns-zcat.o: $(srcdir)/examples/ldns-zcat.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-zsplit.lo examples/ldns-zsplit.o: $(srcdir)/examples/ldns-zsplit.c ldns/config.h $(srcdir)/ldns/ldns.h ldns/util.h \ - ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h \ - $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h \ - $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h \ - $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h \ - $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/chasetrace.lo drill/chasetrace.o: $(srcdir)/drill/chasetrace.c $(srcdir)/drill/drill.h ldns/config.h \ - $(srcdir)/drill/drill_util.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h \ - $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h \ - $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h \ - $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h \ - $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h \ - $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/dnssec.lo drill/dnssec.o: $(srcdir)/drill/dnssec.c $(srcdir)/drill/drill.h ldns/config.h $(srcdir)/drill/drill_util.h \ - $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h \ - $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h \ - $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h \ - $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h \ - $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h \ - ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h \ - $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/drill.lo drill/drill.o: $(srcdir)/drill/drill.c $(srcdir)/drill/drill.h ldns/config.h $(srcdir)/drill/drill_util.h \ - $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h \ - $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h \ - $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h \ - $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h \ - $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h \ - ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h \ - $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/drill_util.lo drill/drill_util.o: $(srcdir)/drill/drill_util.c $(srcdir)/drill/drill.h ldns/config.h \ - $(srcdir)/drill/drill_util.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h \ - $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h \ - $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h \ - $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h \ - $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h \ - $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/error.lo drill/error.o: $(srcdir)/drill/error.c $(srcdir)/drill/drill.h ldns/config.h $(srcdir)/drill/drill_util.h \ - $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h \ - $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h \ - $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h \ - $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h \ - $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h \ - ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h \ - $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/root.lo drill/root.o: $(srcdir)/drill/root.c $(srcdir)/drill/drill.h ldns/config.h $(srcdir)/drill/drill_util.h \ - $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h \ - $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h \ - $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h \ - $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h \ - $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h \ - ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h \ - $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/securetrace.lo drill/securetrace.o: $(srcdir)/drill/securetrace.c $(srcdir)/drill/drill.h ldns/config.h \ - $(srcdir)/drill/drill_util.h $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h \ - $(srcdir)/ldns/error.h $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h \ - $(srcdir)/ldns/dnssec.h $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h \ - $(srcdir)/ldns/tsig.h $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h \ - $(srcdir)/ldns/dnssec_verify.h $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h \ - $(srcdir)/ldns/host2wire.h ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h \ - $(srcdir)/ldns/wire2host.h $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h \ - $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -drill/work.lo drill/work.o: $(srcdir)/drill/work.c $(srcdir)/drill/drill.h ldns/config.h $(srcdir)/drill/drill_util.h \ - $(srcdir)/ldns/ldns.h ldns/util.h ldns/common.h $(srcdir)/ldns/buffer.h $(srcdir)/ldns/error.h \ - $(srcdir)/ldns/dane.h $(srcdir)/ldns/rdata.h $(srcdir)/ldns/rr.h $(srcdir)/ldns/dname.h $(srcdir)/ldns/dnssec.h \ - $(srcdir)/ldns/packet.h $(srcdir)/ldns/keys.h $(srcdir)/ldns/zone.h $(srcdir)/ldns/resolver.h $(srcdir)/ldns/tsig.h \ - $(srcdir)/ldns/dnssec_zone.h $(srcdir)/ldns/rbtree.h $(srcdir)/ldns/host2str.h $(srcdir)/ldns/dnssec_verify.h \ - $(srcdir)/ldns/dnssec_sign.h $(srcdir)/ldns/duration.h $(srcdir)/ldns/higher.h $(srcdir)/ldns/host2wire.h \ - ldns/net.h $(srcdir)/ldns/str2host.h $(srcdir)/ldns/update.h $(srcdir)/ldns/wire2host.h \ - $(srcdir)/ldns/rr_functions.h $(srcdir)/ldns/parse.h $(srcdir)/ldns/radix.h $(srcdir)/ldns/sha1.h $(srcdir)/ldns/sha2.h -examples/ldns-chaos: examples/ldns-chaos.lo examples/ldns-chaos.o $(LIB) -examples/ldns-compare-zones: examples/ldns-compare-zones.lo examples/ldns-compare-zones.o $(LIB) -examples/ldnsd: examples/ldnsd.lo examples/ldnsd.o $(LIB) -examples/ldns-gen-zone: examples/ldns-gen-zone.lo examples/ldns-gen-zone.o $(LIB) -examples/ldns-key2ds: examples/ldns-key2ds.lo examples/ldns-key2ds.o $(LIB) -examples/ldns-keyfetcher: examples/ldns-keyfetcher.lo examples/ldns-keyfetcher.o $(LIB) -examples/ldns-keygen: examples/ldns-keygen.lo examples/ldns-keygen.o $(LIB) -examples/ldns-mx: examples/ldns-mx.lo examples/ldns-mx.o $(LIB) -examples/ldns-notify: examples/ldns-notify.lo examples/ldns-notify.o $(LIB) -examples/ldns-read-zone: examples/ldns-read-zone.lo examples/ldns-read-zone.o $(LIB) -examples/ldns-resolver: examples/ldns-resolver.lo examples/ldns-resolver.o $(LIB) -examples/ldns-rrsig: examples/ldns-rrsig.lo examples/ldns-rrsig.o $(LIB) -examples/ldns-test-edns: examples/ldns-test-edns.lo examples/ldns-test-edns.o $(LIB) -examples/ldns-update: examples/ldns-update.lo examples/ldns-update.o $(LIB) -examples/ldns-version: examples/ldns-version.lo examples/ldns-version.o $(LIB) -examples/ldns-walk: examples/ldns-walk.lo examples/ldns-walk.o $(LIB) -examples/ldns-zcat: examples/ldns-zcat.lo examples/ldns-zcat.o $(LIB) -examples/ldns-zsplit: examples/ldns-zsplit.lo examples/ldns-zsplit.o $(LIB) -examples/ldns-dpa: examples/ldns-dpa.lo examples/ldns-dpa.o $(LIB) -examples/ldns-dane: examples/ldns-dane.lo examples/ldns-dane.o $(LIB) -examples/ldns-nsec3-hash: examples/ldns-nsec3-hash.lo examples/ldns-nsec3-hash.o $(LIB) -examples/ldns-revoke: examples/ldns-revoke.lo examples/ldns-revoke.o $(LIB) -examples/ldns-signzone: examples/ldns-signzone.lo examples/ldns-signzone.o $(LIB) -examples/ldns-verify-zone: examples/ldns-verify-zone.lo examples/ldns-verify-zone.o $(LIB) -examples/ldns-testns: examples/ldns-testns.lo examples/ldns-testns.o examples/ldns-testpkts.lo examples/ldns-testpkts.o $(LIB) diff --git a/ldns/buffer.c b/ldns/buffer.c deleted file mode 100644 index e008831..0000000 --- a/ldns/buffer.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * buffer.c -- generic memory buffer . - * - * Copyright (c) 2001-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> -#include <ldns/buffer.h> - -ldns_buffer * -ldns_buffer_new(size_t capacity) -{ - ldns_buffer *buffer = LDNS_MALLOC(ldns_buffer); - - if (!buffer) { - return NULL; - } - - buffer->_data = (uint8_t *) LDNS_XMALLOC(uint8_t, capacity); - if (!buffer->_data) { - LDNS_FREE(buffer); - return NULL; - } - - buffer->_position = 0; - buffer->_limit = buffer->_capacity = capacity; - buffer->_fixed = 0; - buffer->_status = LDNS_STATUS_OK; - - ldns_buffer_invariant(buffer); - - return buffer; -} - -void -ldns_buffer_new_frm_data(ldns_buffer *buffer, const void *data, size_t size) -{ - assert(data != NULL); - - buffer->_position = 0; - buffer->_limit = buffer->_capacity = size; - buffer->_fixed = 0; - buffer->_data = LDNS_XMALLOC(uint8_t, size); - if(!buffer->_data) { - buffer->_status = LDNS_STATUS_MEM_ERR; - return; - } - memcpy(buffer->_data, data, size); - buffer->_status = LDNS_STATUS_OK; - - ldns_buffer_invariant(buffer); -} - -bool -ldns_buffer_set_capacity(ldns_buffer *buffer, size_t capacity) -{ - void *data; - - ldns_buffer_invariant(buffer); - assert(buffer->_position <= capacity); - - data = (uint8_t *) LDNS_XREALLOC(buffer->_data, uint8_t, capacity); - if (!data) { - buffer->_status = LDNS_STATUS_MEM_ERR; - return false; - } else { - buffer->_data = data; - buffer->_limit = buffer->_capacity = capacity; - return true; - } -} - -bool -ldns_buffer_reserve(ldns_buffer *buffer, size_t amount) -{ - ldns_buffer_invariant(buffer); - assert(!buffer->_fixed); - if (buffer->_capacity < buffer->_position + amount) { - size_t new_capacity = buffer->_capacity * 3 / 2; - - if (new_capacity < buffer->_position + amount) { - new_capacity = buffer->_position + amount; - } - if (!ldns_buffer_set_capacity(buffer, new_capacity)) { - buffer->_status = LDNS_STATUS_MEM_ERR; - return false; - } - } - buffer->_limit = buffer->_capacity; - return true; -} - -int -ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...) -{ - va_list args; - int written = 0; - size_t remaining; - - if (ldns_buffer_status_ok(buffer)) { - ldns_buffer_invariant(buffer); - assert(buffer->_limit == buffer->_capacity); - - remaining = ldns_buffer_remaining(buffer); - va_start(args, format); - written = vsnprintf((char *) ldns_buffer_current(buffer), remaining, - format, args); - va_end(args); - if (written == -1) { - buffer->_status = LDNS_STATUS_INTERNAL_ERR; - return -1; - } else if ((size_t) written >= remaining) { - if (!ldns_buffer_reserve(buffer, (size_t) written + 1)) { - buffer->_status = LDNS_STATUS_MEM_ERR; - return -1; - } - va_start(args, format); - written = vsnprintf((char *) ldns_buffer_current(buffer), - ldns_buffer_remaining(buffer), format, args); - va_end(args); - if (written == -1) { - buffer->_status = LDNS_STATUS_INTERNAL_ERR; - return -1; - } - } - buffer->_position += written; - } - return written; -} - -void -ldns_buffer_free(ldns_buffer *buffer) -{ - if (!buffer) { - return; - } - - if (!buffer->_fixed) - LDNS_FREE(buffer->_data); - - LDNS_FREE(buffer); -} - -void * -ldns_buffer_export(ldns_buffer *buffer) -{ - buffer->_fixed = 1; - return buffer->_data; -} - -int -ldns_bgetc(ldns_buffer *buffer) -{ - if (!ldns_buffer_available_at(buffer, buffer->_position, sizeof(uint8_t))) { - ldns_buffer_set_position(buffer, ldns_buffer_limit(buffer)); - /* ldns_buffer_rewind(buffer);*/ - return EOF; - } - return (int)ldns_buffer_read_u8(buffer); -} - -void -ldns_buffer_copy(ldns_buffer* result, const ldns_buffer* from) -{ - size_t tocopy = ldns_buffer_limit(from); - - if(tocopy > ldns_buffer_capacity(result)) - tocopy = ldns_buffer_capacity(result); - ldns_buffer_clear(result); - ldns_buffer_write(result, ldns_buffer_begin(from), tocopy); - ldns_buffer_flip(result); -} diff --git a/ldns/compat/b64_ntop.c b/ldns/compat/b64_ntop.c deleted file mode 100644 index 6895aca..0000000 --- a/ldns/compat/b64_ntop.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Portions Copyright (c) 1995 by International Business Machines, Inc. - * - * International Business Machines, Inc. (hereinafter called IBM) grants - * permission under its copyrights to use, copy, modify, and distribute this - * Software with or without fee, provided that the above copyright notice and - * all paragraphs of this notice appear in all copies, and that the name of IBM - * not be used in connection with the marketing of any product incorporating - * the Software or modifications thereof, without specific, written prior - * permission. - * - * To the extent it has a right to do so, IBM grants an immunity from suit - * under its patents, if any, for the use, sale or manufacture of products to - * the extent that such products are used for performing Domain Name System - * dynamic updates in TCP/IP networks by means of the Software. No immunity is - * granted for any product per se or for any other function of any product. - * - * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, - * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN - * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ -#include <ldns/config.h> -#include <ctype.h> -#include <stdlib.h> -#include <string.h> - -static const char Base64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static const char Pad64 = '='; - -/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) - The following encoding technique is taken from RFC 1521 by Borenstein - and Freed. It is reproduced here in a slightly edited form for - convenience. - - A 65-character subset of US-ASCII is used, enabling 6 bits to be - represented per printable character. (The extra 65th character, "=", - is used to signify a special processing function.) - - The encoding process represents 24-bit groups of input bits as output - strings of 4 encoded characters. Proceeding from left to right, a - 24-bit input group is formed by concatenating 3 8-bit input groups. - These 24 bits are then treated as 4 concatenated 6-bit groups, each - of which is translated into a single digit in the base64 alphabet. - - Each 6-bit group is used as an index into an array of 64 printable - characters. The character referenced by the index is placed in the - output string. - - Table 1: The Base64 Alphabet - - Value Encoding Value Encoding Value Encoding Value Encoding - 0 A 17 R 34 i 51 z - 1 B 18 S 35 j 52 0 - 2 C 19 T 36 k 53 1 - 3 D 20 U 37 l 54 2 - 4 E 21 V 38 m 55 3 - 5 F 22 W 39 n 56 4 - 6 G 23 X 40 o 57 5 - 7 H 24 Y 41 p 58 6 - 8 I 25 Z 42 q 59 7 - 9 J 26 a 43 r 60 8 - 10 K 27 b 44 s 61 9 - 11 L 28 c 45 t 62 + - 12 M 29 d 46 u 63 / - 13 N 30 e 47 v - 14 O 31 f 48 w (pad) = - 15 P 32 g 49 x - 16 Q 33 h 50 y - - Special processing is performed if fewer than 24 bits are available - at the end of the data being encoded. A full encoding quantum is - always completed at the end of a quantity. When fewer than 24 input - bits are available in an input group, zero bits are added (on the - right) to form an integral number of 6-bit groups. Padding at the - end of the data is performed using the '=' character. - - Since all base64 input is an integral number of octets, only the - ------------------------------------------------- - following cases can arise: - - (1) the final quantum of encoding input is an integral - multiple of 24 bits; here, the final unit of encoded - output will be an integral multiple of 4 characters - with no "=" padding, - (2) the final quantum of encoding input is exactly 8 bits; - here, the final unit of encoded output will be two - characters followed by two "=" padding characters, or - (3) the final quantum of encoding input is exactly 16 bits; - here, the final unit of encoded output will be three - characters followed by one "=" padding character. - */ - -int -ldns_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) { - size_t datalength = 0; - uint8_t input[3]; - uint8_t output[4]; - size_t i; - - if (srclength == 0) { - if (targsize > 0) { - target[0] = '\0'; - return 0; - } else { - return -1; - } - } - - while (2 < srclength) { - input[0] = *src++; - input[1] = *src++; - input[2] = *src++; - srclength -= 3; - - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - output[3] = input[2] & 0x3f; - assert(output[0] < 64); - assert(output[1] < 64); - assert(output[2] < 64); - assert(output[3] < 64); - - if (datalength + 4 > targsize) { - return (-1); - } - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - target[datalength++] = Base64[output[2]]; - target[datalength++] = Base64[output[3]]; - } - - /* Now we worry about padding. */ - if (0 != srclength) { - /* Get what's left. */ - input[0] = input[1] = input[2] = (uint8_t) '\0'; - for (i = 0; i < srclength; i++) - input[i] = *src++; - - output[0] = input[0] >> 2; - output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); - output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); - assert(output[0] < 64); - assert(output[1] < 64); - assert(output[2] < 64); - - if (datalength + 4 > targsize) { - return (-2); - } - target[datalength++] = Base64[output[0]]; - target[datalength++] = Base64[output[1]]; - if (srclength == 1) { - target[datalength++] = Pad64; - } else { - target[datalength++] = Base64[output[2]]; - } - target[datalength++] = Pad64; - } - if (datalength >= targsize) { - return (-3); - } - target[datalength] = '\0'; /* Returned value doesn't count \0. */ - return (int) (datalength); -} diff --git a/ldns/compat/b64_pton.c b/ldns/compat/b64_pton.c deleted file mode 100644 index 18d8c8e..0000000 --- a/ldns/compat/b64_pton.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 1996, 1998 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS - * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE - * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR - * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS - * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - */ - -/* - * Portions Copyright (c) 1995 by International Business Machines, Inc. - * - * International Business Machines, Inc. (hereinafter called IBM) grants - * permission under its copyrights to use, copy, modify, and distribute this - * Software with or without fee, provided that the above copyright notice and - * all paragraphs of this notice appear in all copies, and that the name of IBM - * not be used in connection with the marketing of any product incorporating - * the Software or modifications thereof, without specific, written prior - * permission. - * - * To the extent it has a right to do so, IBM grants an immunity from suit - * under its patents, if any, for the use, sale or manufacture of products to - * the extent that such products are used for performing Domain Name System - * dynamic updates in TCP/IP networks by means of the Software. No immunity is - * granted for any product per se or for any other function of any product. - * - * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, - * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN - * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. - */ -#include <ldns/config.h> -#include <ctype.h> -#include <stdlib.h> -#include <string.h> - -static const char Base64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -static const char Pad64 = '='; - -/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) - The following encoding technique is taken from RFC 1521 by Borenstein - and Freed. It is reproduced here in a slightly edited form for - convenience. - - A 65-character subset of US-ASCII is used, enabling 6 bits to be - represented per printable character. (The extra 65th character, "=", - is used to signify a special processing function.) - - The encoding process represents 24-bit groups of input bits as output - strings of 4 encoded characters. Proceeding from left to right, a - 24-bit input group is formed by concatenating 3 8-bit input groups. - These 24 bits are then treated as 4 concatenated 6-bit groups, each - of which is translated into a single digit in the base64 alphabet. - - Each 6-bit group is used as an index into an array of 64 printable - characters. The character referenced by the index is placed in the - output string. - - Table 1: The Base64 Alphabet - - Value Encoding Value Encoding Value Encoding Value Encoding - 0 A 17 R 34 i 51 z - 1 B 18 S 35 j 52 0 - 2 C 19 T 36 k 53 1 - 3 D 20 U 37 l 54 2 - 4 E 21 V 38 m 55 3 - 5 F 22 W 39 n 56 4 - 6 G 23 X 40 o 57 5 - 7 H 24 Y 41 p 58 6 - 8 I 25 Z 42 q 59 7 - 9 J 26 a 43 r 60 8 - 10 K 27 b 44 s 61 9 - 11 L 28 c 45 t 62 + - 12 M 29 d 46 u 63 / - 13 N 30 e 47 v - 14 O 31 f 48 w (pad) = - 15 P 32 g 49 x - 16 Q 33 h 50 y - - Special processing is performed if fewer than 24 bits are available - at the end of the data being encoded. A full encoding quantum is - always completed at the end of a quantity. When fewer than 24 input - bits are available in an input group, zero bits are added (on the - right) to form an integral number of 6-bit groups. Padding at the - end of the data is performed using the '=' character. - - Since all base64 input is an integral number of octets, only the - ------------------------------------------------- - following cases can arise: - - (1) the final quantum of encoding input is an integral - multiple of 24 bits; here, the final unit of encoded - output will be an integral multiple of 4 characters - with no "=" padding, - (2) the final quantum of encoding input is exactly 8 bits; - here, the final unit of encoded output will be two - characters followed by two "=" padding characters, or - (3) the final quantum of encoding input is exactly 16 bits; - here, the final unit of encoded output will be three - characters followed by one "=" padding character. - */ - -/* skips all whitespace anywhere. - converts characters, four at a time, starting at (or after) - src from base - 64 numbers into three 8 bit bytes in the target area. - it returns the number of data bytes stored at the target, or -1 on error. - */ - -int -ldns_b64_pton(char const *origsrc, uint8_t *target, size_t targsize) -{ - unsigned char const* src = (unsigned char*)origsrc; - int tarindex, state, ch; - char *pos; - - state = 0; - tarindex = 0; - - if (strlen(origsrc) == 0) { - return 0; - } - - while ((ch = *src++) != '\0') { - if (isspace((unsigned char)ch)) /* Skip whitespace anywhere. */ - continue; - - if (ch == Pad64) - break; - - pos = strchr(Base64, ch); - if (pos == 0) { - /* A non-base64 character. */ - return (-1); - } - - switch (state) { - case 0: - if (target) { - if ((size_t)tarindex >= targsize) - return (-1); - target[tarindex] = (pos - Base64) << 2; - } - state = 1; - break; - case 1: - if (target) { - if ((size_t)tarindex + 1 >= targsize) - return (-1); - target[tarindex] |= (pos - Base64) >> 4; - target[tarindex+1] = ((pos - Base64) & 0x0f) - << 4 ; - } - tarindex++; - state = 2; - break; - case 2: - if (target) { - if ((size_t)tarindex + 1 >= targsize) - return (-1); - target[tarindex] |= (pos - Base64) >> 2; - target[tarindex+1] = ((pos - Base64) & 0x03) - << 6; - } - tarindex++; - state = 3; - break; - case 3: - if (target) { - if ((size_t)tarindex >= targsize) - return (-1); - target[tarindex] |= (pos - Base64); - } - tarindex++; - state = 0; - break; - default: - abort(); - } - } - - /* - * We are done decoding Base-64 chars. Let's see if we ended - * on a byte boundary, and/or with erroneous trailing characters. - */ - - if (ch == Pad64) { /* We got a pad char. */ - ch = *src++; /* Skip it, get next. */ - switch (state) { - case 0: /* Invalid = in first position */ - case 1: /* Invalid = in second position */ - return (-1); - - case 2: /* Valid, means one byte of info */ - /* Skip any number of spaces. */ - for ((void)NULL; ch != '\0'; ch = *src++) - if (!isspace((unsigned char)ch)) - break; - /* Make sure there is another trailing = sign. */ - if (ch != Pad64) - return (-1); - ch = *src++; /* Skip the = */ - /* Fall through to "single trailing =" case. */ - /* FALLTHROUGH */ - - case 3: /* Valid, means two bytes of info */ - /* - * We know this char is an =. Is there anything but - * whitespace after it? - */ - for ((void)NULL; ch != '\0'; ch = *src++) - if (!isspace((unsigned char)ch)) - return (-1); - - /* - * Now make sure for cases 2 and 3 that the "extra" - * bits that slopped past the last full byte were - * zeros. If we don't check them, they become a - * subliminal channel. - */ - if (target && target[tarindex] != 0) - return (-1); - } - } else { - /* - * We ended by seeing the end of the string. Make sure we - * have no partial bytes lying around. - */ - if (state != 0) - return (-1); - } - - return (tarindex); -} diff --git a/ldns/compat/strlcpy.c b/ldns/compat/strlcpy.c deleted file mode 100644 index d6c34c1..0000000 --- a/ldns/compat/strlcpy.c +++ /dev/null @@ -1,57 +0,0 @@ -/* from openssh 4.3p2 compat/strlcpy.c */ -/* - * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* OPENBSD ORIGINAL: lib/libc/string/strlcpy.c */ - -#include <ldns/config.h> -#ifndef HAVE_STRLCPY - -#include <sys/types.h> -#include <string.h> - -/* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. - */ -size_t -strlcpy(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) { - do { - if ((*d++ = *s++) == 0) - break; - } while (--n != 0); - } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ -} - -#endif /* !HAVE_STRLCPY */ diff --git a/ldns/config.guess b/ldns/config.guess deleted file mode 100755 index b1f709e..0000000 --- a/ldns/config.guess +++ /dev/null @@ -1,1480 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2018 Free Software Foundation, Inc. - -timestamp='2018-08-29' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see <https://www.gnu.org/licenses/>. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. -# -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess -# -# Please send patches to <config-patches@gnu.org>. - - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright 1992-2018 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -tmp= -# shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 1 2 13 15 -trap 'exitcode=$?; test -z "$tmp" || rm -fr "$tmp"; exit $exitcode' 0 - -set_cc_for_build() { - : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } - dummy=$tmp/dummy - case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in - ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do - if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" - break - fi - done - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; - esac -} - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if test -f /.attbin/uname ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -case "$UNAME_SYSTEM" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - set_cc_for_build - cat <<-EOF > "$dummy.c" - #include <features.h> - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" - - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl - fi - ;; -esac - -# Note: order is significant - the case branches are not exclusive. - -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ - echo unknown)` - case "$UNAME_MACHINE_ARCH" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown - ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in - earm*) - os=netbsdelf - ;; - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in - Debian*) - release='-gnu' - ;; - *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; - *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" - exit ;; - *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" - exit ;; - *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" - exit ;; - *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; - *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; - *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; - mips:OSF1:*.*) - echo mips-dec-osf1 - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE=alpha ;; - "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; - "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; - "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; - "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; - "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; - "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; - "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; - "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; - "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; - "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; - "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; - "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" - exit ;; - arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - UNAME_REL="`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" - case `isainfo -b` in - 32) - echo i386-pc-solaris2"$UNAME_REL" - ;; - 64) - echo x86_64-pc-solaris2"$UNAME_REL" - ;; - esac - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" - ;; - sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" -#ifdef __cplusplus -#include <stdio.h> /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] - then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] - then - echo m88k-dg-dgux"$UNAME_RELEASE" - else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" - fi - else - echo i586-dg-dgux"$UNAME_RELEASE" - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" - fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include <sys/systemcfg.h> - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[4567]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` - else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" - fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in - 9000/31?) HP_ARCH=m68000 ;; - 9000/[34]??) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "$HP_ARCH" = "" ]; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - - #define _HPUX_SOURCE - #include <stdlib.h> - #include <unistd.h> - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ "$HP_ARCH" = hppa2.0w ] - then - set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH=hppa2.0w - else - HP_ARCH=hppa64 - fi - fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" - exit ;; - 3050*:HI-UX:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #include <unistd.h> - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk - else - echo "$UNAME_MACHINE"-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" - exit ;; - *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; - arm:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - set_cc_for_build - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi - else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf - fi - exit ;; - *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; - i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin - exit ;; - *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 - exit ;; - *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 - exit ;; - *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys - exit ;; - i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 - exit ;; - *:Interix*:*) - case "$UNAME_MACHINE" in - x86) - echo i586-pc-interix"$UNAME_RELEASE" - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" - exit ;; - IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" - exit ;; - esac ;; - i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" - exit ;; - *:GNU:*:*) - # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" - exit ;; - *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix - exit ;; - aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arm*:Linux:*:*) - set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi - else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; - crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; - e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; - ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" - test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } - ;; - mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; - or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" - exit ;; - sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" - exit ;; - x86_64:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" - exit ;; - xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop - exit ;; - i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" - exit ;; - i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp - exit ;; - i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" - else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` - echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL" - elif /bin/uname -X 2>/dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" - else - echo "$UNAME_MACHINE"-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says <Richard.M.Bartel@ccMail.Census.GOV> - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes <hewes@openmarket.com>. - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" - else - echo mips-unknown-sysv"$UNAME_RELEASE" - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; - SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" - exit ;; - *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc - fi - if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 - fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo "$UNAME_MACHINE"-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" - exit ;; - *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" - exit ;; - i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos - exit ;; - i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros - exit ;; - x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; - amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; -esac - -echo "$0: unable to guess system type" >&2 - -case "$UNAME_MACHINE:$UNAME_SYSTEM" in - mips:Linux | mips64:Linux) - # If we got here on MIPS GNU/Linux, output extra information. - cat >&2 <<EOF - -NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize -the system type. Please install a C compiler and try again. -EOF - ;; -esac - -cat >&2 <<EOF - -This script (version $timestamp), has failed to recognize the -operating system you are using. If your script is old, overwrite *all* -copies of config.guess and config.sub with the latest versions from: - - https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess -and - https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub - -If $0 has already been updated, send the following data and any -information you think might be pertinent to config-patches@gnu.org to -provide the necessary information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = "$UNAME_MACHINE" -UNAME_RELEASE = "$UNAME_RELEASE" -UNAME_SYSTEM = "$UNAME_SYSTEM" -UNAME_VERSION = "$UNAME_VERSION" -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/ldns/config.sub b/ldns/config.sub deleted file mode 100755 index dad7123..0000000 --- a/ldns/config.sub +++ /dev/null @@ -1,1802 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2018 Free Software Foundation, Inc. - -timestamp='2018-05-24' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, see <https://www.gnu.org/licenses/>. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to <config-patches@gnu.org>. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS - -Canonicalize a configuration name. - -Options: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to <config-patches@gnu.org>." - -version="\ -GNU config.sub ($timestamp) - -Copyright 1992-2018 Free Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo "$1" - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Split fields of configuration type -IFS="-" read -r field1 field2 field3 field4 <<EOF -$1 -EOF - -# Separate into logical components for further validation -case $1 in - *-*-*-*-*) - echo Invalid configuration \`"$1"\': more than four components >&2 - exit 1 - ;; - *-*-*-*) - basic_machine=$field1-$field2 - os=$field3-$field4 - ;; - *-*-*) - # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two - # parts - maybe_os=$field2-$field3 - case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ - | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) - basic_machine=$field1 - os=$maybe_os - ;; - android-linux) - basic_machine=$field1-unknown - os=linux-android - ;; - *) - basic_machine=$field1-$field2 - os=$field3 - ;; - esac - ;; - *-*) - # Second component is usually, but not always the OS - case $field2 in - # Prevent following clause from handling this valid os - sun*os*) - basic_machine=$field1 - os=$field2 - ;; - # Manufacturers - dec* | mips* | sequent* | encore* | pc532* | sgi* | sony* \ - | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ - | unicom* | ibm* | next | hp | isi* | apollo | altos* \ - | convergent* | ncr* | news | 32* | 3600* | 3100* | hitachi* \ - | c[123]* | convex* | sun | crds | omron* | dg | ultra | tti* \ - | harris | dolphin | highlevel | gould | cbm | ns | masscomp \ - | apple | axis | knuth | cray | microblaze* \ - | sim | cisco | oki | wec | wrs | winbond) - basic_machine=$field1-$field2 - os= - ;; - *) - basic_machine=$field1 - os=$field2 - ;; - esac - ;; - *) - # Convert single-component short-hands not valid as part of - # multi-component configurations. - case $field1 in - 386bsd) - basic_machine=i386-pc - os=bsd - ;; - a29khif) - basic_machine=a29k-amd - os=udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=scout - ;; - am29k) - basic_machine=a29k-none - os=bsd - ;; - amdahl) - basic_machine=580-amdahl - os=sysv - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=bsd - ;; - aros) - basic_machine=i386-pc - os=aros - ;; - aux) - basic_machine=m68k-apple - os=aux - ;; - balance) - basic_machine=ns32k-sequent - os=dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=linux - ;; - cegcc) - basic_machine=arm-unknown - os=cegcc - ;; - cray) - basic_machine=j90-cray - os=unicos - ;; - craynv) - basic_machine=craynv-cray - os=unicosmp - ;; - delta88) - basic_machine=m88k-motorola - os=sysv3 - ;; - dicos) - basic_machine=i686-pc - os=dicos - ;; - djgpp) - basic_machine=i586-pc - os=msdosdjgpp - ;; - ebmon29k) - basic_machine=a29k-amd - os=ebmon - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=ose - ;; - gmicro) - basic_machine=tron-gmicro - os=sysv - ;; - go32) - basic_machine=i386-pc - os=go32 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=hms - ;; - harris) - basic_machine=m88k-harris - os=sysv3 - ;; - hp300bsd) - basic_machine=m68k-hp - os=bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=hpux - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=proelf - ;; - i386mach) - basic_machine=i386-mach - os=mach - ;; - vsta) - basic_machine=i386-unknown - os=vsta - ;; - isi68 | isi) - basic_machine=m68k-isi - os=sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=linux - ;; - magnum | m3230) - basic_machine=mips-mips - os=sysv - ;; - merlin) - basic_machine=ns32k-utek - os=sysv - ;; - mingw64) - basic_machine=x86_64-pc - os=mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=mingw32ce - ;; - monitor) - basic_machine=m68k-rom68k - os=coff - ;; - morphos) - basic_machine=powerpc-unknown - os=morphos - ;; - moxiebox) - basic_machine=moxie-unknown - os=moxiebox - ;; - msdos) - basic_machine=i386-pc - os=msdos - ;; - msys) - basic_machine=i686-pc - os=msys - ;; - mvs) - basic_machine=i370-ibm - os=mvs - ;; - nacl) - basic_machine=le32-unknown - os=nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=newsos - ;; - news1000) - basic_machine=m68030-sony - os=newsos - ;; - necv70) - basic_machine=v70-nec - os=sysv - ;; - nh3000) - basic_machine=m68k-harris - os=cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=cxux - ;; - nindy960) - basic_machine=i960-intel - os=nindy - ;; - mon960) - basic_machine=i960-intel - os=mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=nonstopux - ;; - os400) - basic_machine=powerpc-ibm - os=os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=ose - ;; - os68k) - basic_machine=m68k-none - os=os68k - ;; - paragon) - basic_machine=i860-intel - os=osf - ;; - parisc) - basic_machine=hppa-unknown - os=linux - ;; - pw32) - basic_machine=i586-unknown - os=pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=rdos - ;; - rdos32) - basic_machine=i386-pc - os=rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=coff - ;; - sa29200) - basic_machine=a29k-amd - os=udi - ;; - sei) - basic_machine=mips-sei - os=seiux - ;; - sps7) - basic_machine=m68k-bull - os=sysv2 - ;; - stratus) - basic_machine=i860-stratus - os=sysv4 - ;; - sun2os3) - basic_machine=m68000-sun - os=sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=solaris2 - ;; - sv1) - basic_machine=sv1-cray - os=unicos - ;; - symmetry) - basic_machine=i386-sequent - os=dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=unicos - ;; - t90) - basic_machine=t90-cray - os=unicos - ;; - toad1) - basic_machine=pdp10-xkl - os=tops20 - ;; - tpf) - basic_machine=s390x-ibm - os=tpf - ;; - udi29k) - basic_machine=a29k-amd - os=udi - ;; - ultra3) - basic_machine=a29k-nyu - os=sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=none - ;; - vaxv) - basic_machine=vax-dec - os=sysv - ;; - vms) - basic_machine=vax-dec - os=vms - ;; - vxworks960) - basic_machine=i960-wrs - os=vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=vxworks - ;; - xbox) - basic_machine=i686-pc - os=mingw32 - ;; - ymp) - basic_machine=ymp-cray - os=unicos - ;; - *) - basic_machine=$1 - os= - ;; - esac - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv6m | armv[78][arm] \ - | avr | avr32 \ - | ba \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper | csky \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nfp \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ - | pru \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | wasm32 \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - leon|leon[3-9]) - basic_machine=sparc-$basic_machine - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=${os:-none} - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) - ;; - m9s12z | m68hcs12z | hcs12z | s12z) - basic_machine=s12z-unknown - os=${os:-none} - ;; - ms1) - basic_machine=mt-unknown - ;; - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=${os:-none} - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | amd64-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | ba-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nfp-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | powerpcspe-* \ - | pru-* \ - | pyramid-* \ - | riscv32-* | riscv64-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | wasm32-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - abacus) - basic_machine=abacus-unknown - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - blackfin-*) - basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=cnk - ;; - c54x-*) - basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=${os:-unicos} - ;; - convex-c1) - basic_machine=c1-convex - os=bsd - ;; - convex-c2) - basic_machine=c2-convex - os=bsd - ;; - convex-c32) - basic_machine=c32-convex - os=bsd - ;; - convex-c34) - basic_machine=c34-convex - os=bsd - ;; - convex-c38) - basic_machine=c38-convex - os=bsd - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=${os:-elf} - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=${os:-elf} - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=${os:-bosx} - ;; - dpx2*) - basic_machine=m68k-bull - os=sysv3 - ;; - e500v[12]) - basic_machine=powerpc-unknown - os=$os"spe" - ;; - e500v[12]-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=$os"spe" - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - elxsi) - basic_machine=elxsi-elxsi - os=${os:-bsd} - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=hiuxwe2 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=sysv32 - ;; - i*86v4*) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=sysv4 - ;; - i*86v) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=sysv - ;; - i*86sol2) - basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` - os=solaris2 - ;; - j90 | j90-cray) - basic_machine=j90-cray - os=${os:-unicos} - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - irix*) - ;; - *) - os=irix4 - ;; - esac - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` - ;; - m68knommu-*) - basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=linux - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=mint - ;; - mips3*-*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown - ;; - ms1-*) - basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=newsos - ;; - next | m*-next) - basic_machine=m68k-next - case $os in - nextstep* ) - ;; - ns2*) - os=nextstep2 - ;; - *) - os=nextstep3 - ;; - esac - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - nsv-tandem) - basic_machine=nsv-tandem - ;; - nsx-tandem) - basic_machine=nsx-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=hiuxwe2 - ;; - parisc-*) - basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` - os=linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=${os:-elf} - ;; - sequent) - basic_machine=i386-sequent - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - simso-wrs) - basic_machine=sparclite-wrs - os=vxworks - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - tile*) - basic_machine=$basic_machine-unknown - os=linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - w65*) - basic_machine=w65-wdc - os=none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=proelf - ;; - x64) - basic_machine=x86_64-pc - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` - ;; - none) - basic_machine=none-none - os=${os:-none} - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x$os != x ] -then -case $os in - # First match some system type aliases that might get confused - # with valid system types. - # solaris* is a basic system type, with this one exception. - auroraux) - os=auroraux - ;; - bluegene*) - os=cnk - ;; - solaris1 | solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - solaris) - os=solaris2 - ;; - unixware*) - os=sysv4.2uw - ;; - gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # es1800 is here to avoid being matched by es* (a different OS) - es1800*) - os=ose - ;; - # Some version numbers need modification - chorusos*) - os=chorusos - ;; - isc) - os=isc2.2 - ;; - sco6) - os=sco5v6 - ;; - sco5) - os=sco3.2v5 - ;; - sco4) - os=sco3.2v4 - ;; - sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - ;; - sco3.2v[4-9]* | sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - ;; - scout) - # Don't match below - ;; - sco*) - os=sco3.2v2 - ;; - psos*) - os=psos - ;; - # Now accept the basic system types. - # The portable systems comes first. - # Each alternative MUST end in a * to match a version number. - # sysv* is not here because it comes later, after sysvr4. - gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ - | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | kopensolaris* | plan9* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* \ - | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ - | clix* | riscos* | uniplus* | iris* | rtu* | xenix* \ - | knetbsd* | mirbsd* | netbsd* \ - | bitrig* | openbsd* | solidbsd* | libertybsd* \ - | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ - | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ - | chorusrdb* | cegcc* | glidix* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ - | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ - | linux-newlib* | linux-musl* | linux-uclibc* \ - | uxpv* | beos* | mpeix* | udk* | moxiebox* \ - | interix* | uwin* | mks* | rhapsody* | darwin* \ - | openstep* | oskit* | conix* | pw32* | nonstopux* \ - | storm-chaos* | tops10* | tenex* | tops20* | its* \ - | os2* | vos* | palmos* | uclinux* | nucleus* \ - | morphos* | superux* | rtmk* | windiss* \ - | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=nto-$os - ;; - esac - ;; - hiux*) - os=hiuxwe2 - ;; - nto-qnx*) - ;; - nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - sim | xray | os68k* | v88r* \ - | windows* | osx | abug | netware* | os9* \ - | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) - ;; - linux-dietlibc) - os=linux-dietlibc - ;; - linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - lynx*178) - os=lynxos178 - ;; - lynx*5) - os=lynxos5 - ;; - lynx*) - os=lynxos - ;; - mac*) - os=`echo "$os" | sed -e 's|mac|macos|'` - ;; - opened*) - os=openedition - ;; - os400*) - os=os400 - ;; - sunos5*) - os=`echo "$os" | sed -e 's|sunos5|solaris2|'` - ;; - sunos6*) - os=`echo "$os" | sed -e 's|sunos6|solaris3|'` - ;; - wince*) - os=wince - ;; - utek*) - os=bsd - ;; - dynix*) - os=bsd - ;; - acis*) - os=aos - ;; - atheos*) - os=atheos - ;; - syllable*) - os=syllable - ;; - 386bsd) - os=bsd - ;; - ctix* | uts*) - os=sysv - ;; - nova*) - os=rtmk-nova - ;; - ns2) - os=nextstep2 - ;; - nsk*) - os=nsk - ;; - # Preserve the version number of sinix5. - sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - sinix*) - os=sysv4 - ;; - tpf*) - os=tpf - ;; - triton*) - os=sysv3 - ;; - oss*) - os=sysv3 - ;; - svr4*) - os=sysv4 - ;; - svr3) - os=sysv3 - ;; - sysvr4) - os=sysv4 - ;; - # This must come after sysvr4. - sysv*) - ;; - ose*) - os=ose - ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) - os=mint - ;; - zvmoe) - os=zvmoe - ;; - dicos*) - os=dicos - ;; - pikeos*) - # Until real need of OS specific support for - # particular features comes up, bare metal - # configurations are quite functional. - case $basic_machine in - arm*) - os=eabi - ;; - *) - os=elf - ;; - esac - ;; - nacl*) - ;; - ios) - ;; - none) - ;; - *-eabi) - ;; - *) - echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=elf - ;; - spu-*) - os=elf - ;; - *-acorn) - os=riscix1.2 - ;; - arm*-rebel) - os=linux - ;; - arm*-semi) - os=aout - ;; - c4x-* | tic4x-*) - os=coff - ;; - c8051-*) - os=elf - ;; - clipper-intergraph) - os=clix - ;; - hexagon-*) - os=elf - ;; - tic54x-*) - os=coff - ;; - tic55x-*) - os=coff - ;; - tic6x-*) - os=coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=tops20 - ;; - pdp11-*) - os=none - ;; - *-dec | vax-*) - os=ultrix4.2 - ;; - m68*-apollo) - os=domain - ;; - i386-sun) - os=sunos4.0.2 - ;; - m68000-sun) - os=sunos3 - ;; - m68*-cisco) - os=aout - ;; - mep-*) - os=elf - ;; - mips*-cisco) - os=elf - ;; - mips*-*) - os=elf - ;; - or32-*) - os=coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=sysv3 - ;; - sparc-* | *-sun) - os=sunos4.1.1 - ;; - pru-*) - os=elf - ;; - *-be) - os=beos - ;; - *-ibm) - os=aix - ;; - *-knuth) - os=mmixware - ;; - *-wec) - os=proelf - ;; - *-winbond) - os=proelf - ;; - *-oki) - os=proelf - ;; - *-hp) - os=hpux - ;; - *-hitachi) - os=hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=sysv - ;; - *-cbm) - os=amigaos - ;; - *-dg) - os=dgux - ;; - *-dolphin) - os=sysv3 - ;; - m68k-ccur) - os=rtu - ;; - m88k-omron*) - os=luna - ;; - *-next) - os=nextstep - ;; - *-sequent) - os=ptx - ;; - *-crds) - os=unos - ;; - *-ns) - os=genix - ;; - i370-*) - os=mvs - ;; - *-gould) - os=sysv - ;; - *-highlevel) - os=bsd - ;; - *-encore) - os=bsd - ;; - *-sgi) - os=irix - ;; - *-siemens) - os=sysv4 - ;; - *-masscomp) - os=rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=uxpv - ;; - *-rom68k) - os=coff - ;; - *-*bug) - os=coff - ;; - *-apple) - os=macos - ;; - *-atari*) - os=mint - ;; - *-wrs) - os=vxworks - ;; - *) - os=none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - riscix*) - vendor=acorn - ;; - sunos*) - vendor=sun - ;; - cnk*|-aix*) - vendor=ibm - ;; - beos*) - vendor=be - ;; - hpux*) - vendor=hp - ;; - mpeix*) - vendor=hp - ;; - hiux*) - vendor=hitachi - ;; - unos*) - vendor=crds - ;; - dgux*) - vendor=dg - ;; - luna*) - vendor=omron - ;; - genix*) - vendor=ns - ;; - clix*) - vendor=intergraph - ;; - mvs* | opened*) - vendor=ibm - ;; - os400*) - vendor=ibm - ;; - ptx*) - vendor=sequent - ;; - tpf*) - vendor=ibm - ;; - vxsim* | vxworks* | windiss*) - vendor=wrs - ;; - aux*) - vendor=apple - ;; - hms*) - vendor=hitachi - ;; - mpw* | macos*) - vendor=apple - ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) - vendor=atari - ;; - vos*) - vendor=stratus - ;; - esac - basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` - ;; -esac - -echo "$basic_machine-$os" -exit - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff --git a/ldns/configure b/ldns/configure deleted file mode 100755 index 1a36dc8..0000000 --- a/ldns/configure +++ /dev/null @@ -1,20198 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for ldns 1.7.1. -# -# Report bugs to <libdns@nlnetlabs.nl>. -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1 - - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: libdns@nlnetlabs.nl about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - -SHELL=${CONFIG_SHELL-/bin/sh} - - -test -n "$DJDIR" || exec 7<&0 </dev/null -exec 6>&1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='ldns' -PACKAGE_TARNAME='libdns' -PACKAGE_VERSION='1.7.1' -PACKAGE_STRING='ldns 1.7.1' -PACKAGE_BUGREPORT='libdns@nlnetlabs.nl' -PACKAGE_URL='' - -ac_unique_file="packet.c" -# Factoring default headers for most tests. -ac_includes_default="\ -#include <stdio.h> -#ifdef HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#ifdef STDC_HEADERS -# include <stdlib.h> -# include <stddef.h> -#else -# ifdef HAVE_STDLIB_H -# include <stdlib.h> -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include <memory.h> -# endif -# include <string.h> -#endif -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif -#ifdef HAVE_INTTYPES_H -# include <inttypes.h> -#endif -#ifdef HAVE_STDINT_H -# include <stdint.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif" - -ac_subst_vars='LTLIBOBJS -CONFIG_FILES -ldns_build_config_have_attr_unused -ldns_build_config_have_attr_format -ldns_build_config_have_ssl -DEFAULT_CAPATH -DEFAULT_CAFILE -LDNS_TRUST_ANCHOR_FILE -WINDRES -ldns_build_config_have_b32_pton -ldns_build_config_have_b32_ntop -LIBOBJS -ldns_build_config_have_socklen_t -LIBPCAP_LIBS -include_unistd_h -include_systypes_h -include_inttypes_h -ldns_build_config_have_inttypes_h -include_sys_socket_h -LIBSSL_SSL_LIBS -LIBSSL_LIBS -LIBSSL_LDFLAGS -LIBSSL_CPPFLAGS -ldns_build_config_use_dane_ta_usage -ldns_build_config_use_dane_verify -ldns_build_config_use_dane -RUNTIME_PATH -HAVE_SSL -libtool -CLEAN_P5_DNS_LDNS -UNINSTALL_P5_DNS_LDNS -INSTALL_P5_DNS_LDNS -TEST_P5_DNS_LDNS -P5_DNS_LDNS -PERL -PYLDNSXUNINST -PYLDNSXINST -PYLDNSUNINST -PYLDNSINST -PYLDNSX -PYTHON_X_CFLAGS -swig -PYLDNS -SWIG_LIB -SWIG -SWIGPY3 -PYTHON_EXTRA_LDFLAGS -PYTHON_EXTRA_LIBS -PYTHON_SITE_PKG -PYTHON_LDFLAGS -PYTHON_CPPFLAGS -PYTHON -PYTHON_VERSION -UNINSTALL_CONFIG_MANPAGE -UNINSTALL_CONFIG -INSTALL_CONFIG_MANPAGE -INSTALL_CONFIG -LINT_EXAMPLES -CLEAN_EXAMPLES -UNINSTALL_EXAMPLES -INSTALL_EXAMPLES -EXAMPLES -LINT_DRILL -CLEAN_DRILL -UNINSTALL_DRILL -INSTALL_DRILL -DRILL -doxygen -LINTFLAGS -SET_MAKE -DEPFLAG -LT_SYS_LIBRARY_PATH -OTOOL64 -OTOOL -LIPO -NMEDIT -DSYMUTIL -MANIFEST_TOOL -AWK -RANLIB -STRIP -ac_ct_AR -AR -DLLTOOL -OBJDUMP -FILECMD -LN_S -NM -ac_ct_DUMPBIN -DUMPBIN -LD -FGREP -SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -EGREP -GREP -CPP -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC -VERSION_INFO -LDNS_VERSION_MICRO -LDNS_VERSION_MINOR -LDNS_VERSION_MAJOR -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -enable_shared -enable_static -with_pic -enable_fast_install -with_aix_soname -with_gnu_ld -with_sysroot -enable_libtool_lock -with_drill -with_examples -enable_ldns_config -enable_stderr_msgs -enable_poll -with_pyldns -with_pyldnsx -with_p5_dns_ldns -with_ssl -enable_sha2 -enable_gost -enable_gost_anyway -enable_ecdsa -enable_dsa -enable_ed25519 -enable_ed448 -enable_dane -enable_dane_verify -enable_dane_ta_usage -enable_full_dane -enable_no_dane_ta_usage -enable_no_dane_verify -enable_rrtype_ninfo -enable_rrtype_rkey -enable_rrtype_openpgpkey -enable_rrtype_ta -enable_rrtype_avc -enable_rrtype_doa -enable_rrtype_amtrelay -enable_rpath -with_xcode_sdk -with_trust_anchor -with_ca_file -with_ca_path -' - ac_precious_vars='build_alias -host_alias -target_alias -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS -CPP -LT_SYS_LIBRARY_PATH -PYTHON_VERSION' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures ldns 1.7.1 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/libdns] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -System types: - --build=BUILD configure for building on BUILD [guessed] - --host=HOST cross-compile to build programs to run on HOST [BUILD] -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of ldns 1.7.1:";; - esac - cat <<\_ACEOF - -Optional Features: - --disable-option-checking ignore unrecognized --enable/--with options - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-shared[=PKGS] build shared libraries [default=yes] - --enable-static[=PKGS] build static libraries [default=yes] - --enable-fast-install[=PKGS] - optimize for fast installation [default=yes] - --disable-libtool-lock avoid locking (might break parallel builds) - --disable-ldns-config disable installation of ldns-config - (default=enabled) - --enable-stderr-msgs Enable printing to stderr (default=disabled) - --enable-poll This platform supports poll(7) - --disable-sha2 Disable SHA256 and SHA512 RRSIG support - --disable-gost Disable GOST support - --enable-gost-anyway Enable GOST even whithout a GOST engine installed - --disable-ecdsa Disable ECDSA support - --disable-dsa Disable DSA support - --disable-ed25519 Disable (experimental) ED25519 support. Default is - detect - --disable-ed448 Disable (experimental) ED448 support. Default is - detect - --disable-dane Disable DANE support - --disable-dane-verify Disable DANE verify support - --disable-dane-ta-usage Disable DANE-TA usage type support - - --enable-rrtype-ninfo Enable draft RR type ninfo. - --enable-rrtype-rkey Enable draft RR type rkey. - --disable-rrtype-openpgpkey - Disable openpgpkey RR type. - --enable-rrtype-ta Enable draft RR type ta. - --enable-rrtype-avc Enable draft RR type avc. - --enable-rrtype-doa Enable draft RR type DOA. - --enable-rrtype-amtrelay - Enable draft RR type AMTRELAY. - --disable-rpath disable hardcoded rpath (default=enabled) - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use - both] - --with-aix-soname=aix|svr4|both - shared library versioning (aka "SONAME") variant to - provide on AIX, [default=aix]. - --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot[=DIR] Search for dependent libraries within DIR (or the - compiler's sysroot if not specified). - --with-drill Also build drill. - --with-examples Also build examples. - --with-pyldns generate python library, or --without-pyldns to - disable Python support. - --without-pyldnsx Do not install the ldnsx python module, or - --with-pyldnsx to install it. - --with-p5-dns-ldns generate DNS::LDNS perl bindings - --with-ssl=pathname enable SSL (will check /usr/local/ssl /usr/lib/ssl - /usr/ssl /usr/pkg /usr/local /opt/local - /usr/local/opt/openssl /usr/sfw /usr) - --with-xcode-sdk Set xcode SDK version. Default is autodetect - --with-trust-anchor=KEYFILE - Default location of the trust anchor file for drill - and ldns-dane. [default=SYSCONFDIR/unbound/root.key] - --with-ca-file=CAFILE File containing CA certificates for ldns-dane - --with-ca-path=CAPATH Directory containing CA certificate files for - ldns-dane - -Some influential environment variables: - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a - nonstandard directory <lib dir> - LIBS libraries to pass to the linker, e.g. -l<library> - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if - you have headers in a nonstandard directory <include dir> - CPP C preprocessor - LT_SYS_LIBRARY_PATH - User-defined run-time library search path. - PYTHON_VERSION - The installed Python version to use, for example '2.3'. This - string will be appended to the Python interpreter canonical - name. - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to <libdns@nlnetlabs.nl>. -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -ldns configure 1.7.1 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## - -# ac_fn_c_try_compile LINENO -# -------------------------- -# Try to compile conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext - if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_compile - -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } > conftest.i && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ---------------------------------- ## -## Report this to libdns@nlnetlabs.nl ## -## ---------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - -# ac_fn_c_try_run LINENO -# ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. -ac_fn_c_try_run () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : - ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=$ac_status -fi - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - -# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists and can be compiled using the include files in -# INCLUDES, setting the cache variable VAR accordingly. -ac_fn_c_check_header_compile () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_compile - -# ac_fn_c_try_link LINENO -# ----------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_link () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext - if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - test -x conftest$ac_exeext - }; then : - ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_retval=1 -fi - # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information - # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would - # interfere with the next link command; also delete a directory that is - # left behind by Apple's compiler. We do this before executing the actions. - rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_try_link - -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case <limits.h> declares $2. - For example, HP-UX 11i <limits.h> declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - <limits.h> exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=no" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof ($2)) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -if (sizeof (($2))) - return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - eval "$3=yes" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_type - -# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -# --------------------------------------------- -# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -# accordingly. -ac_fn_c_check_decl () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - as_decl_name=`echo $2|sed 's/ *(.*//'` - as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -#ifndef $as_decl_name -#ifdef __cplusplus - (void) $as_decl_use; -#else - (void) $as_decl_name; -#endif -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_decl - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include <stdio.h> -#include <stdlib.h> -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 <conftest.val; ac_retval=0 -else - ac_retval=1 -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -rm -f conftest.val - - fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - as_fn_set_status $ac_retval - -} # ac_fn_c_compute_int - -# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES -# ---------------------------------------------------- -# Tries to find if the field MEMBER exists in type AGGR, after including -# INCLUDES, setting cache variable VAR accordingly. -ac_fn_c_check_member () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$5 -int -main () -{ -static $2 ac_aggr; -if (ac_aggr.$3) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$5 -int -main () -{ -static $2 ac_aggr; -if (sizeof ac_aggr.$3) -return 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else - eval "$4=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -eval ac_res=\$$4 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_member -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by ldns $as_me 1.7.1, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -# needed to build correct soname -LDNS_VERSION_MAJOR=1 - -LDNS_VERSION_MINOR=7 - -LDNS_VERSION_MICRO=1 - - -# Library version -# --------------- -# current:revision:age -# (binary-api-number):(which-binary-api-version):(how-many-nrs-backwardscompat) -# if source code changes increment revision -# if any interfaces have been added/removed/changed since last update then -# increment current and set revision to 0 -# if any interfaces have been added since the last public release then increment age -# if any interfaces have been removed or changed since the last public release then -# set age to 0 -# -# ldns-1.6.17 and before had a .so with version same as VERSION_INFO -# ldns-1.7.0 has libversion 2:0:0 -# ldns-1.7.1 has libversion 3:0:1 -# -VERSION_INFO=3:0:0 - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdio.h> -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since - # <limits.h> exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include <limits.h> -#else -# include <assert.h> -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ac_nonexistent.h> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_EGREP" || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <string.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ctype.h> -#include <stdlib.h> -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = xyes; then : - MINIX=yes -else - MINIX= -fi - - - if test "$MINIX" = yes; then - -$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h - - -$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h - - -$as_echo "#define _MINIX 1" >>confdefs.h - - fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 -$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if ${ac_cv_safe_to_define___extensions__+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -# define __EXTENSIONS__ 1 - $ac_includes_default -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_safe_to_define___extensions__=yes -else - ac_cv_safe_to_define___extensions__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 -$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } - test $ac_cv_safe_to_define___extensions__ = yes && - $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h - - $as_echo "#define _ALL_SOURCE 1" >>confdefs.h - - $as_echo "#define _GNU_SOURCE 1" >>confdefs.h - - $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h - - $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h - - - -if test "$ac_cv_header_minix_config_h" = "yes"; then - -$as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h - -fi -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.7' -macro_revision='2.4.7' - - - - - - - - - - - - - -ltmain=$ac_aux_dir/ltmain.sh - -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_FGREP" || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_FGREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_FGREP=$FGREP -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" - - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : - withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else - with_gnu_ld=no -fi - -ac_prog=ld -if test yes = "$GCC"; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return, which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD=$ac_prog - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD=$ac_dir/$ac_prog - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in - *GNU* | *'with BFD'*) - test no != "$with_gnu_ld" && break - ;; - *) - test yes != "$with_gnu_ld" && break - ;; - esac - fi - done - IFS=$lt_save_ifs -else - lt_cv_path_LD=$LD # Let the user override the test with a path. -fi -fi - -LD=$lt_cv_path_LD -if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 </dev/null` in -*GNU* | *'with BFD'*) - lt_cv_prog_gnu_ld=yes - ;; -*) - lt_cv_prog_gnu_ld=no - ;; -esac -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM=$NM -else - lt_nm_to_check=${ac_tool_prefix}nm - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - tmp_nm=$ac_dir/$lt_tmp_nm - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the 'sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty - case $build_os in - mingw*) lt_bad_file=conftest.nm/nofile ;; - *) lt_bad_file=/dev/null ;; - esac - case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in - *$lt_bad_file* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break 2 - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break 2 - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS=$lt_save_ifs - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test no != "$lt_cv_path_NM"; then - NM=$lt_cv_path_NM -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DUMPBIN" && break - done -fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_DUMPBIN" && break -done - - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DUMPBIN=$ac_ct_DUMPBIN - fi -fi - - case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols -headers" - ;; - *) - DUMPBIN=: - ;; - esac - fi - - if test : != "$DUMPBIN"; then - NM=$DUMPBIN - fi -fi -test -z "$NM" && NM=nm - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } -fi - -# find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else - i=0 - teststring=ABCD - - case $build_os in - msdosdjgpp*) - # On DJGPP, this test can blow up pretty badly due to problems in libc - # (any single argument exceeding 2000 bytes causes a buffer overrun - # during glob expansion). Even if it were fixed, the result of this - # check would be larger than it should be. - lt_cv_sys_max_cmd_len=12288; # 12K is about right - ;; - - gnu*) - # Under GNU Hurd, this test is not required because there is - # no limit to the length of command line arguments. - # Libtool will interpret -1 as no limit whatsoever - lt_cv_sys_max_cmd_len=-1; - ;; - - cygwin* | mingw* | cegcc*) - # On Win9x/ME, this test blows up -- it succeeds, but takes - # about 5 minutes as the teststring grows exponentially. - # Worse, since 9x/ME are not pre-emptively multitasking, - # you end up with a "frozen" computer, even though with patience - # the test eventually succeeds (with a max line length of 256k). - # Instead, let's just punt: use the minimum linelength reported by - # all of the supported platforms: 8192 (on NT/2K/XP). - lt_cv_sys_max_cmd_len=8192; - ;; - - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - - amigaos*) - # On AmigaOS with pdksh, this test takes hours, literally. - # So we just punt and use a minimum line length of 8192. - lt_cv_sys_max_cmd_len=8192; - ;; - - bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) - # This has been around since 386BSD, at least. Likely further. - if test -x /sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` - elif test -x /usr/sbin/sysctl; then - lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` - else - lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs - fi - # And add a safety zone - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - ;; - - interix*) - # We know the value 262144 and hardcode it with a safety zone (like BSD) - lt_cv_sys_max_cmd_len=196608 - ;; - - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - - osf*) - # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure - # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not - # nice to cause kernel panics so lets avoid the loop below. - # First set a reasonable default. - lt_cv_sys_max_cmd_len=16384 - # - if test -x /sbin/sysconfig; then - case `/sbin/sysconfig -q proc exec_disable_arg_limit` in - *1*) lt_cv_sys_max_cmd_len=-1 ;; - esac - fi - ;; - sco3.2v5*) - lt_cv_sys_max_cmd_len=102400 - ;; - sysv5* | sco5v6* | sysv4.2uw2*) - kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` - if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` - else - lt_cv_sys_max_cmd_len=32768 - fi - ;; - *) - lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` - if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` - else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8; do - teststring=$teststring$teststring - done - SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test X`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && - test 17 != "$i" # 1/2 MB should be enough - do - i=`expr $i + 1` - teststring=$teststring$teststring - done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` - teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. - lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` - fi - ;; - esac - -fi - -if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } -fi -max_cmd_len=$lt_cv_sys_max_cmd_len - - - - - - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac - -fi - -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' -case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test yes != "$GCC"; then - reload_cmds=false - fi - ;; - darwin*) - if test yes = "$GCC"; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. -set dummy ${ac_tool_prefix}file; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_FILECMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$FILECMD"; then - ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_FILECMD="${ac_tool_prefix}file" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -FILECMD=$ac_cv_prog_FILECMD -if test -n "$FILECMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 -$as_echo "$FILECMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_FILECMD"; then - ac_ct_FILECMD=$FILECMD - # Extract the first word of "file", so it can be a program name with args. -set dummy file; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_FILECMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_FILECMD"; then - ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_FILECMD="file" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD -if test -n "$ac_ct_FILECMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 -$as_echo "$ac_ct_FILECMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_FILECMD" = x; then - FILECMD=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - FILECMD=$ac_ct_FILECMD - fi -else - FILECMD="$ac_cv_prog_FILECMD" -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# 'unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# that responds to the $file_magic_cmd with a given extended regex. -# If you have 'file' or equivalent on your system and you're not sure -# whether 'pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all - ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='$FILECMD -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - if ( file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' - fi - ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all - ;; - -freebsd* | dragonfly* | midnightbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=$FILECMD - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=$FILECMD - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=$FILECMD - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd* | bitrig*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - -solaris*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac - ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all - ;; -os2*) - lt_cv_deplibs_check_method=pass_all - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` - fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL - fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" -fi - -test -z "$DLLTOOL" && DLLTOOL=dlltool - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh; - # decide which one to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd=$ECHO - ;; -esac - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - - - - - - - -if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AR" && break - done -fi -if test -z "$AR"; then - ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_AR"; then - ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_AR=$ac_cv_prog_ac_ct_AR -if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_AR" && break -done - - if test "x$ac_ct_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_ct_AR - fi -fi - -: ${AR=ar} - - - - - - -# Use ARFLAGS variable as AR's operation code to sync the variable naming with -# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have -# higher priority because thats what people were doing historically (setting -# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS -# variable obsoleted/removed. - -test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} -lt_ar_flags=$AR_FLAGS - - - - - - -# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override -# by AR_FLAGS because that was never working and AR_FLAGS is about to die. - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ar_at_file=no - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -eq "$ac_status"; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if test 0 -ne "$ac_status"; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test no = "$lt_cv_ar_at_file"; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - bitrig* | openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test ia64 = "$host_cpu"; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Gets list of data symbols to import. - lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" - # Adjust the below global symbol transforms to fixup imported variables. - lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" - lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" - lt_c_name_lib_hook="\ - -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ - -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" -else - # Disable hooks by default. - lt_cv_sys_global_symbol_to_import= - lt_cdecl_hook= - lt_c_name_hook= - lt_c_name_lib_hook= -fi - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ -$lt_cdecl_hook\ -" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ -$lt_c_name_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" - -# Transform an extracted symbol line into symbol name with lib prefix and -# symbol address. -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ -$lt_c_name_lib_hook\ -" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ -" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ -" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function, - # D for any global variable and I for any imported variable. - # Also find C++ and __fastcall symbols from MSVC++ or ICC, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ -" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ -" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ -" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ -" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS=conftstm.$ac_objext - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s conftest$ac_exeext; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test yes = "$pipe_works"; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case $with_sysroot in #( - yes) - if test yes = "$GCC"; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } - as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -$as_echo_n "checking for a working dd... " >&6; } -if ${ac_cv_path_lt_DD+:} false; then : - $as_echo_n "(cached) " >&6 -else - printf 0123456789abcdef0123456789abcdef >conftest.i -cat conftest.i conftest.i >conftest2.i -: ${lt_DD:=$DD} -if test -z "$lt_DD"; then - ac_path_lt_DD_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in dd; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_lt_DD" || continue -if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then - cmp -s conftest.i conftest.out \ - && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: -fi - $ac_path_lt_DD_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_lt_DD"; then - : - fi -else - ac_cv_path_lt_DD=$lt_DD -fi - -rm -f conftest.i conftest2.i conftest.out -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -$as_echo "$ac_cv_path_lt_DD" >&6; } - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -$as_echo_n "checking how to truncate binary pipes... " >&6; } -if ${lt_cv_truncate_bin+:} false; then : - $as_echo_n "(cached) " >&6 -else - printf 0123456789abcdef0123456789abcdef >conftest.i -cat conftest.i conftest.i >conftest2.i -lt_cv_truncate_bin= -if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then - cmp -s conftest.i conftest.out \ - && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" -fi -rm -f conftest.i conftest2.i conftest.out -test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -$as_echo "$lt_cv_truncate_bin" >&6; } - - - - - - - -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -func_cc_basename () -{ - for cc_temp in $*""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac - done - func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -} - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : - enableval=$enable_libtool_lock; -fi - -test no = "$enable_libtool_lock" || enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out what ABI is being produced by ac_compile, and set mode - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE=32 - ;; - *ELF-64*) - HPUX_IA64_MODE=64 - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - if test yes = "$lt_cv_prog_gnu_ld"; then - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -mips64*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - emul=elf - case `$FILECMD conftest.$ac_objext` in - *32-bit*) - emul="${emul}32" - ;; - *64-bit*) - emul="${emul}64" - ;; - esac - case `$FILECMD conftest.$ac_objext` in - *MSB*) - emul="${emul}btsmip" - ;; - *LSB*) - emul="${emul}ltsmip" - ;; - esac - case `$FILECMD conftest.$ac_objext` in - *N32*) - emul="${emul}n32" - ;; - esac - LD="${LD-ld} -m $emul" - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. Note that the listed cases only cover the - # situations where additional linker options are needed (such as when - # doing 32-bit compilation for a host where ld defaults to 64-bit, or - # vice versa); the common cases where no linker options are needed do - # not appear in the list. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - case `$FILECMD conftest.o` in - *x86-64*) - LD="${LD-ld} -m elf32_x86_64" - ;; - *) - LD="${LD-ld} -m elf_i386" - ;; - esac - ;; - powerpc64le-*linux*) - LD="${LD-ld} -m elf32lppclinux" - ;; - powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - powerpcle-*linux*) - LD="${LD-ld} -m elf64lppc" - ;; - powerpc-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_cc_needs_belf=yes -else - lt_cv_cc_needs_belf=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test yes != "$lt_cv_cc_needs_belf"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS=$SAVE_CFLAGS - fi - ;; -*-*solaris*) - # Find out what ABI is being produced by ac_compile, and set linker - # options accordingly. - echo 'int i;' > conftest.$ac_ext - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - case `$FILECMD conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*|x86_64-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD=${LD-ld}_sol2 - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks=$enable_libtool_lock - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL - fi -else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" -fi - -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest* -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test yes != "$lt_cv_path_mainfest_tool"; then - MANIFEST_TOOL=: -fi - - - - - - - case $host_os in - rhapsody* | darwin*) - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. -set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$DSYMUTIL"; then - ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -DSYMUTIL=$ac_cv_prog_DSYMUTIL -if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DSYMUTIL"; then - ac_ct_DSYMUTIL=$DSYMUTIL - # Extract the first word of "dsymutil", so it can be a program name with args. -set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DSYMUTIL"; then - ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL -if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DSYMUTIL" = x; then - DSYMUTIL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - DSYMUTIL=$ac_ct_DSYMUTIL - fi -else - DSYMUTIL="$ac_cv_prog_DSYMUTIL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. -set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$NMEDIT"; then - ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -NMEDIT=$ac_cv_prog_NMEDIT -if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_NMEDIT"; then - ac_ct_NMEDIT=$NMEDIT - # Extract the first word of "nmedit", so it can be a program name with args. -set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_NMEDIT"; then - ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT -if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_NMEDIT" = x; then - NMEDIT=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - NMEDIT=$ac_ct_NMEDIT - fi -else - NMEDIT="$ac_cv_prog_NMEDIT" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_apple_cc_single_mod=no - if test -z "$LT_MULTI_MODULE"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test 0 = "$_lt_result"; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_exported_symbols_list=no - save_LDFLAGS=$LDFLAGS - echo "_main" > conftest.sym - LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_ld_exported_symbols_list=yes -else - lt_cv_ld_exported_symbols_list=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 - $AR $AR_FLAGS libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } - case $host_os in - rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; - darwin1.*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - darwin*) - case $MACOSX_DEPLOYMENT_TARGET,$host in - 10.[012],*|,*powerpc*-darwin[5-8]*) - _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; - *) - _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; - esac - ;; - esac - if test yes = "$lt_cv_apple_cc_single_mod"; then - _lt_dar_single_mod='$single_module' - fi - if test yes = "$lt_cv_ld_exported_symbols_list"; then - _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' - else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' - fi - if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' - else - _lt_dsymutil= - fi - ;; - esac - -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_static=yes -fi - - - - - - - - - - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for lt_pkg in $withval; do - IFS=$lt_save_ifs - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - pic_mode=default -fi - - - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, - for pkg in $enableval; do - IFS=$lt_save_ifs - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS=$lt_save_ifs - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - shared_archive_member_spec= -case $host,$enable_shared in -power*-*-aix[5-9]*,yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } - -# Check whether --with-aix-soname was given. -if test "${with_aix_soname+set}" = set; then : - withval=$with_aix_soname; case $withval in - aix|svr4|both) - ;; - *) - as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 - ;; - esac - lt_cv_with_aix_soname=$with_aix_soname -else - if ${lt_cv_with_aix_soname+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_with_aix_soname=aix -fi - - with_aix_soname=$lt_cv_with_aix_soname -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -$as_echo "$with_aix_soname" >&6; } - if test aix != "$with_aix_soname"; then - # For the AIX way of multilib, we name the shared archive member - # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', - # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. - # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, - # the AIX toolchain works better with OBJECT_MODE set (default 32). - if test 64 = "${OBJECT_MODE-32}"; then - shared_archive_member_spec=shr_64 - else - shared_archive_member_spec=shr - fi - fi - ;; -*) - with_aix_soname=aix - ;; -esac - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS=$ltmain - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a '.a' archive for static linking (except MSVC and -# ICC, which need '.lib'). -libext=a - -with_gnu_ld=$lt_cv_prog_gnu_ld - -old_CC=$CC -old_CFLAGS=$CFLAGS - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -func_cc_basename $compiler -cc_basename=$func_cc_basename_result - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/${ac_tool_prefix}file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi - -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD=$MAGIC_CMD - lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS=$lt_save_ifs - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/file"; then - lt_cv_path_MAGIC_CMD=$ac_dir/"file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD=$lt_cv_path_MAGIC_CMD - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS=$lt_save_ifs - MAGIC_CMD=$lt_save_MAGIC_CMD - ;; -esac -fi - -MAGIC_CMD=$lt_cv_path_MAGIC_CMD -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - -# Use C for the default configuration in the libtool script - -lt_save_CC=$CC -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -objext=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -ac_outfile=conftest.$ac_objext -echo "$lt_simple_compile_test_code" >conftest.$ac_ext -eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* - -ac_outfile=conftest.$ac_objext -echo "$lt_simple_link_test_code" >conftest.$ac_ext -eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err -_lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* - - -## CAVEAT EMPTOR: -## There is no encapsulation within the following macros, do not change -## the running order or otherwise move them around unless you know exactly -## what you are doing... -if test -n "$compiler"; then - -lt_prog_compiler_no_builtin_flag= - -if test yes = "$GCC"; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_rtti_exceptions=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } - -if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then - lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" -else - : -fi - -fi - - - - - - - lt_prog_compiler_wl= -lt_prog_compiler_pic= -lt_prog_compiler_static= - - - if test yes = "$GCC"; then - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_static='-static' - - case $host_os in - aix*) - # All AIX code is PIC. - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - fi - lt_prog_compiler_pic='-fPIC' - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the '-m68020' flag to GCC prevents building anything better, - # like '-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac - ;; - - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) - # PIC is the default for these OSes. - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - # Although the cygwin gcc ignores -fPIC, still need this for old-style - # (--disable-auto-import) libraries - lt_prog_compiler_pic='-DDLL_EXPORT' - case $host_os in - os2*) - lt_prog_compiler_static='$wl-static' - ;; - esac - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - - interix[3-9]*) - # Interix 3.x gcc -fpic/-fPIC options generate broken code. - # Instead, we relocate shared libraries at runtime. - ;; - - msdosdjgpp*) - # Just because we use GCC doesn't mean we suddenly get shared libraries - # on systems that don't support them. - lt_prog_compiler_can_build_shared=no - enable_shared=no - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic=-Kconform_pic - fi - ;; - - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - lt_prog_compiler_wl='-Wl,' - if test ia64 = "$host_cpu"; then - # AIX 5 now supports IA64 processor - lt_prog_compiler_static='-Bstatic' - else - lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - darwin* | rhapsody*) - # PIC is the default on this platform - # Common symbols not allowed in MH_DYLIB files - lt_prog_compiler_pic='-fno-common' - case $cc_basename in - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - lt_prog_compiler_pic='-DDLL_EXPORT' - case $host_os in - os2*) - lt_prog_compiler_static='$wl-static' - ;; - esac - ;; - - hpux9* | hpux10* | hpux11*) - lt_prog_compiler_wl='-Wl,' - # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but - # not for PA HP-UX. - case $host_cpu in - hppa*64*|ia64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='+Z' - ;; - esac - # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='$wl-a ${wl}archive' - ;; - - irix5* | irix6* | nonstopux*) - lt_prog_compiler_wl='-Wl,' - # PIC (with -KPIC) is the default. - lt_prog_compiler_static='-non_shared' - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - case $cc_basename in - # old Intel for x86_64, which still supported -KPIC. - ecc*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-static' - ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group compilers (*not* the Pentium gcc compiler, - # which looks to be a dead project) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - ccc*) - lt_prog_compiler_wl='-Wl,' - # All Alpha code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; - *) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; - *Sun\ C*) - # Sun C 5.9 - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Wl,' - ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' - lt_prog_compiler_static='-Bstatic' - ;; - esac - ;; - esac - ;; - - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - - osf3* | osf4* | osf5*) - lt_prog_compiler_wl='-Wl,' - # All OSF/1 code is PIC. - lt_prog_compiler_static='-non_shared' - ;; - - rdos*) - lt_prog_compiler_static='-non_shared' - ;; - - solaris*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - lt_prog_compiler_wl='-Qoption ld ';; - *) - lt_prog_compiler_wl='-Wl,';; - esac - ;; - - sunos4*) - lt_prog_compiler_wl='-Qoption ld ' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4 | sysv4.2uw2* | sysv4.3*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - lt_prog_compiler_pic='-Kconform_pic' - lt_prog_compiler_static='-Bstatic' - fi - ;; - - sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - unicos*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_can_build_shared=no - ;; - - uts4*) - lt_prog_compiler_pic='-pic' - lt_prog_compiler_static='-Bstatic' - ;; - - *) - lt_prog_compiler_can_build_shared=no - ;; - esac - fi - -case $host_os in - # For platforms that do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic - -# -# Check to make sure the PIC flag actually works. -# -if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - # The option is referenced via a variable to avoid confusing sed. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>conftest.err) - ac_status=$? - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s "$ac_outfile"; then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_pic_works=yes - fi - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } - -if test yes = "$lt_cv_prog_compiler_pic_works"; then - case $lt_prog_compiler_pic in - "" | " "*) ;; - *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; - esac -else - lt_prog_compiler_pic= - lt_prog_compiler_can_build_shared=no -fi - -fi - - - - - - - - - - - -# -# Check to make sure the static flag actually works. -# -wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_static_works=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS $lt_tmp_static_flag" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler_static_works=yes - fi - else - lt_cv_prog_compiler_static_works=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } - -if test yes = "$lt_cv_prog_compiler_static_works"; then - : -else - lt_prog_compiler_static= -fi - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - -hard_links=nottested -if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then - # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } - hard_links=yes - $RM conftest* - ln conftest.a conftest.b 2>/dev/null && hard_links=no - touch conftest.a - ln conftest.a conftest.b 2>&5 || hard_links=no - ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } - if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} - need_locks=warn - fi -else - need_locks=no -fi - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } - - runpath_var= - allow_undefined_flag= - always_export_symbols=no - archive_cmds= - archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no - export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no - hardcode_libdir_flag_spec= - hardcode_libdir_separator= - hardcode_minus_L=no - hardcode_shlibpath_var=unsupported - inherit_rpath=no - link_all_deplibs=unknown - module_cmds= - module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= - # include_expsyms should be a list of space-separated symbols to be *always* - # included in the symbol list - include_expsyms= - # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ' (' and ')$', so one must not match beginning or - # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', - # as well as any symbol that contains 'd'. - exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' - # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out - # platforms (ab)use it in PIC code, but their linkers get confused if - # the symbol is explicitly referenced. Since portable code cannot - # rely on this symbol name, it's probably fine to never include it in - # preloaded symbol tables. - # Exclude shared library initialization/finalization symbols. - extract_expsyms_cmds= - - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++ or Intel C++ Compiler. - if test yes != "$GCC"; then - with_gnu_ld=no - fi - ;; - interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) - with_gnu_ld=yes - ;; - openbsd* | bitrig*) - with_gnu_ld=no - ;; - esac - - ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no - if test yes = "$with_gnu_ld"; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test yes = "$lt_use_gnu_ld_interface"; then - # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='$wl' - - # Set some defaults for GNU ld with shared library support. These - # are reset later if shared libraries are not supported. Putting them - # here allows them to be overridden if necessary. - runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - export_dynamic_flag_spec='$wl--export-dynamic' - # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' - else - whole_archive_flag_spec= - fi - supports_anon_versioning=no - case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; - *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 - *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... - *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... - *\ 2.11.*) ;; # other 2.11 versions - *) supports_anon_versioning=yes ;; - esac - - # See if GNU ld supports shared libraries. - case $host_os in - aix[3-9]*) - # On AIX/PPC, the GNU linker is very broken - if test ia64 != "$host_cpu"; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: the GNU linker, at least up to release 2.19, is reported -*** to be unable to reliably create shared libraries on AIX. -*** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. - -_LT_EOF - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - allow_undefined_flag=unsupported - # Joseph Beckenbach <jrb3@best.com> says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - else - ld_shlibs=no - fi - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, - # as there is no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='$wl--export-all-symbols' - allow_undefined_flag=unsupported - always_export_symbols=no - enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file, use it as - # is; otherwise, prepend EXPORTS... - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - ld_shlibs=no - fi - ;; - - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - shrext_cmds=.dll - archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - prefix_cmds="$SED"~ - if test EXPORTS = "`$SED 1q $export_symbols`"; then - prefix_cmds="$prefix_cmds -e 1d"; - fi~ - prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ - cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' - enable_shared_with_static_runtimes=yes - file_list_spec='@' - ;; - - interix[3-9]*) - hardcode_direct=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test linux-dietlibc = "$host_os"; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test no = "$tmp_diet" - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' - case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag' - ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 - tmp_addflag=' -i_dynamic' ;; - efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 - tmp_addflag=' -i_dynamic -nofor_main' ;; - ifc* | ifort*) # Intel Fortran compiler - tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - nagfor*) # NAGFOR 5.3 - tmp_sharedflag='-Wl,-shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - ;; - esac - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' - compiler_needs_object=yes - tmp_sharedflag='-G' ;; - *Sun\ F*) # Sun Fortran 8.3 - tmp_sharedflag='-G' ;; - esac - archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - tcc*) - export_dynamic_flag_spec='-rdynamic' - ;; - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test yes = "$supports_anon_versioning"; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac - else - ld_shlibs=no - fi - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' - wlarc= - else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - fi - ;; - - solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: The releases 2.8.* of the GNU linker cannot reliably -*** create shared libraries on Solaris systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.9.1 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - - sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) - case `$LD -v 2>&1` in - *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) - ld_shlibs=no - cat <<_LT_EOF 1>&2 - -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot -*** reliably create shared libraries on SCO systems. Therefore, libtool -*** is disabling shared libraries support. We urge you to upgrade GNU -*** binutils to release 2.16.91.0.3 or newer. Another option is to modify -*** your PATH or compiler configuration so that the native linker is -*** used, and then restart. - -_LT_EOF - ;; - *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - ;; - - sunos4*) - archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' - wlarc= - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - else - ld_shlibs=no - fi - ;; - esac - - if test no = "$ld_shlibs"; then - runpath_var= - hardcode_libdir_flag_spec= - export_dynamic_flag_spec= - whole_archive_flag_spec= - fi - else - # PORTME fill in a description of your system's linker (not GNU ld) - case $host_os in - aix3*) - allow_undefined_flag=unsupported - always_export_symbols=yes - archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - - aix[4-9]*) - if test ia64 = "$host_cpu"; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag= - else - # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to GNU nm, but means don't demangle to AIX nm. - # Without the "-l" option, or with the "-B" option, AIX nm treats - # weak defined symbols like other global defined symbols, whereas - # GNU nm marks them as "W". - # While the 'weak' keyword is ignored in the Export File, we need - # it in the Import File for the 'aix-soname' feature, so we have - # to replace the "-B" option with "-P" for AIX nm. - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' - else - export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' - fi - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # have runtime linking enabled, and use it for executables. - # For shared libraries, we enable/disable runtime linking - # depending on the kind of the shared library created - - # when "with_aix_soname,aix_use_runtimelinking" is: - # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables - # "aix,yes" lib.so shared, rtl:yes, for executables - # lib.a static archive - # "both,no" lib.so.V(shr.o) shared, rtl:yes - # lib.a(lib.so.V) shared, rtl:no, for executables - # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a(lib.so.V) shared, rtl:no - # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables - # lib.a static archive - case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) - for ld_flag in $LDFLAGS; do - if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then - aix_use_runtimelinking=yes - break - fi - done - if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then - # With aix-soname=svr4, we create the lib.so.V shared archives only, - # so we don't have lib.a shared libs to link our executables. - # We have to force runtime linking in this case. - aix_use_runtimelinking=yes - LDFLAGS="$LDFLAGS -Wl,-brtl" - fi - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - archive_cmds='' - hardcode_direct=yes - hardcode_direct_absolute=yes - hardcode_libdir_separator=':' - link_all_deplibs=yes - file_list_spec='$wl-f,' - case $with_aix_soname,$aix_use_runtimelinking in - aix,*) ;; # traditional, no import file - svr4,* | *,yes) # use import file - # The Import File defines what to hardcode. - hardcode_direct=no - hardcode_direct_absolute=no - ;; - esac - - if test yes = "$GCC"; then - case $host_os in aix4.[012]|aix4.[012].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`$CC -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - ;; - esac - shared_flag='-shared' - if test yes = "$aix_use_runtimelinking"; then - shared_flag="$shared_flag "'$wl-G' - fi - # Need to ensure runtime linking is disabled for the traditional - # shared library, or the linker may eventually find shared libraries - # /with/ Import File - we do not want to mix them. - shared_flag_aix='-shared' - shared_flag_svr4='-shared $wl-G' - else - # not using gcc - if test ia64 = "$host_cpu"; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test yes = "$aix_use_runtimelinking"; then - shared_flag='$wl-G' - else - shared_flag='$wl-bM:SRE' - fi - shared_flag_aix='$wl-bM:SRE' - shared_flag_svr4='$wl-G' - fi - fi - - export_dynamic_flag_spec='$wl-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to export. - always_export_symbols=yes - if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag - else - if test ia64 = "$host_cpu"; then - hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' - allow_undefined_flag="-z nodefs" - archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - if test set = "${lt_cv_aix_libpath+set}"; then - aix_libpath=$lt_cv_aix_libpath -else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=/usr/lib:/lib - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - no_undefined_flag=' $wl-bernotok' - allow_undefined_flag=' $wl-berok' - if test yes = "$with_gnu_ld"; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi - archive_cmds_need_lc=yes - archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' - # -brtl affects multiple linker settings, -berok does not and is overridden later - compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' - if test svr4 != "$with_aix_soname"; then - # This is similar to how AIX traditionally builds its shared libraries. - archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' - fi - if test aix != "$with_aix_soname"; then - archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' - else - # used by -dlpreopen to get the symbols - archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' - fi - archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' - fi - fi - ;; - - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac - ;; - - bsdi[45]*) - export_dynamic_flag_spec=-rdynamic - ;; - - cygwin* | mingw* | pw32* | cegcc*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++ or Intel C++ Compiler. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - case $cc_basename in - cl* | icl*) - # Native MSVC or ICC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' - archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then - cp "$export_symbols" "$output_objdir/$soname.def"; - echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; - else - $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile=$lt_outputfile.exe - lt_tool_outputfile=$lt_tool_outputfile.exe - ;; - esac~ - if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC and ICC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=.dll - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac - ;; - - darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test yes = "$lt_cv_ld_force_load"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag=$_lt_dar_allow_undefined - case $cc_basename in - ifort*|nagfor*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test yes = "$_lt_dar_can_shared"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" - archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" - module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" - - else - ld_shlibs=no - fi - - ;; - - dgux*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor - # support. Future versions do this automatically, but an explicit c++rt0.o - # does not break anything, and helps significantly (at the cost of a little - # extra space). - freebsd2.2*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly* | midnightbsd*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - hpux9*) - if test yes = "$GCC"; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' - fi - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - export_dynamic_flag_spec='$wl-E' - ;; - - hpux10*) - if test yes,no = "$GCC,$with_gnu_ld"; then - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - fi - ;; - - hpux11*) - if test yes,no = "$GCC,$with_gnu_ld"; then - case $host_cpu in - hppa*64*) - archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - else - case $host_cpu in - hppa*64*) - archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - ia64*) - archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS=$save_LDFLAGS - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test yes = "$lt_cv_prog_compiler__b"; then - archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - - ;; - esac - fi - if test no = "$with_gnu_ld"; then - hardcode_libdir_flag_spec='$wl+b $wl$libdir' - hardcode_libdir_separator=: - - case $host_cpu in - hppa*64*|ia64*) - hardcode_direct=no - hardcode_shlibpath_var=no - ;; - *) - hardcode_direct=yes - hardcode_direct_absolute=yes - export_dynamic_flag_spec='$wl-E' - - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - - irix5* | irix6* | nonstopux*) - if test yes = "$GCC"; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS=$LDFLAGS - LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lt_cv_irix_exported_symbol=yes -else - lt_cv_irix_exported_symbol=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test yes = "$lt_cv_irix_exported_symbol"; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' - fi - else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - inherit_rpath=yes - link_all_deplibs=yes - ;; - - linux*) - case $cc_basename in - tcc*) - # Fabrice Bellard et al's Tiny C Compiler - ld_shlibs=yes - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out - else - archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - hardcode_shlibpath_var=no - ;; - - newsos6) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - hardcode_shlibpath_var=no - ;; - - *nto* | *qnx*) - ;; - - openbsd* | bitrig*) - if test -f /usr/libexec/ld.so; then - hardcode_direct=yes - hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - export_dynamic_flag_spec='$wl-E' - else - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - hardcode_libdir_flag_spec='$wl-rpath,$libdir' - fi - else - ld_shlibs=no - fi - ;; - - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - allow_undefined_flag=unsupported - shrext_cmds=.dll - archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ - $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ - $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ - $ECHO EXPORTS >> $output_objdir/$libname.def~ - prefix_cmds="$SED"~ - if test EXPORTS = "`$SED 1q $export_symbols`"; then - prefix_cmds="$prefix_cmds -e 1d"; - fi~ - prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ - cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ - $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ - emximp -o $lib $output_objdir/$libname.def' - old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' - enable_shared_with_static_runtimes=yes - file_list_spec='@' - ;; - - osf3*) - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - fi - archive_cmds_need_lc='no' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - hardcode_libdir_separator=: - ;; - - osf4* | osf5*) # as osf3* with the addition of -msym flag - if test yes = "$GCC"; then - allow_undefined_flag=' $wl-expect_unresolved $wl\*' - archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' - hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' - else - allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' - - # Both c and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - archive_cmds_need_lc='no' - hardcode_libdir_separator=: - ;; - - solaris*) - no_undefined_flag=' -z defs' - if test yes = "$GCC"; then - wlarc='$wl' - archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='$wl' - archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac - fi - hardcode_libdir_flag_spec='-R$libdir' - hardcode_shlibpath_var=no - case $host_os in - solaris2.[0-5] | solaris2.[0-5].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands '-z linker_flag'. GCC discards it without '$wl', - # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) - if test yes = "$GCC"; then - whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' - else - whole_archive_flag_spec='-z allextract$convenience -z defaultextract' - fi - ;; - esac - link_all_deplibs=yes - ;; - - sunos4*) - if test sequent = "$host_vendor"; then - # Use $CC to link under sequent, because it throws in some extra .o - # files that make .init and .fini sections work. - archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' - fi - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - hardcode_shlibpath_var=no - ;; - - sysv4) - case $host_vendor in - sni) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=yes # is this really true??? - ;; - siemens) - ## LD is ld it makes a PLAMLIB - ## CC just makes a GrossModule. - archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' - reload_cmds='$CC -r -o $output$reload_objs' - hardcode_direct=no - ;; - motorola) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - runpath_var='LD_RUN_PATH' - hardcode_shlibpath_var=no - ;; - - sysv4.3*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - export_dynamic_flag_spec='-Bexport' - ;; - - sysv4*MP*) - if test -d /usr/nec; then - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_shlibpath_var=no - runpath_var=LD_RUN_PATH - hardcode_runpath_var=yes - ld_shlibs=yes - fi - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='$wl-z,text' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We CANNOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - no_undefined_flag='$wl-z,text' - allow_undefined_flag='$wl-z,nodefs' - archive_cmds_need_lc=no - hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='$wl-R,$libdir' - hardcode_libdir_separator=':' - link_all_deplibs=yes - export_dynamic_flag_spec='$wl-Bexport' - runpath_var='LD_RUN_PATH' - - if test yes = "$GCC"; then - archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - else - archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - fi - ;; - - uts4*) - archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_shlibpath_var=no - ;; - - *) - ld_shlibs=no - ;; - esac - - if test sni = "$host_vendor"; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='$wl-Blargedynsym' - ;; - esac - fi - fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } -test no = "$ld_shlibs" && can_build_shared=no - -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - -# -# Do we need to explicitly link libc? -# -case "x$archive_cmds_need_lc" in -x|xyes) - # Assume -lc should be added - archive_cmds_need_lc=yes - - if test yes,yes = "$GCC,$enable_shared"; then - case $archive_cmds in - *'~'*) - # FIXME: we may have to deal with multi-command sequences. - ;; - '$CC '*) - # Test whether the compiler implicitly links with -lc since on some - # systems, -lgcc has to come before -lc. If gcc already passes -lc - # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc - ;; - esac - fi - ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } - -if test yes = "$GCC"; then - case $host_os in - darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; - *) lt_awk_arg='/^libraries:/' ;; - esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; - *) lt_sed_strip_eq='s|=/|/|g' ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) - # if the path contains ";" then we assume it to be the separator - # otherwise default to the standard path separator (i.e. ":") - it is - # assumed that no part of a normal pathname contains ";" but that should - # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac - # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary... - lt_tmp_lt_search_path_spec= - lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` - # ...but if some path component already ends with the multilib dir we assume - # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). - case "$lt_multi_os_dir; $lt_search_path_spec " in - "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) - lt_multi_os_dir= - ;; - esac - for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" - elif test -n "$lt_multi_os_dir"; then - test -d "$lt_sys_path" && \ - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" - fi - done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS = " "; FS = "/|\n";} { - lt_foo = ""; - lt_count = 0; - for (lt_i = NF; lt_i > 0; lt_i--) { - if ($lt_i != "" && $lt_i != ".") { - if ($lt_i == "..") { - lt_count++; - } else { - if (lt_count == 0) { - lt_foo = "/" $lt_i lt_foo; - } else { - lt_count--; - } - } - } - } - if (lt_foo != "") { lt_freq[lt_foo]++; } - if (lt_freq[lt_foo] == 1) { print lt_foo; } -}'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's|/\([A-Za-z]:\)|\1|g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` -else - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" -fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=.so -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" -need_lib_prefix=unknown -hardcode_into_libs=no - -# when you set need_version to no, make sure it does not cause -set_version -# flags to be left without arguments -need_version=unknown - - - -case $host_os in -aix3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname.a' - shlibpath_var=LIBPATH - - # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='$libname$release$shared_ext$major' - ;; - -aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - hardcode_into_libs=yes - if test ia64 = "$host_cpu"; then - # AIX 5 supports IA64 - library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - else - # With GCC up to 2.95.x, collect2 would create an import file - # for dependence libraries. The import file would start with - # the line '#! .'. This would cause the generated library to - # depend on '.', always an invalid library. This was fixed in - # development snapshots of GCC prior to 3.0. - case $host_os in - aix4 | aix4.[01] | aix4.[01].*) - if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' - echo ' yes ' - echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then - : - else - can_build_shared=no - fi - ;; - esac - # Using Import Files as archive members, it is possible to support - # filename-based versioning of shared library archives on AIX. While - # this would work for both with and without runtime linking, it will - # prevent static linking of such archives. So we do filename-based - # shared library versioning with .so extension only, which is used - # when both runtime linking and shared linking is enabled. - # Unfortunately, runtime linking may impact performance, so we do - # not want this to be the default eventually. Also, we use the - # versioned .so libs for executables only if there is the -brtl - # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. - # To allow for filename-based versioning support, we need to create - # libNAME.so.V as an archive file, containing: - # *) an Import File, referring to the versioned filename of the - # archive as well as the shared archive member, telling the - # bitwidth (32 or 64) of that shared object, and providing the - # list of exported symbols of that shared object, eventually - # decorated with the 'weak' keyword - # *) the shared object with the F_LOADONLY flag set, to really avoid - # it being seen by the linker. - # At run time we better use the real file rather than another symlink, - # but for link time we create the symlink libNAME.so -> libNAME.so.V - - case $with_aix_soname,$aix_use_runtimelinking in - # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct - # soname into executable. Probably we can add versioning support to - # collect2, so additional links can be useful in future. - aix,yes) # traditional libtool - dynamic_linker='AIX unversionable lib.so' - # If using run time linking (on AIX 4.2 or later) use lib<name>.so - # instead of lib<name>.a to let people know that these are not - # typical AIX shared libraries. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - aix,no) # traditional AIX only - dynamic_linker='AIX lib.a(lib.so.V)' - # We preserve .a as extension for shared libraries through AIX4.2 - # and later when we are not doing run time linking. - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - ;; - svr4,*) # full svr4 only - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,yes) # both, prefer svr4 - dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" - library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' - # unpreferred sharedlib libNAME.a needs extra handling - postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' - postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' - # We do not specify a path in Import Files, so LIBPATH fires. - shlibpath_overrides_runpath=yes - ;; - *,no) # both, prefer aix - dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" - library_names_spec='$libname$release.a $libname.a' - soname_spec='$libname$release$shared_ext$major' - # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling - postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' - postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' - ;; - esac - shlibpath_var=LIBPATH - fi - ;; - -amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac - ;; - -beos*) - library_names_spec='$libname$shared_ext' - dynamic_linker="$host_os ld.so" - shlibpath_var=LIBRARY_PATH - ;; - -bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" - sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" - # the default ld.so.conf also contains /usr/contrib/lib and - # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow - # libtool to hard-code these into programs - ;; - -cygwin* | mingw* | pw32* | cegcc*) - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - - case $GCC,$cc_basename in - yes,*) - # gcc - library_names_spec='$libname.dll.a' - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - - case $host_os in - cygwin*) - # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" - ;; - mingw* | cegcc*) - # MinGW DLLs use traditional 'lib' prefix - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - pw32*) - # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - ;; - esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl* | *,icl*) - # Native MSVC or ICC - libname_spec='$name' - soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' - library_names_spec='$libname.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec=$LIB - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' - ;; - - *) - # Assume MSVC and ICC wrapper - library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' - dynamic_linker='Win32 ld.exe' - ;; - esac - # FIXME: first we should search . and the directory the executable is in - shlibpath_var=PATH - ;; - -darwin* | rhapsody*) - dynamic_linker="$host_os dyld" - version_type=darwin - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' - soname_spec='$libname$release$major$shared_ext' - shlibpath_overrides_runpath=yes - shlibpath_var=DYLD_LIBRARY_PATH - shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" - sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' - ;; - -dgux*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -freebsd* | dragonfly* | midnightbsd*) - # DragonFly does not have aout. When/if they implement a new - # versioning mechanism, adjust this. - if test -x /usr/bin/objformat; then - objformat=`/usr/bin/objformat` - else - case $host_os in - freebsd[23].*) objformat=aout ;; - *) objformat=elf ;; - esac - fi - version_type=freebsd-$objformat - case $version_type in - freebsd-elf*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - need_version=no - need_lib_prefix=no - ;; - freebsd-*) - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - need_version=yes - ;; - esac - shlibpath_var=LD_LIBRARY_PATH - case $host_os in - freebsd2.*) - shlibpath_overrides_runpath=yes - ;; - freebsd3.[01]* | freebsdelf3.[01]*) - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ - freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - *) # from 4.6 on, and DragonFly - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - esac - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=no - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' - hardcode_into_libs=yes - ;; - -hpux9* | hpux10* | hpux11*) - # Give a soname corresponding to the major version so that dld.sl refuses to - # link against other versions. - version_type=sunos - need_lib_prefix=no - need_version=no - case $host_cpu in - ia64*) - shrext_cmds='.so' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.so" - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - if test 32 = "$HPUX_IA64_MODE"; then - sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" - sys_lib_dlsearch_path_spec=/usr/lib/hpux32 - else - sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" - sys_lib_dlsearch_path_spec=/usr/lib/hpux64 - fi - ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) - shrext_cmds='.sl' - dynamic_linker="$host_os dld.sl" - shlibpath_var=SHLIB_PATH - shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - ;; - esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... - postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 - ;; - -interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -irix5* | irix6* | nonstopux*) - case $host_os in - nonstopux*) version_type=nonstopux ;; - *) - if test yes = "$lt_cv_prog_gnu_ld"; then - version_type=linux # correct to gnu/linux during the next big refactor - else - version_type=irix - fi ;; - esac - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' - case $host_os in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in # libtool.m4 will add one of these switches to LD - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") - libsuff= shlibsuff= libmagic=32-bit;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") - libsuff=32 shlibsuff=N32 libmagic=N32;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") - libsuff=64 shlibsuff=64 libmagic=64-bit;; - *) libsuff= shlibsuff= libmagic=never-match;; - esac - ;; - esac - shlibpath_var=LD_LIBRARY${shlibsuff}_PATH - shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" - sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" - hardcode_into_libs=yes - ;; - -# No shared lib support for Linux oldld, aout, or coff. -linux*oldld* | linux*aout* | linux*coff*) - dynamic_linker=no - ;; - -linux*android*) - version_type=none # Android doesn't support versioned libraries. - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext' - soname_spec='$libname$release$shared_ext' - finish_cmds= - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - dynamic_linker='Android linker' - # Don't embed -rpath directories since the linker doesn't support them. - hardcode_libdir_flag_spec='-L$libdir' - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : - lt_cv_shlibpath_overrides_runpath=yes -fi -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - - # This implies no fast_install, which is unacceptable. - # Some rework will be needed to allow for fast_install - # before this can be enabled. - hardcode_into_libs=yes - - # Ideally, we could use ldconfig to report *all* directores which are - # searched for libraries, however this is still not possible. Aside from not - # being certain /sbin/ldconfig is available, command - # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, - # even though it is searched at run-time. Try to do the best guess by - # appending ld.so.conf contents (and includes) to the search path. - if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` - sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" - fi - - # We used to test for /lib/ld.so.1 and disable shared libraries on - # powerpc, because MkLinux only supported shared libraries with the - # GNU dynamic linker. Since this was broken with cross compilers, - # most powerpc-linux boxes support dynamic linking these days and - # people can always --disable-shared, the test was removed, and we - # assume the GNU/Linux dynamic linker is in use. - dynamic_linker='GNU/Linux ld.so' - ;; - -netbsd*) - version_type=sunos - need_lib_prefix=no - need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - dynamic_linker='NetBSD (a.out) ld.so' - else - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - dynamic_linker='NetBSD ld.elf_so' - fi - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - ;; - -newsos6) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -*nto* | *qnx*) - version_type=qnx - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' - ;; - -openbsd* | bitrig*) - version_type=sunos - sys_lib_dlsearch_path_spec=/usr/lib - need_lib_prefix=no - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then - need_version=no - else - need_version=yes - fi - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - ;; - -os2*) - libname_spec='$name' - version_type=windows - shrext_cmds=.dll - need_version=no - need_lib_prefix=no - # OS/2 can only load a DLL with a base name of 8 characters or less. - soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; - v=$($ECHO $release$versuffix | tr -d .-); - n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); - $ECHO $n$v`$shared_ext' - library_names_spec='${libname}_dll.$libext' - dynamic_linker='OS/2 ld.exe' - shlibpath_var=BEGINLIBPATH - sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - postinstall_cmds='base_file=`basename \$file`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - ;; - -osf3* | osf4* | osf5*) - version_type=osf - need_lib_prefix=no - need_version=no - soname_spec='$libname$release$shared_ext$major' - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - -rdos*) - dynamic_linker=no - ;; - -solaris*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - # ldd complains unless libraries are executable - postinstall_cmds='chmod +x $lib' - ;; - -sunos4*) - version_type=sunos - library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' - finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - if test yes = "$with_gnu_ld"; then - need_lib_prefix=no - fi - need_version=yes - ;; - -sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - case $host_vendor in - sni) - shlibpath_overrides_runpath=no - need_lib_prefix=no - runpath_var=LD_RUN_PATH - ;; - siemens) - need_lib_prefix=no - ;; - motorola) - need_lib_prefix=no - need_version=no - shlibpath_overrides_runpath=no - sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' - ;; - esac - ;; - -sysv4*MP*) - if test -d /usr/nec; then - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' - soname_spec='$libname$shared_ext.$major' - shlibpath_var=LD_LIBRARY_PATH - fi - ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=sco - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes - hardcode_into_libs=yes - if test yes = "$with_gnu_ld"; then - sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' - else - sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' - case $host_os in - sco3.2v5*) - sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" - ;; - esac - fi - sys_lib_dlsearch_path_spec='/usr/lib' - ;; - -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -uts4*) - version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' - soname_spec='$libname$release$shared_ext$major' - shlibpath_var=LD_LIBRARY_PATH - ;; - -*) - dynamic_linker=no - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } -test no = "$dynamic_linker" && can_build_shared=no - -variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test yes = "$GCC"; then - variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" -fi - -if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then - sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec -fi - -if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then - sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec -fi - -# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... -configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec - -# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code -func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" - -# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool -configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } -hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || - test yes = "$hardcode_automatic"; then - - # We can hardcode non-existent directories. - if test no != "$hardcode_direct" && - # If the only mechanism to avoid hardcoding is shlibpath_var, we - # have to relink, otherwise we might link with an installed library - # when we should be linking with a yet-to-be-installed one - ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && - test no != "$hardcode_minus_L"; then - # Linking always hardcodes the temporary library directory. - hardcode_action=relink - else - # We can link without hardcoding, and we can hardcode nonexisting dirs. - hardcode_action=immediate - fi -else - # We cannot hardcode anything, or else we can only hardcode existing - # directories. - hardcode_action=unsupported -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } - -if test relink = "$hardcode_action" || - test yes = "$inherit_rpath"; then - # Fast installation is not supported - enable_fast_install=no -elif test yes = "$shlibpath_overrides_runpath" || - test no = "$enable_shared"; then - # Fast installation is not necessary - enable_fast_install=needless -fi - - - - - - - if test yes != "$enable_dlopen"; then - enable_dlopen=unknown - enable_dlopen_self=unknown - enable_dlopen_self_static=unknown -else - lt_cv_dlopen=no - lt_cv_dlopen_libs= - - case $host_os in - beos*) - lt_cv_dlopen=load_add_on - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - ;; - - mingw* | pw32* | cegcc*) - lt_cv_dlopen=LoadLibrary - lt_cv_dlopen_libs= - ;; - - cygwin*) - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - ;; - - darwin*) - # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - - lt_cv_dlopen=dyld - lt_cv_dlopen_libs= - lt_cv_dlopen_self=yes - -fi - - ;; - - tpf*) - # Don't try to run any link tests for TPF. We know it's impossible - # because TPF is a cross-compiler, and we know how we open DSOs. - lt_cv_dlopen=dlopen - lt_cv_dlopen_libs= - lt_cv_dlopen_self=no - ;; - - *) - ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : - lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char shl_load (); -int -main () -{ -return shl_load (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_shl_load=yes -else - ac_cv_lib_dld_shl_load=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : - lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : - lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dl_dlopen=yes -else - ac_cv_lib_dl_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsvld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dlopen (); -int -main () -{ -return dlopen (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_svld_dlopen=yes -else - ac_cv_lib_svld_dlopen=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : - lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldld $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char dld_link (); -int -main () -{ -return dld_link (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dld_dld_link=yes -else - ac_cv_lib_dld_dld_link=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : - lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld -fi - - -fi - - -fi - - -fi - - -fi - - -fi - - ;; - esac - - if test no = "$lt_cv_dlopen"; then - enable_dlopen=no - else - enable_dlopen=yes - fi - - case $lt_cv_dlopen in - dlopen) - save_CPPFLAGS=$CPPFLAGS - test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - - save_LDFLAGS=$LDFLAGS - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - - save_LIBS=$LIBS - LIBS="$lt_cv_dlopen_libs $LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } - - if test yes = "$lt_cv_dlopen_self"; then - wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test yes = "$cross_compiling"; then : - lt_cv_dlopen_self_static=cross -else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" -#include "confdefs.h" - -#if HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -#include <stdio.h> - -#ifdef RTLD_GLOBAL -# define LT_DLGLOBAL RTLD_GLOBAL -#else -# ifdef DL_GLOBAL -# define LT_DLGLOBAL DL_GLOBAL -# else -# define LT_DLGLOBAL 0 -# endif -#endif - -/* We may have to define LT_DLLAZY_OR_NOW in the command line if we - find out it does not work in some platform. */ -#ifndef LT_DLLAZY_OR_NOW -# ifdef RTLD_LAZY -# define LT_DLLAZY_OR_NOW RTLD_LAZY -# else -# ifdef DL_LAZY -# define LT_DLLAZY_OR_NOW DL_LAZY -# else -# ifdef RTLD_NOW -# define LT_DLLAZY_OR_NOW RTLD_NOW -# else -# ifdef DL_NOW -# define LT_DLLAZY_OR_NOW DL_NOW -# else -# define LT_DLLAZY_OR_NOW 0 -# endif -# endif -# endif -# endif -#endif - -/* When -fvisibility=hidden is used, assume the code has been annotated - correspondingly for the symbols needed. */ -#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); -#endif - -int fnord () { return 42; } -int main () -{ - void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); - int status = $lt_dlunknown; - - if (self) - { - if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } - /* dlclose (self); */ - } - else - puts (dlerror ()); - - return status; -} -_LT_EOF - if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then - (./conftest; exit; ) >&5 2>/dev/null - lt_status=$? - case x$lt_status in - x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; - x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; - esac - else : - # compilation failed - lt_cv_dlopen_self_static=no - fi -fi -rm -fr conftest* - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } - fi - - CPPFLAGS=$save_CPPFLAGS - LDFLAGS=$save_LDFLAGS - LIBS=$save_LIBS - ;; - esac - - case $lt_cv_dlopen_self in - yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; - *) enable_dlopen_self=unknown ;; - esac - - case $lt_cv_dlopen_self_static in - yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; - *) enable_dlopen_self_static=unknown ;; - esac -fi - - - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -z "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -else - if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - old_striplib="$STRIP --strip-debug" - striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - case $host_os in - darwin*) - # FIXME - insert some real tests, host_os isn't really good enough - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - freebsd*) - if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then - old_striplib="$STRIP --strip-debug" - striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac - fi -fi - - - - - - - - - - - - - # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } - test no = "$can_build_shared" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test yes = "$enable_shared" && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[4-9]*) - if test ia64 != "$host_cpu"; then - case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in - yes,aix,yes) ;; # shared object as lib.so file only - yes,svr4,*) ;; # shared object as lib.so archive member only - yes,*) enable_static=no ;; # shared object in lib.a archive as well - esac - fi - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } - - - - -fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -CC=$lt_save_CC - - - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - - -OURCPPFLAGS='' -CPPFLAGS=${CPPFLAGS:-${OURCPPFLAGS}} -CFLAGS="$CFLAGS" - -# Checks for programs. -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. -set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -else - CC="$ac_cv_prog_CC" -fi - -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. -set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - fi -fi -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - ac_prog_rejected=no -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# != 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" - fi -fi -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - for ac_prog in cl.exe - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CC" && break - done -fi -if test -z "$CC"; then - ac_ct_CC=$CC - for ac_prog in cl.exe -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ac_ct_CC" && break -done - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi - - -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } - -# Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 -set X $ac_compile -ac_compiler=$2 -for ac_option in --version -v -V -qversion; do - { { ac_try="$ac_compiler $ac_option >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compiler $ac_option >&5") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - sed '10a\ -... rest of stderr output deleted ... - 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_compiler_gnu=yes -else - ac_compiler_gnu=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_c_compiler_gnu=$ac_compiler_gnu - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } -if test $ac_compiler_gnu = yes; then - GCC=yes -else - GCC= -fi -ac_test_CFLAGS=${CFLAGS+set} -ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_save_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - ac_cv_prog_cc_g=no - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -else - CFLAGS="" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - -else - ac_c_werror_flag=$ac_save_c_werror_flag - CFLAGS="-g" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_g=yes -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_c_werror_flag=$ac_save_c_werror_flag -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdarg.h> -#include <stdio.h> -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} -_ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_prog_cc_c89=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c89" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC - -fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $CC dependency flag" >&5 -$as_echo_n "checking $CC dependency flag... " >&6; } -echo 'void f(){}' >conftest.c -if test "`$CC -MM conftest.c 2>&1`" = "conftest.o: conftest.c"; then - DEPFLAG="-MM" -else - if test "`$CC -xM1 conftest.c 2>&1`" = "conftest.o: conftest.c"; then - DEPFLAG="-xM1" - else - DEPFLAG="-MM" # dunno do something - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEPFLAG" >&5 -$as_echo "$DEPFLAG" >&6; } -rm -f conftest.c - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - - -# Extra (sp)lint flags for NetBSD - -case "$host_os" in - netbsd*) LINTFLAGS="'-D__RENAME(x)=' -D_NETINET_IN_H_ $LINTFLAGS" - ;; - *) LINTFLAGS="$LINTFLAGS" - ;; -esac - - - -$as_echo "#define WINVER 0x0502" >>confdefs.h - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -std=c99" >&5 -$as_echo_n "checking whether $CC supports -std=c99... " >&6; } -cache=`echo std=c99 | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -std=c99 -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -C99FLAG="-std=c99" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -xc99" >&5 -$as_echo_n "checking whether $CC supports -xc99... " >&6; } -cache=`echo xc99 | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -xc99 -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -C99FLAG="-xc99" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - -# routine to copy files -# argument 1 is a list of files (relative to the source dir) -# argument 2 is a destination directory (relative to the current -# working directory - - -# copy all .h files in the dir at argument 1 -# (relative to source) to the dir at argument 2 -# (relative to current dir) - - -# Checks for typedefs, structures, and compiler characteristics. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 -$as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - -#ifndef __cplusplus - /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; - const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; - /* NEC SVR4.0.2 mips cc rejects this. */ - struct point {int x, y;}; - static struct point const zero = {0,0}; - /* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in - an arm of an if-expression whose if-part is not a constant - expression */ - const char *g = "string"; - pcpcc = &g + (g ? g-g : 0); - /* HPUX 7.0 cc rejects these. */ - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; - { /* SCO 3.2v4 cc rejects this sort of thing. */ - char tx; - char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; - if (s) return 0; - } - { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; - } - { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; - } - { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; } bx; - struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 -$as_echo "$ac_cv_c_const" >&6; } -if test $ac_cv_c_const = no; then - -$as_echo "#define const /**/" >>confdefs.h - -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -if test "x$CFLAGS" = "x" ; then - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -g" >&5 -$as_echo_n "checking whether $CC supports -g... " >&6; } -cache=`echo g | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -g -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-g" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -O2" >&5 -$as_echo_n "checking whether $CC supports -O2... " >&6; } -cache=`echo O2 | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -O2 -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-O2 $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wall" >&5 -$as_echo_n "checking whether $CC supports -Wall... " >&6; } -cache=`echo Wall | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wall -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-Wall $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -W" >&5 -$as_echo_n "checking whether $CC supports -W... " >&6; } -cache=`echo W | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -W -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-W $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wwrite-strings" >&5 -$as_echo_n "checking whether $CC supports -Wwrite-strings... " >&6; } -cache=`echo Wwrite-strings | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wwrite-strings -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-Wwrite-strings $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wstrict-prototypes" >&5 -$as_echo_n "checking whether $CC supports -Wstrict-prototypes... " >&6; } -cache=`echo Wstrict-prototypes | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wstrict-prototypes -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-Wstrict-prototypes $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - -#ACX_CHECK_COMPILER_FLAG(Wshadow, [CFLAGS="-Wshadow $CFLAGS"]) - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wunused-function" >&5 -$as_echo_n "checking whether $CC supports -Wunused-function... " >&6; } -cache=`echo Wunused-function | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wunused-function -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-Wunused-function $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wmissing-prototypes" >&5 -$as_echo_n "checking whether $CC supports -Wmissing-prototypes... " >&6; } -cache=`echo Wmissing-prototypes | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wmissing-prototypes -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="-Wmissing-prototypes $CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - -for ac_header in getopt.h time.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -# MinGW32 tests -for ac_header in winsock2.h ws2tcpip.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -# end mingw32 tests - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Werror" >&5 -$as_echo_n "checking whether $CC supports -Werror... " >&6; } -cache=`echo Werror | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Werror -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -ERRFLAG="-Werror" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: -ERRFLAG="-errwarn" -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wall" >&5 -$as_echo_n "checking whether $CC supports -Wall... " >&6; } -cache=`echo Wall | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wall -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -ERRFLAG="$ERRFLAG -Wall" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: -ERRFLAG="$ERRFLAG -errfmt" -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -std=c99" >&5 -$as_echo_n "checking whether $CC supports -std=c99... " >&6; } -cache=`echo std=c99 | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -std=c99 -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -C99FLAG="-std=c99" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -xc99" >&5 -$as_echo_n "checking whether $CC supports -xc99... " >&6; } -cache=`echo xc99 | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -xc99 -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -C99FLAG="-xc99" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - -for ac_header in getopt.h time.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE as a flag for $CC" >&5 -$as_echo_n "checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE as a flag for $CC... " >&6; } -cache=`$as_echo "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE" | $as_tr_sh` -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include "confdefs.h" -#include <stdlib.h> -#include <ctype.h> -#include <sys/time.h> -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#include <unistd.h> -#include <netdb.h> -#ifdef HAVE_GETOPT_H -#include <getopt.h> -#endif - -int test() { - int a; - char **opts = NULL; - struct timeval tv; - char *t; - time_t time = 0; - char *buf = NULL; - const char* str = NULL; - struct msghdr msg; - msg.msg_control = 0; - t = ctime_r(&time, buf); - tv.tv_usec = 10; - srandom(32); - a = getopt(2, opts, "a"); - a = isascii(32); - str = gai_strerror(0); - if(str && t && tv.tv_usec && msg.msg_control) - a = 0; - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE as a flag for $CC" >&5 -$as_echo_n "checking whether we need $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE as a flag for $CC... " >&6; } -cache=`$as_echo "$C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE" | $as_tr_sh` -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include "confdefs.h" -#include <stdlib.h> -#include <ctype.h> -#include <sys/time.h> -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#include <unistd.h> -#include <netdb.h> -#ifdef HAVE_GETOPT_H -#include <getopt.h> -#endif - -int test() { - int a; - char **opts = NULL; - struct timeval tv; - char *t; - time_t time = 0; - char *buf = NULL; - const char* str = NULL; - struct msghdr msg; - msg.msg_control = 0; - t = ctime_r(&time, buf); - tv.tv_usec = 10; - srandom(32); - a = getopt(2, opts, "a"); - a = isascii(32); - str = gai_strerror(0); - if(str && t && tv.tv_usec && msg.msg_control) - a = 0; - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG -D__EXTENSIONS__ -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ALL_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need $C99FLAG as a flag for $CC" >&5 -$as_echo_n "checking whether we need $C99FLAG as a flag for $CC... " >&6; } -cache=`$as_echo "$C99FLAG" | $as_tr_sh` -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include <stdbool.h> -#include <ctype.h> -int test() { - int a = 0; - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS $C99FLAG $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS $C99FLAG" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS $C99FLAG $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS $C99FLAG $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -D_BSD_SOURCE -D_DEFAULT_SOURCE as a flag for $CC" >&5 -$as_echo_n "checking whether we need -D_BSD_SOURCE -D_DEFAULT_SOURCE as a flag for $CC... " >&6; } -cache=_D_BSD_SOURCE__D_DEFAULT_SOURCE -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include <ctype.h> - -int test() { - int a; - a = isascii(32); - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_BSD_SOURCE -D_DEFAULT_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -D_GNU_SOURCE as a flag for $CC" >&5 -$as_echo_n "checking whether we need -D_GNU_SOURCE as a flag for $CC... " >&6; } -cache=_D_GNU_SOURCE -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include <netinet/in.h> - -int test() { - struct in6_pktinfo inf; - int a = (int)sizeof(inf); - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS -D_GNU_SOURCE" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - -# check again for GNU_SOURCE for setresgid. May fail if setresgid -# is not available at all. -D_FRSRESGID is to make this check unique. -# otherwise we would get the previous cached result. - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -D_GNU_SOURCE -D_FRSRESGID as a flag for $CC" >&5 -$as_echo_n "checking whether we need -D_GNU_SOURCE -D_FRSRESGID as a flag for $CC... " >&6; } -cache=_D_GNU_SOURCE__D_FRSRESGID -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include <unistd.h> - -int test() { - int a = setresgid(0,0,0); - a = setresuid(0,0,0); - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE -D_FRSRESGID $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE -D_FRSRESGID $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE -D_FRSRESGID $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS -D_GNU_SOURCE" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE -D_FRSRESGID $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_GNU_SOURCE -D_FRSRESGID $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -D_POSIX_C_SOURCE=200112 as a flag for $CC" >&5 -$as_echo_n "checking whether we need -D_POSIX_C_SOURCE=200112 as a flag for $CC... " >&6; } -cache=_D_POSIX_C_SOURCE_200112 -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include "confdefs.h" -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#include <netdb.h> - -int test() { - int a = 0; - char *t; - time_t time = 0; - char *buf = NULL; - const char* str = NULL; - t = ctime_r(&time, buf); - str = gai_strerror(0); - if(t && str) - a = 0; - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS -D_POSIX_C_SOURCE=200112 $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_POSIX_C_SOURCE=200112 $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_POSIX_C_SOURCE=200112 $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS -D_POSIX_C_SOURCE=200112" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D_POSIX_C_SOURCE=200112 $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D_POSIX_C_SOURCE=200112 $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need -D__EXTENSIONS__ as a flag for $CC" >&5 -$as_echo_n "checking whether we need -D__EXTENSIONS__ as a flag for $CC... " >&6; } -cache=_D__EXTENSIONS__ -if eval \${cv_prog_cc_flag_needed_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo ' -#include "confdefs.h" -#include <stdlib.h> -#include <ctype.h> -#include <sys/time.h> -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#include <unistd.h> -#ifdef HAVE_GETOPT_H -#include <getopt.h> -#endif - -int test() { - int a; - char **opts = NULL; - struct timeval tv; - tv.tv_usec = 10; - srandom(32); - a = getopt(2, opts, "a"); - a = isascii(32); - if(tv.tv_usec) - a = 0; - return a; -} -' > conftest.c -echo 'void f(){}' >>conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=no" -else - -if test -z "`$CC $CPPFLAGS $CFLAGS -D__EXTENSIONS__ $ERRFLAG -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_needed_$cache=yes" -else -eval "cv_prog_cc_flag_needed_$cache=fail" -#echo 'Test with flag fails too!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D__EXTENSIONS__ $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D__EXTENSIONS__ $ERRFLAG -c conftest.c 2>&1` -#exit 1 -fi - -fi -rm -f conftest conftest.c conftest.o - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -CFLAGS="$CFLAGS -D__EXTENSIONS__" -else -if eval "test \"`echo '$cv_prog_cc_flag_needed_'$cache`\" = no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -#echo 'Test with flag is no!' -#cat conftest.c -#echo "$CC $CPPFLAGS $CFLAGS -D__EXTENSIONS__ $ERRFLAG -c conftest.c 2>&1" -#echo `$CC $CPPFLAGS $CFLAGS -D__EXTENSIONS__ $ERRFLAG -c conftest.c 2>&1` -#exit 1 -: - -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } -: - -fi -fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __cplusplus -typedef int foo_t; -static $ac_kw foo_t static_foo () {return 0; } -$ac_kw foo_t foo () {return 0; } -#endif - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_inline=$ac_kw -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - test "$ac_cv_c_inline" != no && break -done - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 -$as_echo "$ac_cv_c_inline" >&6; } - -case $ac_cv_c_inline in - inline | yes) ;; - *) - case $ac_cv_c_inline in - no) ac_val=;; - *) ac_val=$ac_cv_c_inline;; - esac - cat >>confdefs.h <<_ACEOF -#ifndef __cplusplus -#define inline $ac_val -#endif -_ACEOF - ;; -esac - -ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default" -if test "x$ac_cv_type_int8_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define int8_t char -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default" -if test "x$ac_cv_type_int16_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define int16_t short -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default" -if test "x$ac_cv_type_int32_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define int32_t int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "int64_t" "ac_cv_type_int64_t" "$ac_includes_default" -if test "x$ac_cv_type_int64_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define int64_t long long -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "uint8_t" "ac_cv_type_uint8_t" "$ac_includes_default" -if test "x$ac_cv_type_uint8_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define uint8_t unsigned char -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "uint16_t" "ac_cv_type_uint16_t" "$ac_includes_default" -if test "x$ac_cv_type_uint16_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define uint16_t unsigned short -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default" -if test "x$ac_cv_type_uint32_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define uint32_t unsigned int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" -if test "x$ac_cv_type_uint64_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define uint64_t unsigned long long -_ACEOF - -fi - - -# my own checks -# Extract the first word of "doxygen", so it can be a program name with args. -set dummy doxygen; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_doxygen+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$doxygen"; then - ac_cv_prog_doxygen="$doxygen" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_doxygen="doxygen" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -doxygen=$ac_cv_prog_doxygen -if test -n "$doxygen"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doxygen" >&5 -$as_echo "$doxygen" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - -# check to see if libraries are needed for these functions. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char socket (); -int -main () -{ -return socket (); - ; - return 0; -} -_ACEOF -for ac_lib in '' socket; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_socket=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : - break -fi -done -if ${ac_cv_search_socket+:} false; then : - -else - ac_cv_search_socket=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } -ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_pton" >&5 -$as_echo_n "checking for library containing inet_pton... " >&6; } -if ${ac_cv_search_inet_pton+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char inet_pton (); -int -main () -{ -return inet_pton (); - ; - return 0; -} -_ACEOF -for ac_lib in '' nsl; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_inet_pton=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_inet_pton+:} false; then : - break -fi -done -if ${ac_cv_search_inet_pton+:} false; then : - -else - ac_cv_search_inet_pton=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_pton" >&5 -$as_echo "$ac_cv_search_inet_pton" >&6; } -ac_res=$ac_cv_search_inet_pton -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - - - - -# Check whether --with-drill was given. -if test "${with_drill+set}" = set; then : - withval=$with_drill; -else - with_drill="no" -fi - -if test x_$with_drill != x_no ; then - DRILL=drill - - INSTALL_DRILL=install-drill - - UNINSTALL_DRILL=uninstall-drill - - CLEAN_DRILL=clean-drill - - LINT_DRILL=lint-drill - - if test -e $srcdir/drill/config.h -o -e drill/config.h ; then - as_fn_error $? " -A config.h was detected in the drill subdirectory. -This does not work with the --with-drill option. -Please remove the config.h from the drill subdirectory -or do not use the --with-drill option." "$LINENO" 5 - fi -else - DRILL="" - - INSTALL_DRILL="" - - UNINSTALL_DRILL="" - - CLEAN_DRILL="" - - LINT_DRILL="" - -fi - - - -# Check whether --with-examples was given. -if test "${with_examples+set}" = set; then : - withval=$with_examples; -else - with_examples="no" -fi - -if test x_$with_examples != x_no ; then - EXAMPLES=examples - - INSTALL_EXAMPLES=install-examples - - UNINSTALL_EXAMPLES=uninstall-examples - - CLEAN_EXAMPLES=clean-examples - - LINT_EXAMPLES=lint-examples - - if test -e $srcdir/examples/config.h -o -e examples/config.h ; then - as_fn_error $? " -A config.h was detected in the examples subdirectory. -This does not work with the --with-examples option. -Please remove the config.h from the examples subdirectory -or do not use the --with-examples option." "$LINENO" 5 - fi -else - EXAMPLES="" - - INSTALL_EXAMPLES="" - - UNINSTALL_EXAMPLES="" - - CLEAN_EXAMPLES="" - - LINT_EXAMPLES="" - -fi - -# add option to disable installation of ldns-config script -# Check whether --enable-ldns-config was given. -if test "${enable_ldns_config+set}" = set; then : - enableval=$enable_ldns_config; enable_ldns_config=$enableval -else - enable_ldns_config=yes -fi - -if test "x$enable_ldns_config" = xyes; then - INSTALL_CONFIG=install-config - - INSTALL_CONFIG_MANPAGE=install-config-manpage - - UNINSTALL_CONFIG=uninstall-config - - UNINSTALL_CONFIG_MANPAGE=uninstall-config-manpage - -else - INSTALL_CONFIG="" - - INSTALL_CONFIG_MANPAGE="" - - UNINSTALL_CONFIG="" - - UNINSTALL_CONFIG_MANPAGE="" - -fi - -# add option to disable library printing to stderr -# Check whether --enable-stderr-msgs was given. -if test "${enable_stderr_msgs+set}" = set; then : - enableval=$enable_stderr_msgs; enable_stderr_msgs=$enableval -else - enable_stderr_msgs=no -fi - -case "$enable_stderr_msgs" in - no) ;; - *) - -cat >>confdefs.h <<_ACEOF -#define STDERR_MSGS 1 -_ACEOF - - ;; -esac - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for poll(2)" >&5 -$as_echo_n "checking for poll(2)... " >&6; } - if ${ax_cv_have_poll+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - #include <poll.h> -int -main () -{ -int rc; rc = poll((struct pollfd *)(0), 0, 0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ax_cv_have_poll=yes -else - ax_cv_have_poll=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi - - if test "${ax_cv_have_poll}" = "yes"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ax_config_feature_poll=yes - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ax_config_feature_poll=no - -fi - - -# Check whether --enable-poll was given. -if test "${enable_poll+set}" = set; then : - enableval=$enable_poll; -case "${enableval}" in - yes) - ax_config_feature_poll="yes" - ;; - no) - ax_config_feature_poll="no" - ;; - *) - as_fn_error $? "bad value ${enableval} for feature --poll" "$LINENO" 5 - ;; -esac - -fi - - -if test "$ax_config_feature_poll" = yes; then : - $as_echo "#define HAVE_POLL 1" >>confdefs.h - - - if test "$ax_config_feature_verbose" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: Feature poll is enabled" >&5 -$as_echo "$as_me: Feature poll is enabled" >&6;} - -fi - -else - - if test "$ax_config_feature_verbose" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: Feature poll is disabled" >&5 -$as_echo "$as_me: Feature poll is disabled" >&6;} - -fi - -fi - - - - - -# check for python -PYTHON_X_CFLAGS="" -ldns_with_pyldns=no -ldns_with_pyldnsx=no - -# Check whether --with-pyldns was given. -if test "${with_pyldns+set}" = set; then : - withval=$with_pyldns; -else - withval="no" -fi - -ldns_have_python=no -if test x_$withval != x_no; then - # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PYTHON_DEVEL([version]) -# -# DESCRIPTION -# -# Note: Defines as a precious variable "PYTHON_VERSION". Don't override it -# in your configure.ac. -# -# This macro checks for Python and tries to get the include path to -# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS) -# output variables. It also exports $(PYTHON_EXTRA_LIBS) and -# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code. -# -# You can search for some particular version of Python by passing a -# parameter to this macro, for example ">= '2.3.1'", or "== '2.4'". Please -# note that you *have* to pass also an operator along with the version to -# match, and pay special attention to the single quotes surrounding the -# version number. Don't use "PYTHON_VERSION" for this: that environment -# variable is declared as precious and thus reserved for the end-user. -# -# This macro should work for all versions of Python >= 2.1.0. As an end -# user, you can disable the check for the python version by setting the -# PYTHON_NOVERSIONCHECK environment variable to something else than the -# empty string. -# -# If you need to use this macro for an older Python version, please -# contact the authors. We're always open for feedback. -# -# LICENSE -# -# Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de> -# Copyright (c) 2009 Alan W. Irwin -# Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net> -# Copyright (c) 2009 Andrew Collier -# Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org> -# Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org> -# Copyright (c) 2013 Daniel Mullner <muellner@math.stanford.edu> -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 16 - -# This is what autoupdate's m4 run will expand. It fires -# the warning (with _au_warn_XXX), outputs it into the -# updated configure.ac (with AC_DIAGNOSE), and then outputs -# the replacement expansion. - - -# This is an auxiliary macro that is also run when -# autoupdate runs m4. It simply calls m4_warning, but -# we need a wrapper so that each warning is emitted only -# once. We break the quoting in m4_warning's argument in -# order to expand this macro's arguments, not AU_DEFUN's. - - -# Finally, this is the expansion that is picked up by -# autoconf. It tells the user to run autoupdate, and -# then outputs the replacement expansion. We do not care -# about autoupdate's warning because that contains -# information on what to do *after* running autoupdate. - - - - ac_save_LIBS="$LIBS" - - # - # Allow the use of a (user set) custom python version - # - - - # Extract the first word of "python[$PYTHON_VERSION]", so it can be a program name with args. -set dummy python$PYTHON_VERSION; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PYTHON+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PYTHON in - [\\/]* | ?:[\\/]*) - ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PYTHON=$ac_cv_path_PYTHON -if test -n "$PYTHON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 -$as_echo "$PYTHON" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test -z "$PYTHON"; then - as_fn_error $? "Cannot find python$PYTHON_VERSION in your system path" "$LINENO" 5 - PYTHON_VERSION="" - fi - - # - # Check for a version of Python >= 2.1.0 - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.1.0'" >&5 -$as_echo_n "checking for a version of Python >= '2.1.0'... " >&6; } - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[0]; \ - print (ver >= '2.1.0')"` - if test "$ac_supports_python_ver" != "True"; then - if test -z "$PYTHON_NOVERSIONCHECK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? " -This version of the AC_PYTHON_DEVEL macro -doesn't work properly with versions of Python before -2.1.0. You may need to re-run configure, setting the -variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG, -PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. -Moreover, to disable this check, set PYTHON_NOVERSIONCHECK -to something else than an empty string. - -See \`config.log' for more details" "$LINENO" 5; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: skip at user request" >&5 -$as_echo "skip at user request" >&6; } - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - - # - # if the macro parameter ``version'' is set, honour it - # - if test -n ">= '2.4.0'"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.4.0'" >&5 -$as_echo_n "checking for a version of Python >= '2.4.0'... " >&6; } - ac_supports_python_ver=`$PYTHON -c "import sys; \ - ver = sys.version.split ()[0]; \ - print (ver >= '2.4.0')"` - if test "$ac_supports_python_ver" = "True"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "this package requires Python >= '2.4.0'. -If you have it installed, but it isn't the default Python -interpreter in your system path, please pass the PYTHON_VERSION -variable to configure. See \`\`configure --help'' for reference. -" "$LINENO" 5 - PYTHON_VERSION="" - fi - fi - - # - # Check if you have distutils, else fail - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the distutils Python package" >&5 -$as_echo_n "checking for the distutils Python package... " >&6; } - ac_distutils_result=`$PYTHON -c "import distutils" 2>&1` - if test -z "$ac_distutils_result"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "cannot import Python module \"distutils\". -Please check your Python installation. The error was: -$ac_distutils_result" "$LINENO" 5 - PYTHON_VERSION="" - fi - - # - # Check for Python include path - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python include path" >&5 -$as_echo_n "checking for Python include path... " >&6; } - if test -z "$PYTHON_CPPFLAGS"; then - python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc ());"` - plat_python_path=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_inc (plat_specific=1));"` - if test -n "${python_path}"; then - if test "${plat_python_path}" != "${python_path}"; then - python_path="-I$python_path -I$plat_python_path" - else - python_path="-I$python_path" - fi - fi - PYTHON_CPPFLAGS=$python_path - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5 -$as_echo "$PYTHON_CPPFLAGS" >&6; } - - - # - # Check for Python library path - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library path" >&5 -$as_echo_n "checking for Python library path... " >&6; } - if test -z "$PYTHON_LDFLAGS"; then - # (makes two attempts to ensure we've got a version number - # from the interpreter) - ac_python_version=`cat<<EOD | $PYTHON - - -# join all versioning strings, on some systems -# major/minor numbers could be in different list elements -from distutils.sysconfig import * -e = get_config_var('VERSION') -if e is not None: - print(e) -EOD` - - if test -z "$ac_python_version"; then - if test -n "$PYTHON_VERSION"; then - ac_python_version=$PYTHON_VERSION - else - ac_python_version=`$PYTHON -c "import sys; \ - print (sys.version[:3])"` - fi - fi - - # Make the versioning information available to the compiler - -cat >>confdefs.h <<_ACEOF -#define HAVE_PYTHON "$ac_python_version" -_ACEOF - - - # First, the library directory: - ac_python_libdir=`cat<<EOD | $PYTHON - - -# There should be only one -import distutils.sysconfig -e = distutils.sysconfig.get_config_var('LIBDIR') -if e is not None: - print (e) -EOD` - - # Now, for the library: - ac_python_library=`cat<<EOD | $PYTHON - - -import distutils.sysconfig -c = distutils.sysconfig.get_config_vars() -if 'LDVERSION' in c: - print ('python'+c['LDVERSION']) -else: - print ('python'+c['VERSION']) -EOD` - - # This small piece shamelessly adapted from PostgreSQL python macro; - # credits goes to momjian, I think. I'd like to put the right name - # in the credits, if someone can point me in the right direction... ? - # - if test -n "$ac_python_libdir" -a -n "$ac_python_library" - then - # use the official shared library - ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"` - PYTHON_LDFLAGS="-L$ac_python_libdir -l$ac_python_library" - else - # old way: use libpython from python_configdir - ac_python_libdir=`$PYTHON -c \ - "from distutils.sysconfig import get_python_lib as f; \ - import os; \ - print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"` - PYTHON_LDFLAGS="-L$ac_python_libdir -lpython$ac_python_version" - fi - - if test -z "PYTHON_LDFLAGS"; then - as_fn_error $? " - Cannot determine location of your Python DSO. Please check it was installed with - dynamic libraries enabled, or try setting PYTHON_LDFLAGS by hand. - " "$LINENO" 5 - fi - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LDFLAGS" >&5 -$as_echo "$PYTHON_LDFLAGS" >&6; } - - - # - # Check for site packages - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python site-packages path" >&5 -$as_echo_n "checking for Python site-packages path... " >&6; } - if test -z "$PYTHON_SITE_PKG"; then - PYTHON_SITE_PKG=`$PYTHON -c "import distutils.sysconfig; \ - print (distutils.sysconfig.get_python_lib(1,0));"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5 -$as_echo "$PYTHON_SITE_PKG" >&6; } - - - # - # libraries which must be linked in when embedding - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra libraries" >&5 -$as_echo_n "checking python extra libraries... " >&6; } - if test -z "$PYTHON_EXTRA_LIBS"; then - PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \ - conf = distutils.sysconfig.get_config_var; \ - print (conf('LIBS'))"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LIBS" >&5 -$as_echo "$PYTHON_EXTRA_LIBS" >&6; } - - - # - # linking flags needed when embedding - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra linking flags" >&5 -$as_echo_n "checking python extra linking flags... " >&6; } - if test -z "$PYTHON_EXTRA_LDFLAGS"; then - PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "import distutils.sysconfig; \ - conf = distutils.sysconfig.get_config_var; \ - print (conf('LINKFORSHARED'))"` - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LDFLAGS" >&5 -$as_echo "$PYTHON_EXTRA_LDFLAGS" >&6; } - - - # - # final check to see if everything compiles alright - # - { $as_echo "$as_me:${as_lineno-$LINENO}: checking consistency of all components of python development environment" >&5 -$as_echo_n "checking consistency of all components of python development environment... " >&6; } - # save current global flags - ac_save_LIBS="$LIBS" - ac_save_CPPFLAGS="$CPPFLAGS" - LIBS="$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS $PYTHON_EXTRA_LIBS" - CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include <Python.h> -int -main () -{ -Py_Initialize(); - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - pythonexists=yes -else - pythonexists=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - # turn back to default flags - CPPFLAGS="$ac_save_CPPFLAGS" - LIBS="$ac_save_LIBS" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pythonexists" >&5 -$as_echo "$pythonexists" >&6; } - - if test ! "x$pythonexists" = "xyes"; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? " - Could not link test program to Python. Maybe the main Python library has been - installed in some non-standard library path. If so, pass it to configure, - via the LDFLAGS environment variable. - Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/python/lib\" - ============================================================================ - ERROR! - You probably have to install the development version of the Python package - for your distribution. The exact name of this package varies among them. - ============================================================================ - -See \`config.log' for more details" "$LINENO" 5; } - PYTHON_VERSION="" - fi - - # - # all done! - # - - if test ! -z "$ac_python_version"; then - ldns_have_python=yes - fi - - # pass additional Python 3 option to SWIG - if test `$PYTHON -c "import sys; \ - ver = sys.version.split()[0]; \ - print(ver >= '3')"` = "True"; then - SWIGPY3="-py3 -DPY3" - - fi - - # check for SWIG - if test x_$ldns_have_python != x_no; then - # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PKG_SWIG([major.minor.micro], [action-if-found], [action-if-not-found]) -# -# DESCRIPTION -# -# This macro searches for a SWIG installation on your system. If found, -# then SWIG is AC_SUBST'd; if not found, then $SWIG is empty. If SWIG is -# found, then SWIG_LIB is set to the SWIG library path, and AC_SUBST'd. -# -# You can use the optional first argument to check if the version of the -# available SWIG is greater than or equal to the value of the argument. It -# should have the format: N[.N[.N]] (N is a number between 0 and 999. Only -# the first N is mandatory.) If the version argument is given (e.g. -# 1.3.17), AX_PKG_SWIG checks that the swig package is this version number -# or higher. -# -# As usual, action-if-found is executed if SWIG is found, otherwise -# action-if-not-found is executed. -# -# In configure.in, use as: -# -# AX_PKG_SWIG(1.3.17, [], [ AC_MSG_ERROR([SWIG is required to build..]) ]) -# AX_SWIG_ENABLE_CXX -# AX_SWIG_MULTI_MODULE_SUPPORT -# AX_SWIG_PYTHON -# -# LICENSE -# -# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de> -# Copyright (c) 2008 Alan W. Irwin <irwin@beluga.phys.uvic.ca> -# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net> -# Copyright (c) 2008 Andrew Collier <colliera@ukzn.ac.za> -# Copyright (c) 2011 Murray Cumming <murrayc@openismus.com> -# -# This program is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation; either version 2 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 8 - - - - - # check for >=SWIG-2.0.4 if Python 3.2 used - if test `$PYTHON -c "import sys; \ - ver = sys.version.split()[0]; \ - print(ver >= '3.2')"` = "True"; then - - # Ubuntu has swig 2.0 as /usr/bin/swig2.0 - for ac_prog in swig2.0 swig -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SWIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SWIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SWIG=$ac_cv_path_SWIG -if test -n "$SWIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5 -$as_echo "$SWIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SWIG" && break -done - - if test -z "$SWIG" ; then - as_fn_error $? "SWIG-2.0.4 is required to build pyldns for Python 3.2 and greater." "$LINENO" 5 - elif test -n "2.0.4" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking SWIG version" >&5 -$as_echo_n "checking SWIG version... " >&6; } - swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swig_version" >&5 -$as_echo "$swig_version" >&6; } - if test -n "$swig_version" ; then - # Calculate the required version number components - required=2.0.4 - required_major=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_major" ; then - required_major=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_minor=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_minor" ; then - required_minor=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_patch=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_patch" ; then - required_patch=0 - fi - # Calculate the available version number components - available=$swig_version - available_major=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_major" ; then - available_major=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_minor=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_minor" ; then - available_minor=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_patch=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_patch" ; then - available_patch=0 - fi - # Convert the version tuple into a single number for easier comparison. - # Using base 100 should be safe since SWIG internally uses BCD values - # to encode its version number. - required_swig_vernum=`expr $required_major \* 10000 \ - \+ $required_minor \* 100 \+ $required_patch` - available_swig_vernum=`expr $available_major \* 10000 \ - \+ $available_minor \* 100 \+ $available_patch` - - if test $available_swig_vernum -lt $required_swig_vernum; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SWIG version >= 2.0.4 is required. You have $swig_version." >&5 -$as_echo "$as_me: WARNING: SWIG version >= 2.0.4 is required. You have $swig_version." >&2;} - SWIG='' - as_fn_error $? "SWIG-2.0.4 is required to build pyldns for Python 3.2 and greater." "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SWIG library" >&5 -$as_echo_n "checking for SWIG library... " >&6; } - SWIG_LIB=`$SWIG -swiglib` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_LIB" >&5 -$as_echo "$SWIG_LIB" >&6; } - - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine SWIG version" >&5 -$as_echo "$as_me: WARNING: cannot determine SWIG version" >&2;} - SWIG='' - as_fn_error $? "SWIG-2.0.4 is required to build pyldns for Python 3.2 and greater." "$LINENO" 5 - fi - fi - - - else - - # Ubuntu has swig 2.0 as /usr/bin/swig2.0 - for ac_prog in swig2.0 swig -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SWIG+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SWIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_SWIG="$SWIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SWIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SWIG=$ac_cv_path_SWIG -if test -n "$SWIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG" >&5 -$as_echo "$SWIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SWIG" && break -done - - if test -z "$SWIG" ; then - : - elif test -n "" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking SWIG version" >&5 -$as_echo_n "checking SWIG version... " >&6; } - swig_version=`$SWIG -version 2>&1 | grep 'SWIG Version' | sed 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $swig_version" >&5 -$as_echo "$swig_version" >&6; } - if test -n "$swig_version" ; then - # Calculate the required version number components - required= - required_major=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_major" ; then - required_major=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_minor=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_minor" ; then - required_minor=0 - fi - required=`echo $required | sed 's/[0-9]*[^0-9]//'` - required_patch=`echo $required | sed 's/[^0-9].*//'` - if test -z "$required_patch" ; then - required_patch=0 - fi - # Calculate the available version number components - available=$swig_version - available_major=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_major" ; then - available_major=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_minor=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_minor" ; then - available_minor=0 - fi - available=`echo $available | sed 's/[0-9]*[^0-9]//'` - available_patch=`echo $available | sed 's/[^0-9].*//'` - if test -z "$available_patch" ; then - available_patch=0 - fi - # Convert the version tuple into a single number for easier comparison. - # Using base 100 should be safe since SWIG internally uses BCD values - # to encode its version number. - required_swig_vernum=`expr $required_major \* 10000 \ - \+ $required_minor \* 100 \+ $required_patch` - available_swig_vernum=`expr $available_major \* 10000 \ - \+ $available_minor \* 100 \+ $available_patch` - - if test $available_swig_vernum -lt $required_swig_vernum; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SWIG version >= is required. You have $swig_version." >&5 -$as_echo "$as_me: WARNING: SWIG version >= is required. You have $swig_version." >&2;} - SWIG='' - - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SWIG library" >&5 -$as_echo_n "checking for SWIG library... " >&6; } - SWIG_LIB=`$SWIG -swiglib` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SWIG_LIB" >&5 -$as_echo "$SWIG_LIB" >&6; } - - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine SWIG version" >&5 -$as_echo "$as_me: WARNING: cannot determine SWIG version" >&2;} - SWIG='' - - fi - fi - - - fi - - if test ! -x "$SWIG"; then - as_fn_error $? "failed to find SWIG tool, install it, or do not build pyldns" "$LINENO" 5 - else - -$as_echo "#define HAVE_SWIG 1" >>confdefs.h - - PYLDNS="pyldns" - - swig="$SWIG" - - ldns_with_pyldns=yes - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** don't have Python, skipping SWIG, no pyldns ***" >&5 -$as_echo "*** don't have Python, skipping SWIG, no pyldns ***" >&6; } # ' - fi - - # xtra cflags for pyldns - if test x_$ldns_have_python != x_no; then - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -fno-strict-aliasing" >&5 -$as_echo_n "checking whether $CC supports -fno-strict-aliasing... " >&6; } -cache=`echo fno-strict-aliasing | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -fno-strict-aliasing -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -PYTHON_X_CFLAGS="-fno-strict-aliasing" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wno-missing-field-initializers" >&5 -$as_echo_n "checking whether $CC supports -Wno-missing-field-initializers... " >&6; } -cache=`echo Wno-missing-field-initializers | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wno-missing-field-initializers -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -PYTHON_X_CFLAGS="-Wno-missing-field-initializers $PYTHON_X_CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wno-unused-parameter" >&5 -$as_echo_n "checking whether $CC supports -Wno-unused-parameter... " >&6; } -cache=`echo Wno-unused-parameter | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wno-unused-parameter -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -PYTHON_X_CFLAGS="-Wno-unused-parameter $PYTHON_X_CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -Wno-unused-variable" >&5 -$as_echo_n "checking whether $CC supports -Wno-unused-variable... " >&6; } -cache=`echo Wno-unused-variable | sed 'y%.=/+-%___p_%'` -if eval \${cv_prog_cc_flag_$cache+:} false; then : - $as_echo_n "(cached) " >&6 -else - -echo 'void f(void){}' >conftest.c -if test -z "`$CC $CPPFLAGS $CFLAGS -Wno-unused-variable -c conftest.c 2>&1`"; then -eval "cv_prog_cc_flag_$cache=yes" -else -eval "cv_prog_cc_flag_$cache=no" -fi -rm -f conftest conftest.o conftest.c - -fi - -if eval "test \"`echo '$cv_prog_cc_flag_'$cache`\" = yes"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -: -PYTHON_X_CFLAGS="-Wno-unused-variable $PYTHON_X_CFLAGS" -else -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -: - -fi - - fi -fi - - -# Check for pyldnsx - -# Check whether --with-pyldnsx was given. -if test "${with_pyldnsx+set}" = set; then : - withval=$with_pyldnsx; -else - withval="with_pyldns" -fi - -if test x_$withval != x_no; then - if test x_$ldns_with_pyldns != x_no; then - PYLDNSX="pyldnsx" - - ldns_with_pyldnsx=yes - else - if test x_$withval != x_with_pyldns; then - as_fn_error $? "--with-pyldns is needed for the ldnsx python module" "$LINENO" 5 - fi - fi -fi - -if test x_$ldns_with_pyldns != x_no; then - PYLDNSINST="install-pyldns" - PYLDNSUNINST="uninstall-pyldns" - -else - PYLDNSINST="" - PYLDNSUNINST="" - -fi -if test x_$ldns_with_pyldnsx != x_no; then - PYLDNSXINST="install-pyldnsx" - PYLDNSXUNINST="uninstall-pyldnsx" - -else - PYLDNSXINST="" - PYLDNSXUNINST="" - -fi - -# check for perl -ldns_with_p5_dns_ldns=no - -# Check whether --with-p5-dns-ldns was given. -if test "${with_p5_dns_ldns+set}" = set; then : - withval=$with_p5_dns_ldns; -else - withval="no" -fi - -ldns_have_perl=no -if test x_$withval != x_no; then - # Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PERL+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_PERL="$PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -PERL=$ac_cv_path_PERL -if test -n "$PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 -$as_echo "$PERL" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test -z "$PERL"; then - as_fn_error $? "Cannot find perl in your system path" "$LINENO" 5 - fi - P5_DNS_LDNS="p5-dns-ldns" - TEST_P5_DNS_LDNS="test-p5-dns-ldns" - INSTALL_P5_DNS_LDNS="install-p5-dns-ldns" - UNINSTALL_P5_DNS_LDNS="uninstall-p5-dns-ldns" - CLEAN_P5_DNS_LDNS="clean-p5-dns-ldns" - -else - P5_DNS_LDNS="" - TEST_P5_DNS_LDNS="" - INSTALL_P5_DNS_LDNS="" - UNINSTALL_P5_DNS_LDNS="" - CLEAN_P5_DNS_LDNS="" - -fi - -# Use libtool - -# skip these tests, we do not need them. - - - - - - - - -# always use ./libtool unless override from commandline (libtool=mylibtool) -if test -z "$libtool"; then - libtool="./libtool" -fi - -# avoid libtool max commandline length test on systems that fork slowly. - -if echo "$host_os" | grep "sunos4" >/dev/null; then - lt_cv_sys_max_cmd_len=32750; -fi -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. -set dummy ${ac_tool_prefix}ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $AR in - [\\/]* | ?:[\\/]*) - ac_cv_path_AR="$AR" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -AR=$ac_cv_path_AR -if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_AR"; then - ac_pt_AR=$AR - # Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_AR in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_AR="$ac_pt_AR" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_AR="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_AR=$ac_cv_path_ac_pt_AR -if test -n "$ac_pt_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_AR" >&5 -$as_echo "$ac_pt_AR" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_AR" = x; then - AR="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - AR=$ac_pt_AR - fi -else - AR="$ac_cv_path_AR" -fi - -if test $AR = false; then - as_fn_error $? "Cannot find 'ar', please extend PATH to include it" "$LINENO" 5 -fi - - - - - - -tmp_CPPFLAGS=$CPPFLAGS -tmp_LDFLAGS=$LDFLAGS -tmp_LIBS=$LIBS - - - -# Check whether --with-ssl was given. -if test "${with_ssl+set}" = set; then : - withval=$with_ssl; - -else - - withval="yes" - -fi - - - withval=$withval - if test x_$withval != x_no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL" >&5 -$as_echo_n "checking for SSL... " >&6; } - if test x_$withval = x_ -o x_$withval = x_yes; then - withval="/usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /opt/local /usr/local/opt/openssl /usr/sfw /usr" - fi - for dir in $withval; do - ssldir="$dir" - if test -f "$dir/include/openssl/ssl.h"; then - found_ssl="yes" - -cat >>confdefs.h <<_ACEOF -#define HAVE_SSL /**/ -_ACEOF - - if test "$ssldir" != "/usr"; then - CPPFLAGS="$CPPFLAGS -I$ssldir/include" - LIBSSL_CPPFLAGS="$LIBSSL_CPPFLAGS -I$ssldir/include" - fi - break; - fi - done - if test x_$found_ssl != x_yes; then - as_fn_error $? "Cannot find the SSL libraries in $withval" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found in $ssldir" >&5 -$as_echo "found in $ssldir" >&6; } - HAVE_SSL=yes - if test "$ssldir" != "/usr" -a "$ssldir" != ""; then - LDFLAGS="$LDFLAGS -L$ssldir/lib" - LIBSSL_LDFLAGS="$LIBSSL_LDFLAGS -L$ssldir/lib" - - if test "x$enable_rpath" = xyes; then - if echo "$ssldir/lib" | grep "^/" >/dev/null; then - RUNTIME_PATH="$RUNTIME_PATH -R$ssldir/lib" - fi - fi - - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HMAC_Update in -lcrypto" >&5 -$as_echo_n "checking for HMAC_Update in -lcrypto... " >&6; } - LIBS="$LIBS -lcrypto" - LIBSSL_LIBS="$LIBSSL_LIBS -lcrypto" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - int HMAC_Update(void); - (void)HMAC_Update(); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h - - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - # check if -lwsock32 or -lgdi32 are needed. - BAKLIBS="$LIBS" - BAKSSLLIBS="$LIBSSL_LIBS" - LIBS="$LIBS -lgdi32 -lws2_32" - LIBSSL_LIBS="$LIBSSL_LIBS -lgdi32 -lws2_32" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -lcrypto needs -lgdi32" >&5 -$as_echo_n "checking if -lcrypto needs -lgdi32... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - int HMAC_Update(void); - (void)HMAC_Update(); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - -$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - LIBS="$BAKLIBS" - LIBSSL_LIBS="$BAKSSLLIBS" - LIBS="$LIBS -ldl" - LIBSSL_LIBS="$LIBSSL_LIBS -ldl" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -lcrypto needs -ldl" >&5 -$as_echo_n "checking if -lcrypto needs -ldl... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - int HMAC_Update(void); - (void)HMAC_Update(); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - -$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - LIBS="$BAKLIBS" - LIBSSL_LIBS="$BAKSSLLIBS" - LIBS="$LIBS -ldl -pthread" - LIBSSL_LIBS="$LIBSSL_LIBS -ldl -pthread" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -lcrypto needs -ldl -pthread" >&5 -$as_echo_n "checking if -lcrypto needs -ldl -pthread... " >&6; } - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - int HMAC_Update(void); - (void)HMAC_Update(); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - -$as_echo "#define HAVE_HMAC_UPDATE 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "OpenSSL found in $ssldir, but version 0.9.7 or higher is required" "$LINENO" 5 - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - - - fi -for ac_header in openssl/ssl.h -do : - ac_fn_c_check_header_compile "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default -" -if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENSSL_SSL_H 1 -_ACEOF - -fi - -done - -for ac_header in openssl/err.h -do : - ac_fn_c_check_header_compile "$LINENO" "openssl/err.h" "ac_cv_header_openssl_err_h" "$ac_includes_default -" -if test "x$ac_cv_header_openssl_err_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENSSL_ERR_H 1 -_ACEOF - -fi - -done - -for ac_header in openssl/rand.h -do : - ac_fn_c_check_header_compile "$LINENO" "openssl/rand.h" "ac_cv_header_openssl_rand_h" "$ac_includes_default -" -if test "x$ac_cv_header_openssl_rand_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENSSL_RAND_H 1 -_ACEOF - -fi - -done - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LibreSSL" >&5 -$as_echo_n "checking for LibreSSL... " >&6; } -if grep VERSION_TEXT $ssldir/include/openssl/opensslv.h | grep "LibreSSL" >/dev/null; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_LIBRESSL 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -for ac_func in EVP_sha256 EVP_sha384 EVP_sha512 ENGINE_load_cryptodev EVP_PKEY_keygen ECDSA_SIG_get0 EVP_MD_CTX_new EVP_PKEY_base_id DSA_SIG_set0 DSA_SIG_get0 EVP_dss1 DSA_get0_pqg DSA_get0_key OPENSSL_init_ssl OPENSSL_init_crypto ERR_load_crypto_strings -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -# for macosx, see if glibtool exists and use that -# BSD's need to know the version... -#AC_CHECK_PROG(glibtool, glibtool, [glibtool], ) -#AC_CHECK_PROGS(libtool, [libtool15 libtool], [./libtool]) - -# Check whether --enable-sha2 was given. -if test "${enable_sha2+set}" = set; then : - enableval=$enable_sha2; -fi - -case "$enable_sha2" in - no) - ;; - yes|*) - if test "x$HAVE_SSL" != "xyes"; then - as_fn_error $? "SHA2 enabled, but no SSL support" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SHA256 and SHA512" >&5 -$as_echo_n "checking for SHA256 and SHA512... " >&6; } - ac_fn_c_check_func "$LINENO" "SHA256_Init" "ac_cv_func_SHA256_Init" -if test "x$ac_cv_func_SHA256_Init" = xyes; then : - -else - - as_fn_error $? "No SHA2 functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-sha2" "$LINENO" 5 - -fi - - -cat >>confdefs.h <<_ACEOF -#define USE_SHA2 1 -_ACEOF - - ;; -esac - -# check wether gost also works - -# Check whether --enable-gost was given. -if test "${enable_gost+set}" = set; then : - enableval=$enable_gost; -fi - -case "$enable_gost" in - no) - ;; - *) if test "x$HAVE_SSL" != "xyes"; then - as_fn_error $? "GOST enabled, but no SSL support" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOST" >&5 -$as_echo_n "checking for GOST... " >&6; } - ac_fn_c_check_func "$LINENO" "EVP_PKEY_set_type_str" "ac_cv_func_EVP_PKEY_set_type_str" -if test "x$ac_cv_func_EVP_PKEY_set_type_str" = xyes; then : - -else - as_fn_error $? "OpenSSL >= 1.0.0 is needed for GOST support or rerun with --disable-gost" "$LINENO" 5 -fi - - ac_fn_c_check_func "$LINENO" "EC_KEY_new" "ac_cv_func_EC_KEY_new" -if test "x$ac_cv_func_EC_KEY_new" = xyes; then : - -else - as_fn_error $? "No ECC functions found in OpenSSL: please upgrade OpenSSL or rerun with --disable-gost" "$LINENO" 5 -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GOST works" >&5 -$as_echo_n "checking if GOST works... " >&6; } -if test c${cross_compiling} = cno; then -BAKCFLAGS="$CFLAGS" -if test -n "$ssldir"; then - CFLAGS="$CFLAGS -Wl,-rpath,$ssldir/lib" -fi -if test "$cross_compiling" = yes; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run test program while cross compiling -See \`config.log' for more details" "$LINENO" 5; } -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include <string.h> -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/engine.h> -#include <openssl/conf.h> -/* routine to load gost (from sldns) */ -int load_gost_id(void) -{ - static int gost_id = 0; - const EVP_PKEY_ASN1_METHOD* meth; - ENGINE* e; - - if(gost_id) return gost_id; - - /* see if configuration loaded gost implementation from other engine*/ - meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1); - if(meth) { - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; - } - - /* see if engine can be loaded already */ - e = ENGINE_by_id("gost"); - if(!e) { - /* load it ourself, in case statically linked */ - ENGINE_load_builtin_engines(); - ENGINE_load_dynamic(); - e = ENGINE_by_id("gost"); - } - if(!e) { - /* no gost engine in openssl */ - return 0; - } - if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - - meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1); - if(!meth) { - /* algo not found */ - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; -} -int main(void) { - EVP_MD_CTX* ctx; - const EVP_MD* md; - unsigned char digest[64]; /* its a 256-bit digest, so uses 32 bytes */ - const char* str = "Hello world"; - const unsigned char check[] = { - 0x40 , 0xed , 0xf8 , 0x56 , 0x5a , 0xc5 , 0x36 , 0xe1 , - 0x33 , 0x7c , 0x7e , 0x87 , 0x62 , 0x1c , 0x42 , 0xe0 , - 0x17 , 0x1b , 0x5e , 0xce , 0xa8 , 0x46 , 0x65 , 0x4d , - 0x8d , 0x3e , 0x22 , 0x9b , 0xe1 , 0x30 , 0x19 , 0x9d - }; - OPENSSL_config(NULL); - (void)load_gost_id(); - md = EVP_get_digestbyname("md_gost94"); - if(!md) return 1; - memset(digest, 0, sizeof(digest)); - ctx = EVP_MD_CTX_create(); - if(!ctx) return 2; - if(!EVP_DigestInit_ex(ctx, md, NULL)) return 3; - if(!EVP_DigestUpdate(ctx, str, 10)) return 4; - if(!EVP_DigestFinal_ex(ctx, digest, NULL)) return 5; - /* uncomment to see the hash calculated. - {int i; - for(i=0; i<32; i++) - printf(" %2.2x", (int)digest[i]); - printf("\n");} - */ - if(memcmp(digest, check, sizeof(check)) != 0) - return 6; - return 0; -} - -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - eval "ac_cv_c_gost_works=yes" -else - eval "ac_cv_c_gost_works=no" -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -CFLAGS="$BAKCFLAGS" -else -eval "ac_cv_c_gost_works=maybe" -fi - - # Check whether --enable-gost-anyway was given. -if test "${enable_gost_anyway+set}" = set; then : - enableval=$enable_gost_anyway; -fi - - if test "$ac_cv_c_gost_works" != "no" -o "$enable_gost_anyway" = "yes"; then - if test "$ac_cv_c_gost_works" = "no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, but compiling with GOST support anyway" >&5 -$as_echo "no, but compiling with GOST support anyway" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - use_gost="yes" - -$as_echo "#define USE_GOST 1" >>confdefs.h - - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Gost support does not work because the engine is missing." >&5 -$as_echo "$as_me: WARNING: Gost support does not work because the engine is missing." >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Install gost-engine first or use the --enable-gost-anyway to compile with GOST support anyway" >&5 -$as_echo "$as_me: WARNING: Install gost-engine first or use the --enable-gost-anyway to compile with GOST support anyway" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: See also https://github.com/gost-engine/engine/wiki for information about gost-engine" >&5 -$as_echo "$as_me: WARNING: See also https://github.com/gost-engine/engine/wiki for information about gost-engine" >&2;} - fi - ;; -esac - -# Check whether --enable-ecdsa was given. -if test "${enable_ecdsa+set}" = set; then : - enableval=$enable_ecdsa; -fi - -case "$enable_ecdsa" in - no) - ;; - *) if test "x$HAVE_SSL" != "xyes"; then - as_fn_error $? "ECDSA enabled, but no SSL support" "$LINENO" 5 - fi - ac_fn_c_check_func "$LINENO" "ECDSA_sign" "ac_cv_func_ECDSA_sign" -if test "x$ac_cv_func_ECDSA_sign" = xyes; then : - -else - as_fn_error $? "OpenSSL does not support ECDSA: please upgrade OpenSSL or rerun with --disable-ecdsa" "$LINENO" 5 -fi - - ac_fn_c_check_func "$LINENO" "SHA384_Init" "ac_cv_func_SHA384_Init" -if test "x$ac_cv_func_SHA384_Init" = xyes; then : - -else - as_fn_error $? "OpenSSL does not support SHA384: please upgrade OpenSSL or rerun with --disable-ecdsa" "$LINENO" 5 -fi - - ac_fn_c_check_decl "$LINENO" "NID_X9_62_prime256v1" "ac_cv_have_decl_NID_X9_62_prime256v1" "$ac_includes_default -#include <openssl/evp.h> - -" -if test "x$ac_cv_have_decl_NID_X9_62_prime256v1" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NID_X9_62_PRIME256V1 $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : - -else - as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade OpenSSL or rerun with --disable-ecdsa" "$LINENO" 5 -fi -ac_fn_c_check_decl "$LINENO" "NID_secp384r1" "ac_cv_have_decl_NID_secp384r1" "$ac_includes_default -#include <openssl/evp.h> - -" -if test "x$ac_cv_have_decl_NID_secp384r1" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NID_SECP384R1 $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : - -else - as_fn_error $? "OpenSSL does not support the ECDSA curves: please upgrade OpenSSL or rerun with --disable-ecdsa" "$LINENO" 5 -fi - - # we now know we have ECDSA and the required curves. - -cat >>confdefs.h <<_ACEOF -#define USE_ECDSA 1 -_ACEOF - - ;; -esac - -# Check whether --enable-dsa was given. -if test "${enable_dsa+set}" = set; then : - enableval=$enable_dsa; -fi - -case "$enable_dsa" in - no) - ;; - *) # detect if DSA is supported, and turn it off if not. - ac_fn_c_check_func "$LINENO" "DSA_SIG_new" "ac_cv_func_DSA_SIG_new" -if test "x$ac_cv_func_DSA_SIG_new" = xyes; then : - - -cat >>confdefs.h <<_ACEOF -#define USE_DSA 1 -_ACEOF - - -else - if test "x$enable_dsa" = "xyes"; then as_fn_error $? "OpenSSL does not support DSA and you used --enable-dsa." "$LINENO" 5 - fi -fi - - ;; -esac - -# Check whether --enable-ed25519 was given. -if test "${enable_ed25519+set}" = set; then : - enableval=$enable_ed25519; -fi - -case "$enable_ed25519" in - no) ;; - *) ac_fn_c_check_decl "$LINENO" "NID_ED25519" "ac_cv_have_decl_NID_ED25519" "$ac_includes_default -#include <openssl/evp.h> - -" -if test "x$ac_cv_have_decl_NID_ED25519" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NID_ED25519 $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : - - -cat >>confdefs.h <<_ACEOF -#define USE_ED25519 1 -_ACEOF - - -else - if test "x$enable_ed25519" = "xyes"; then as_fn_error $? "OpenSSL does not support ED25519 and you used --enable-ed25519." "$LINENO" 5 - fi -fi - - ;; -esac - -# Check whether --enable-ed448 was given. -if test "${enable_ed448+set}" = set; then : - enableval=$enable_ed448; -fi - -case "$enable_ed448" in - no) ;; - *) ac_fn_c_check_decl "$LINENO" "NID_ED448" "ac_cv_have_decl_NID_ED448" "$ac_includes_default -#include <openssl/evp.h> - -" -if test "x$ac_cv_have_decl_NID_ED448" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_NID_ED448 $ac_have_decl -_ACEOF -if test $ac_have_decl = 1; then : - - -cat >>confdefs.h <<_ACEOF -#define USE_ED448 1 -_ACEOF - - -else - if test "x$enable_ed448" = "xyes"; then as_fn_error $? "OpenSSL does not support ED448 and you used --enable-ed448." "$LINENO" 5 - fi -fi - - ;; -esac - -# Check whether --enable-dane was given. -if test "${enable_dane+set}" = set; then : - enableval=$enable_dane; -fi - -# Check whether --enable-dane-verify was given. -if test "${enable_dane_verify+set}" = set; then : - enableval=$enable_dane_verify; -fi - -# Check whether --enable-dane-ta-usage was given. -if test "${enable_dane_ta_usage+set}" = set; then : - enableval=$enable_dane_ta_usage; -fi - - -# Check whether --enable-full-dane was given. -if test "${enable_full_dane+set}" = set; then : - enableval=$enable_full_dane; - enable_dane_ta_usage=yes - enable_dane_verify=yes - enable_dane=yes - -fi - -# Check whether --enable-no-dane-ta-usage was given. -if test "${enable_no_dane_ta_usage+set}" = set; then : - enableval=$enable_no_dane_ta_usage; - enable_dane_ta_usage=no - enable_dane_verify=yes - enable_dane=yes - -fi - -# Check whether --enable-no-dane-verify was given. -if test "${enable_no_dane_verify+set}" = set; then : - enableval=$enable_no_dane_verify; - enable_dane_ta_usage=no - enable_dane_verify=no - enable_dane=yes - -fi - -case "$enable_dane" in - no) - ldns_build_config_use_dane=0 - - ldns_build_config_use_dane_verify=0 - - ldns_build_config_use_dane_ta_usage=0 - - ;; - *) if test "x$HAVE_SSL" != "xyes"; then - as_fn_error $? "DANE enabled, but no SSL support" "$LINENO" 5 - fi - ac_fn_c_check_func "$LINENO" "X509_check_ca" "ac_cv_func_X509_check_ca" -if test "x$ac_cv_func_X509_check_ca" = xyes; then : - -else - as_fn_error $? "OpenSSL does not support DANE: please upgrade OpenSSL or rerun with --disable-dane" "$LINENO" 5 -fi - - ldns_build_config_use_dane=1 - - -cat >>confdefs.h <<_ACEOF -#define USE_DANE 1 -_ACEOF - - case "$enable_dane_verify" in - no) - ldns_build_config_use_dane_verify=0 - - ldns_build_config_use_dane_ta_usage=0 - - ;; - *) - ldns_build_config_use_dane_verify=1 - - -cat >>confdefs.h <<_ACEOF -#define USE_DANE_VERIFY 1 -_ACEOF - - case "$enable_dane_ta_usage" in - no) - ldns_build_config_use_dane_ta_usage=0 - - ;; - *) LIBS="-lssl $LIBS" - ac_fn_c_check_func "$LINENO" "SSL_get0_dane" "ac_cv_func_SSL_get0_dane" -if test "x$ac_cv_func_SSL_get0_dane" = xyes; then : - -else - as_fn_error $? "OpenSSL does not support offline DANE verification (Needed for the DANE-TA usage type). Please upgrade OpenSSL to version >= 1.1.0 or rerun with --disable-dane-verify or --disable-dane-ta-usage" "$LINENO" 5 -fi - - LIBSSL_LIBS="-lssl $LIBSSL_LIBS" - ldns_build_config_use_dane_ta_usage=1 - - -cat >>confdefs.h <<_ACEOF -#define USE_DANE_TA_USAGE 1 -_ACEOF - - ;; - esac - esac - ;; -esac - -# Check whether --enable-rrtype-ninfo was given. -if test "${enable_rrtype_ninfo+set}" = set; then : - enableval=$enable_rrtype_ninfo; -fi - -case "$enable_rrtype_ninfo" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_NINFO /**/ -_ACEOF - - ;; - no|*) - ;; -esac -# Check whether --enable-rrtype-rkey was given. -if test "${enable_rrtype_rkey+set}" = set; then : - enableval=$enable_rrtype_rkey; -fi - -case "$enable_rrtype_rkey" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_RKEY /**/ -_ACEOF - - ;; - no|*) - ;; -esac -# Check whether --enable-rrtype-openpgpkey was given. -if test "${enable_rrtype_openpgpkey+set}" = set; then : - enableval=$enable_rrtype_openpgpkey; -fi - -case "$enable_rrtype_openpgpkey" in - no) - ;; - yes|*) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_OPENPGPKEY /**/ -_ACEOF - - ;; -esac -# Check whether --enable-rrtype-ta was given. -if test "${enable_rrtype_ta+set}" = set; then : - enableval=$enable_rrtype_ta; -fi - -case "$enable_rrtype_ta" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_TA /**/ -_ACEOF - - ;; - no|*) - ;; -esac -# Check whether --enable-rrtype-avc was given. -if test "${enable_rrtype_avc+set}" = set; then : - enableval=$enable_rrtype_avc; -fi - -case "$enable_rrtype_avc" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_AVC /**/ -_ACEOF - - ;; - no|*) - ;; -esac -# Check whether --enable-rrtype-doa was given. -if test "${enable_rrtype_doa+set}" = set; then : - enableval=$enable_rrtype_doa; -fi - -case "$enable_rrtype_doa" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_DOA /**/ -_ACEOF - - ;; - no|*) - ;; -esac -# Check whether --enable-rrtype-amtrelay was given. -if test "${enable_rrtype_amtrelay+set}" = set; then : - enableval=$enable_rrtype_amtrelay; -fi - -case "$enable_rrtype_amtrelay" in - yes) - -cat >>confdefs.h <<_ACEOF -#define RRTYPE_AMTRELAY /**/ -_ACEOF - - ;; - no|*) - ;; -esac - - - - - - -if test "x$HAVE_SSL" = "xyes"; then -LIBSSL_SSL_LIBS="-lssl $LIBSSL_LIBS" - -fi -CPPFLAGS=$tmp_CPPFLAGS -LDFLAGS=$tmp_LDFLAGS -LIBS=$tmp_LIBS - - -# add option to disable the evil rpath - -# Check whether --enable-rpath was given. -if test "${enable_rpath+set}" = set; then : - enableval=$enable_rpath; enable_rpath=$enableval -else - enable_rpath=yes -fi - -if test "x$enable_rpath" = xno; then - ac_config_commands="$ac_config_commands disable-rpath" - -fi - - -#AC_RUN_IFELSE([AC_LANG_SOURCE( -#[ -#int main() -#{ -#short one = 1; -#char *cp = (char*)&one; -#if ( *cp == 0 ) -#return(0); -#else -#return(1); -#} -#])], [],[ -#AC_DEFINE(CONFCHECK_LITTLE_ENDIAN, 1, [system appears to be little-endian]) -#],[]) - -# should define WORDS_BIGENDIAN if the system is big-endian - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_bigendian=unknown - # See if we're dealing with a universal compiler. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifndef __APPLE_CC__ - not a universal capable compiler - #endif - typedef int dummy; - -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - - # Check for potential -arch flags. It is not universal unless - # there are at least two -arch flags with different values. - ac_arch= - ac_prev= - for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do - if test -n "$ac_prev"; then - case $ac_word in - i?86 | x86_64 | ppc | ppc64) - if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then - ac_arch=$ac_word - else - ac_cv_c_bigendian=universal - break - fi - ;; - esac - ac_prev= - elif test "x$ac_word" = "x-arch"; then - ac_prev=arch - fi - done -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test $ac_cv_c_bigendian = unknown; then - # See if sys/param.h defines the BYTE_ORDER macro. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> - #include <sys/param.h> - -int -main () -{ -#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ - && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ - && LITTLE_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <sys/types.h> - #include <sys/param.h> - -int -main () -{ -#if BYTE_ORDER != BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - -int -main () -{ -#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) - bogus endian macros - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - # It does; now see whether it defined to _BIG_ENDIAN or not. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <limits.h> - -int -main () -{ -#ifndef _BIG_ENDIAN - not big endian - #endif - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_bigendian=yes -else - ac_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - if test $ac_cv_c_bigendian = unknown; then - # Compile a test program. - if test "$cross_compiling" = yes; then : - # Try to guess by grepping values from an object file. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -short int ascii_mm[] = - { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = - { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; - int use_ascii (int i) { - return ascii_mm[i] + ascii_ii[i]; - } - short int ebcdic_ii[] = - { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = - { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; - int use_ebcdic (int i) { - return ebcdic_mm[i] + ebcdic_ii[i]; - } - extern int foo; - -int -main () -{ -return use_ascii (foo) == use_ebcdic (foo); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then - ac_cv_c_bigendian=yes - fi - if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then - if test "$ac_cv_c_bigendian" = unknown; then - ac_cv_c_bigendian=no - else - # finding both strings is unlikely to happen, but who knows? - ac_cv_c_bigendian=unknown - fi - fi -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long int l; - char c[sizeof (long int)]; - } u; - u.l = 1; - return u.c[sizeof (long int) - 1] == 1; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } - case $ac_cv_c_bigendian in #( - yes) - $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h -;; #( - no) - ;; #( - universal) - -$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h - - ;; #( - *) - as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; - esac - - -# Checks for header files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <string.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdlib.h> - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <ctype.h> -#include <stdlib.h> -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -$as_echo "#define STDC_HEADERS 1" >>confdefs.h - -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 -$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } -if ${ac_cv_header_stdbool_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include <stdbool.h> - #ifndef bool - "error: bool is not defined" - #endif - #ifndef false - "error: false is not defined" - #endif - #if false - "error: false is not 0" - #endif - #ifndef true - "error: true is not defined" - #endif - #if true != 1 - "error: true is not 1" - #endif - #ifndef __bool_true_false_are_defined - "error: __bool_true_false_are_defined is not defined" - #endif - - struct s { _Bool s: 1; _Bool t; } s; - - char a[true == 1 ? 1 : -1]; - char b[false == 0 ? 1 : -1]; - char c[__bool_true_false_are_defined == 1 ? 1 : -1]; - char d[(bool) 0.5 == true ? 1 : -1]; - /* See body of main program for 'e'. */ - char f[(_Bool) 0.0 == false ? 1 : -1]; - char g[true]; - char h[sizeof (_Bool)]; - char i[sizeof s.t]; - enum { j = false, k = true, l = false * true, m = true * 256 }; - /* The following fails for - HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ - _Bool n[m]; - char o[sizeof n == m * sizeof n[0] ? 1 : -1]; - char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; - /* Catch a bug in an HP-UX C compiler. See - http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html - http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html - */ - _Bool q = true; - _Bool *pq = &q; - -int -main () -{ - - bool e = &s; - *pq |= q; - *pq |= ! q; - /* Refer to every declared value, to avoid compiler optimizations. */ - return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l - + !m + !n + !o + !p + !q + !pq); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdbool_h=yes -else - ac_cv_header_stdbool_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 -$as_echo "$ac_cv_header_stdbool_h" >&6; } - ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" -if test "x$ac_cv_type__Bool" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE__BOOL 1 -_ACEOF - - -fi - - -if test $ac_cv_header_stdbool_h = yes; then - -$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h - -fi - -#AC_HEADER_SYS_WAIT -#AC_CHECK_HEADERS([getopt.h fcntl.h stdlib.h string.h strings.h unistd.h]) -# do the very minimum - we can always extend this -for ac_header in getopt.h stdarg.h openssl/ssl.h netinet/in.h time.h arpa/inet.h netdb.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -for ac_header in sys/param.h sys/mount.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default - - #if HAVE_SYS_PARAM_H - # include <sys/param.h> - #endif - - -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default - - #if HAVE_SYS_PARAM_H - # include <sys/param.h> - #endif - - -" -if test "x$ac_cv_header_sys_socket_h" = xyes; then : - -include_sys_socket_h='#include <sys/socket.h>' - -$as_echo "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h - - -else - -include_sys_socket_h='' - -fi - - - -ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default - -" -if test "x$ac_cv_header_inttypes_h" = xyes; then : - -include_inttypes_h='#include <inttypes.h>' - -$as_echo "#define HAVE_INTTYPES_H 1" >>confdefs.h - -ldns_build_config_have_inttypes_h=1 - - -else - -include_inttypes_h='' -ldns_build_config_have_inttypes_h=0 - - -fi - - - -ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default - -" -if test "x$ac_cv_header_sys_types_h" = xyes; then : - -include_systypes_h='#include <sys/types.h>' - -$as_echo "#define HAVE_SYS_TYPES_H 1" >>confdefs.h - - -else - -include_systypes_h='' - -fi - - - -ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default - -" -if test "x$ac_cv_header_unistd_h" = xyes; then : - -include_unistd_h='#include <unistd.h>' - -$as_echo "#define HAVE_UNISTD_H 1" >>confdefs.h - - -else - -include_unistd_h='' - -fi - - - - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 -$as_echo_n "checking size of time_t... " >&6; } -if ${ac_cv_sizeof_time_t+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" " -$ac_includes_default -#ifdef TIME_WITH_SYS_TIME -# include <sys/time.h> -# include <time.h> -#else -# ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -# else -# include <time.h> -# endif -#endif - -"; then : - -else - if test "$ac_cv_type_time_t" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute sizeof (time_t) -See \`config.log' for more details" "$LINENO" 5; } - else - ac_cv_sizeof_time_t=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5 -$as_echo "$ac_cv_sizeof_time_t" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_TIME_T $ac_cv_sizeof_time_t -_ACEOF - - - -if test x_$with_examples != x_no; then -for ac_header in pcap.h -do : - ac_fn_c_check_header_compile "$LINENO" "pcap.h" "ac_cv_header_pcap_h" "$ac_includes_default -" -if test "x$ac_cv_header_pcap_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_PCAP_H 1 -_ACEOF - -fi - -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcap_open_offline in -lpcap" >&5 -$as_echo_n "checking for pcap_open_offline in -lpcap... " >&6; } -if ${ac_cv_lib_pcap_pcap_open_offline+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lpcap $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char pcap_open_offline (); -int -main () -{ -return pcap_open_offline (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_pcap_pcap_open_offline=yes -else - ac_cv_lib_pcap_pcap_open_offline=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_pcap_open_offline" >&5 -$as_echo "$ac_cv_lib_pcap_pcap_open_offline" >&6; } -if test "x$ac_cv_lib_pcap_pcap_open_offline" = xyes; then : - - -$as_echo "#define HAVE_LIBPCAP 1" >>confdefs.h - LIBPCAP_LIBS=-lpcap - - -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can't find pcap library (needed for ldns-dpa, will not build dpa now.)" >&5 -$as_echo "$as_me: WARNING: Can't find pcap library (needed for ldns-dpa, will not build dpa now.)" >&2;} - - -fi - -for ac_header in netinet/in_systm.h net/if.h netinet/ip.h netinet/udp.h netinet/igmp.h netinet/if_ether.h netinet/ip6.h net/ethernet.h netinet/ip_compat.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " -$ac_includes_default -#ifdef HAVE_NETINET_IN_SYSTM_H -#include <netinet/in_systm.h> -#endif -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NET_IF_H -#include <net/if.h> -#endif -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - -fi - - -ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" " -$ac_includes_default -#ifdef HAVE_SYS_SOCKET_H -# include <sys/socket.h> -#endif -#ifdef HAVE_WS2TCPIP_H -# include <ws2tcpip.h> -#endif - -" -if test "x$ac_cv_type_socklen_t" = xyes; then : - -else - -$as_echo "#define socklen_t int" >>confdefs.h - -fi - -if test "x$ac_cv_type_socklen_t" = xyes; then - ldns_build_config_have_socklen_t=1 - -else - ldns_build_config_have_socklen_t=0 - -fi -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" -if test "x$ac_cv_type_ssize_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define ssize_t int -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default" -if test "x$ac_cv_type_intptr_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define intptr_t size_t -_ACEOF - -fi - -ac_fn_c_check_type "$LINENO" "in_addr_t" "ac_cv_type_in_addr_t" " -#if HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#if HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -" -if test "x$ac_cv_type_in_addr_t" = xyes; then : - -else - -$as_echo "#define in_addr_t uint32_t" >>confdefs.h - -fi - -ac_fn_c_check_type "$LINENO" "in_port_t" "ac_cv_type_in_port_t" " -#if HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif -#if HAVE_NETINET_IN_H -# include <netinet/in.h> -#endif -" -if test "x$ac_cv_type_in_port_t" = xyes; then : - -else - -$as_echo "#define in_port_t uint16_t" >>confdefs.h - -fi - -ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "$ac_includes_default -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif - -" -if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then : - -else - - ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "__ss_family" "ac_cv_member_struct_sockaddr_storage___ss_family" "$ac_includes_default -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif - -" -if test "x$ac_cv_member_struct_sockaddr_storage___ss_family" = xyes; then : - - -$as_echo "#define ss_family __ss_family" >>confdefs.h - - -fi - - -fi - - -for ac_header in stdlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDLIB_H 1 -_ACEOF - -fi - -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 -$as_echo_n "checking for GNU libc compatible malloc... " >&6; } -if ${ac_cv_func_malloc_0_nonnull+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_malloc_0_nonnull=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include <stdlib.h> -#else -char *malloc (); -#endif - -int -main () -{ -return ! malloc (0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_malloc_0_nonnull=yes -else - ac_cv_func_malloc_0_nonnull=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 -$as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } -if test $ac_cv_func_malloc_0_nonnull = yes; then : - -$as_echo "#define HAVE_MALLOC 1" >>confdefs.h - -else - $as_echo "#define HAVE_MALLOC 0" >>confdefs.h - - case " $LIBOBJS " in - *" malloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS malloc.$ac_objext" - ;; -esac - - -$as_echo "#define malloc rpl_malloc" >>confdefs.h - -fi - - -for ac_header in stdlib.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" -if test "x$ac_cv_header_stdlib_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STDLIB_H 1 -_ACEOF - -fi - -done - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 -$as_echo_n "checking for GNU libc compatible realloc... " >&6; } -if ${ac_cv_func_realloc_0_nonnull+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_realloc_0_nonnull=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include <stdlib.h> -#else -char *realloc (); -#endif - -int -main () -{ -return ! realloc (0, 0); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_realloc_0_nonnull=yes -else - ac_cv_func_realloc_0_nonnull=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 -$as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } -if test $ac_cv_func_realloc_0_nonnull = yes; then : - -$as_echo "#define HAVE_REALLOC 1" >>confdefs.h - -else - $as_echo "#define HAVE_REALLOC 0" >>confdefs.h - - case " $LIBOBJS " in - *" realloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS realloc.$ac_objext" - ;; -esac - - -$as_echo "#define realloc rpl_realloc" >>confdefs.h - -fi - - - -ac_fn_c_check_func "$LINENO" "b64_pton" "ac_cv_func_b64_pton" -if test "x$ac_cv_func_b64_pton" = xyes; then : - $as_echo "#define HAVE_B64_PTON 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" b64_pton.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS b64_pton.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "b64_ntop" "ac_cv_func_b64_ntop" -if test "x$ac_cv_func_b64_ntop" = xyes; then : - $as_echo "#define HAVE_B64_NTOP 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" b64_ntop.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS b64_ntop.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "calloc" "ac_cv_func_calloc" -if test "x$ac_cv_func_calloc" = xyes; then : - $as_echo "#define HAVE_CALLOC 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" calloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS calloc.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" -if test "x$ac_cv_func_timegm" = xyes; then : - $as_echo "#define HAVE_TIMEGM 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" timegm.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS timegm.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r" -if test "x$ac_cv_func_gmtime_r" = xyes; then : - $as_echo "#define HAVE_GMTIME_R 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" gmtime_r.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS gmtime_r.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "ctime_r" "ac_cv_func_ctime_r" -if test "x$ac_cv_func_ctime_r" = xyes; then : - $as_echo "#define HAVE_CTIME_R 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" ctime_r.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS ctime_r.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" -if test "x$ac_cv_func_localtime_r" = xyes; then : - $as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" localtime_r.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS localtime_r.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "isblank" "ac_cv_func_isblank" -if test "x$ac_cv_func_isblank" = xyes; then : - $as_echo "#define HAVE_ISBLANK 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" isblank.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS isblank.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "isascii" "ac_cv_func_isascii" -if test "x$ac_cv_func_isascii" = xyes; then : - $as_echo "#define HAVE_ISASCII 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" isascii.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS isascii.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" -if test "x$ac_cv_func_inet_aton" = xyes; then : - $as_echo "#define HAVE_INET_ATON 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" inet_aton.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_aton.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton" -if test "x$ac_cv_func_inet_pton" = xyes; then : - $as_echo "#define HAVE_INET_PTON 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" inet_pton.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_pton.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" -if test "x$ac_cv_func_inet_ntop" = xyes; then : - $as_echo "#define HAVE_INET_NTOP 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" inet_ntop.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" -if test "x$ac_cv_func_snprintf" = xyes; then : - $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" snprintf.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" -if test "x$ac_cv_func_strlcpy" = xyes; then : - $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" strlcpy.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strlcpy.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" -if test "x$ac_cv_func_memmove" = xyes; then : - $as_echo "#define HAVE_MEMMOVE 1" >>confdefs.h - -else - case " $LIBOBJS " in - *" memmove.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS memmove.$ac_objext" - ;; -esac - -fi - - -ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" -if test "x$ac_cv_type_pid_t" = xyes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define pid_t int -_ACEOF - -fi - -for ac_header in vfork.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default" -if test "x$ac_cv_header_vfork_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VFORK_H 1 -_ACEOF - -fi - -done - -for ac_func in fork vfork -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - -if test "x$ac_cv_func_fork" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 -$as_echo_n "checking for working fork... " >&6; } -if ${ac_cv_func_fork_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_fork_works=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ - - /* By Ruediger Kuhlmann. */ - return fork () < 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_fork_works=yes -else - ac_cv_func_fork_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 -$as_echo "$ac_cv_func_fork_works" >&6; } - -else - ac_cv_func_fork_works=$ac_cv_func_fork -fi -if test "x$ac_cv_func_fork_works" = xcross; then - case $host in - *-*-amigaos* | *-*-msdosdjgpp*) - # Override, as these systems have only a dummy fork() stub - ac_cv_func_fork_works=no - ;; - *) - ac_cv_func_fork_works=yes - ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 -$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} -fi -ac_cv_func_vfork_works=$ac_cv_func_vfork -if test "x$ac_cv_func_vfork" = xyes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 -$as_echo_n "checking for working vfork... " >&6; } -if ${ac_cv_func_vfork_works+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_vfork_works=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Thanks to Paul Eggert for this test. */ -$ac_includes_default -#include <sys/wait.h> -#ifdef HAVE_VFORK_H -# include <vfork.h> -#endif -/* On some sparc systems, changes by the child to local and incoming - argument registers are propagated back to the parent. The compiler - is told about this with #include <vfork.h>, but some compilers - (e.g. gcc -O) don't grok <vfork.h>. Test for this by using a - static variable whose address is put into a register that is - clobbered by the vfork. */ -static void -#ifdef __cplusplus -sparc_address_test (int arg) -# else -sparc_address_test (arg) int arg; -#endif -{ - static pid_t child; - if (!child) { - child = vfork (); - if (child < 0) { - perror ("vfork"); - _exit(2); - } - if (!child) { - arg = getpid(); - write(-1, "", 0); - _exit (arg); - } - } -} - -int -main () -{ - pid_t parent = getpid (); - pid_t child; - - sparc_address_test (0); - - child = vfork (); - - if (child == 0) { - /* Here is another test for sparc vfork register problems. This - test uses lots of local variables, at least as many local - variables as main has allocated so far including compiler - temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris - 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should - reuse the register of parent for one of the local variables, - since it will think that parent can't possibly be used any more - in this routine. Assigning to the local variable will thus - munge parent in the parent process. */ - pid_t - p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), - p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); - /* Convince the compiler that p..p7 are live; otherwise, it might - use the same hardware register for all 8 local variables. */ - if (p != p1 || p != p2 || p != p3 || p != p4 - || p != p5 || p != p6 || p != p7) - _exit(1); - - /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent - from child file descriptors. If the child closes a descriptor - before it execs or exits, this munges the parent's descriptor - as well. Test for this by closing stdout in the child. */ - _exit(close(fileno(stdout)) != 0); - } else { - int status; - struct stat st; - - while (wait(&status) != child) - ; - return ( - /* Was there some problem with vforking? */ - child < 0 - - /* Did the child fail? (This shouldn't happen.) */ - || status - - /* Did the vfork/compiler bug occur? */ - || parent != getpid() - - /* Did the file descriptor bug occur? */ - || fstat(fileno(stdout), &st) != 0 - ); - } -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_vfork_works=yes -else - ac_cv_func_vfork_works=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 -$as_echo "$ac_cv_func_vfork_works" >&6; } - -fi; -if test "x$ac_cv_func_fork_works" = xcross; then - ac_cv_func_vfork_works=$ac_cv_func_vfork - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 -$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} -fi - -if test "x$ac_cv_func_vfork_works" = xyes; then - -$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h - -else - -$as_echo "#define vfork fork" >>confdefs.h - -fi -if test "x$ac_cv_func_fork_works" = xyes; then - -$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h - -fi - -for ac_func in endprotoent endservent sleep random fcntl strtoul bzero memset b32_ntop b32_pton -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - -if test "x$HAVE_B32_NTOP" = "xyes"; then - ldns_build_config_have_b32_ntop=1 - -else - ldns_build_config_have_b32_ntop=0 - -fi -if test "x$HAVE_B32_PTON" = "xyes"; then - ldns_build_config_have_b32_pton=1 - -else - ldns_build_config_have_b32_pton=0 - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 -$as_echo_n "checking for getaddrinfo... " >&6; } -ac_cv_func_getaddrinfo=no -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef __cplusplus -extern "C" -{ -#endif -char* getaddrinfo(); -char* (*f) () = getaddrinfo; -#ifdef __cplusplus -} -#endif -int main() { - ; - return 0; -} - -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_func_getaddrinfo="yes" -if test "$ac_cv_header_windows_h" = "yes"; then - -$as_echo "#define USE_WINSOCK 1" >>confdefs.h - - USE_WINSOCK="1" - if echo $LIBS | grep 'lws2_32' >/dev/null; then - : - else - LIBS="$LIBS -lws2_32" - fi -fi - -else - ORIGLIBS="$LIBS" -LIBS="$LIBS -lws2_32" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef HAVE_WS2TCPIP_H -#include <ws2tcpip.h> -#endif - -int -main () -{ - - (void)getaddrinfo(NULL, NULL, NULL, NULL); - - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -ac_cv_func_getaddrinfo="yes" - -$as_echo "#define USE_WINSOCK 1" >>confdefs.h - -USE_WINSOCK="1" - -else - -ac_cv_func_getaddrinfo="no" -LIBS="$ORIGLIBS" - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getaddrinfo" >&5 -$as_echo "$ac_cv_func_getaddrinfo" >&6; } -if test $ac_cv_func_getaddrinfo = yes; then - -$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h - -fi - -if test $ac_cv_func_getaddrinfo = no; then - case " $LIBOBJS " in - *" fake-rfc2553.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS fake-rfc2553.$ac_objext" - ;; -esac - -fi -if test "$USE_WINSOCK" = 1; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. -set dummy ${ac_tool_prefix}windres; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_WINDRES+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$WINDRES"; then - ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_WINDRES="${ac_tool_prefix}windres" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -WINDRES=$ac_cv_prog_WINDRES -if test -n "$WINDRES"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 -$as_echo "$WINDRES" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_WINDRES"; then - ac_ct_WINDRES=$WINDRES - # Extract the first word of "windres", so it can be a program name with args. -set dummy windres; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_WINDRES"; then - ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_WINDRES="windres" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES -if test -n "$ac_ct_WINDRES"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 -$as_echo "$ac_ct_WINDRES" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_WINDRES" = x; then - WINDRES="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - WINDRES=$ac_ct_WINDRES - fi -else - WINDRES="$ac_cv_prog_WINDRES" -fi - -fi - -# check ioctlsocket -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ioctlsocket" >&5 -$as_echo_n "checking for ioctlsocket... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef HAVE_WINSOCK2_H -#include <winsock2.h> -#endif - -int -main () -{ - - (void)ioctlsocket(0, 0, NULL); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - -$as_echo "#define HAVE_IOCTLSOCKET 1" >>confdefs.h - - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - - -#AC_SEARCH_LIBS(RSA_new, [crypto]) - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler (${CC-cc}) accepts the \"format\" attribute" >&5 -$as_echo_n "checking whether the C compiler (${CC-cc}) accepts the \"format\" attribute... " >&6; } -if ${ac_cv_c_format_attribute+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_format_attribute=no -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdio.h> -void f (char *format, ...) __attribute__ ((format (printf, 1, 2))); -void (*pf) (char *format, ...) __attribute__ ((format (printf, 1, 2))); - -int -main () -{ - - f ("%s", "str"); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_format_attribute="yes" -else - ac_cv_c_format_attribute="no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_format_attribute" >&5 -$as_echo "$ac_cv_c_format_attribute" >&6; } -if test $ac_cv_c_format_attribute = yes; then - -$as_echo "#define HAVE_ATTR_FORMAT 1" >>confdefs.h - -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler (${CC-cc}) accepts the \"unused\" attribute" >&5 -$as_echo_n "checking whether the C compiler (${CC-cc}) accepts the \"unused\" attribute... " >&6; } -if ${ac_cv_c_unused_attribute+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_c_unused_attribute=no -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <stdio.h> -void f (char *u __attribute__((unused))); - -int -main () -{ - - f ("x"); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_unused_attribute="yes" -else - ac_cv_c_unused_attribute="no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_unused_attribute" >&5 -$as_echo "$ac_cv_c_unused_attribute" >&6; } -if test $ac_cv_c_unused_attribute = yes; then - -$as_echo "#define HAVE_ATTR_UNUSED 1" >>confdefs.h - -fi - - - -# Check whether --with-xcode-sdk was given. -if test "${with_xcode_sdk+set}" = set; then : - withval=$with_xcode_sdk; -else - with_xcode_sdk="yes" -fi - -if test "x_$with_xcode_sdk" != "x_no" ; then - # check OSX deployment target, if needed - if echo $build_os | grep darwin > /dev/null; then - sdk_p=`xcode-select -print-path`; - if test "x_$with_xcode_sdk" = "x_yes" ; then - sdk_v="$( /usr/bin/xcrun --show-sdk-version 2>/dev/null )" - else - sdk_v="$with_xcode_sdk" - fi - # xcrun only got that option in 10.7 - if test -z "$sdk_v" ; then - sdk_c="10.6" - sdk_v="10.6" - fi - SYSROOT="$( find ${sdk_p} -name MacOSX${sdk_v}.sdk )" - case $sdk_v in - 10.9|10.8) sdk_c="10.7";; - 10.11|10.10|*) sdk_c="10.10";; - esac - export MACOSX_DEPLOYMENT_TARGET="${sdk_c}"; - export CFLAGS="$CFLAGS -mmacosx-version-min=${sdk_c} -isysroot ${SYSROOT}" - fi -fi - - -$as_echo "#define SYSCONFDIR sysconfdir" >>confdefs.h - - - -# Check whether --with-trust-anchor was given. -if test "${with_trust_anchor+set}" = set; then : - withval=$with_trust_anchor; - LDNS_TRUST_ANCHOR_FILE="$withval" - - { $as_echo "$as_me:${as_lineno-$LINENO}: Default trust anchor: $withval" >&5 -$as_echo "$as_me: Default trust anchor: $withval" >&6;} - -else - - LDNS_TRUST_ANCHOR_FILE="\$(sysconfdir)/unbound/root.key" - - -fi - - - -# Check whether --with-ca-file was given. -if test "${with_ca_file+set}" = set; then : - withval=$with_ca_file; - -$as_echo "#define HAVE_DANE_CA_FILE 1" >>confdefs.h - - -cat >>confdefs.h <<_ACEOF -#define LDNS_DANE_CA_FILE "$withval" -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using CAfile: $withval" >&5 -$as_echo "$as_me: Using CAfile: $withval" >&6;} - DEFAULT_CAFILE="Default is $withval" - - -else - - -$as_echo "#define HAVE_DANE_CA_FILE 0" >>confdefs.h - - - -fi - - - -# Check whether --with-ca-path was given. -if test "${with_ca_path+set}" = set; then : - withval=$with_ca_path; - -$as_echo "#define HAVE_DANE_CA_PATH 1" >>confdefs.h - - -cat >>confdefs.h <<_ACEOF -#define LDNS_DANE_CA_PATH "$withval" -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using CApath: $withval" >&5 -$as_echo "$as_me: Using CApath: $withval" >&6;} - DEFAULT_CAPATH="Default is $withval" - - -else - - -$as_echo "#define HAVE_DANE_CA_PATH 0" >>confdefs.h - - - -fi - - - - - - -if test "x$HAVE_SSL" = "xyes"; then - ldns_build_config_have_ssl=1 - -else - ldns_build_config_have_ssl=0 - -fi -if test "x$ac_cv_c_format_attribute" = "xyes"; then - ldns_build_config_have_attr_format=1 - -else - ldns_build_config_have_attr_format=0 - -fi -if test "x$ac_cv_c_unused_attribute" = "xyes"; then - ldns_build_config_have_attr_unused=1 - -else - ldns_build_config_have_attr_unused=0 - -fi - -CONFIG_FILES="Makefile ldns/common.h ldns/net.h ldns/util.h packaging/libldns.pc packaging/ldns-config" - -ac_config_files="$ac_config_files $CONFIG_FILES" - - -ac_config_headers="$ac_config_headers ldns/config.h" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -DEFS=-DHAVE_CONFIG_H - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by ldns $as_me 1.7.1, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - -case $ac_config_headers in *" -"*) set x $ac_config_headers; shift; ac_config_headers=$*;; -esac - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - --header=FILE[:TEMPLATE] - instantiate the configuration header FILE - -Configuration files: -$config_files - -Configuration headers: -$config_headers - -Configuration commands: -$config_commands - -Report bugs to <libdns@nlnetlabs.nl>." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -ldns config.status 1.7.1 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -AWK='$AWK' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --header | --heade | --head | --hea ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append CONFIG_HEADERS " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h) - # Conflict between --help and --header - as_fn_error $? "ambiguous option: \`$1' -Try \`$0 --help' for more information.";; - --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# -# INIT-COMMANDS -# - - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' -configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -FILECMD \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_import \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -lt_cv_nm_interface \ -nm_file_list_spec \ -lt_cv_truncate_bin \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -configure_time_dlsearch_path \ -configure_time_lt_sys_library_path; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' - -# See if we are running on zsh, and set the options that allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - RM='$RM' - ofile='$ofile' - - - - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; - "disable-rpath") CONFIG_COMMANDS="$CONFIG_COMMANDS disable-rpath" ;; - "$CONFIG_FILES") CONFIG_FILES="$CONFIG_FILES $CONFIG_FILES" ;; - "ldns/config.h") CONFIG_HEADERS="$CONFIG_HEADERS ldns/config.h" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' <conf$$subs.awk | sed ' -/^[^""]/{ - N - s/\n// -} -' >>$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - -# Set up the scripts for CONFIG_HEADERS section. -# No need to generate them if there are no CONFIG_HEADERS. -# This happens for instance with `./config.status Makefile'. -if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || -BEGIN { -_ACEOF - -# Transform confdefs.h into an awk script `defines.awk', embedded as -# here-document in config.status, that substitutes the proper values into -# config.h.in to produce config.h. - -# Create a delimiter string that does not exist in confdefs.h, to ease -# handling of long lines. -ac_delim='%!_!# ' -for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -# For the awk script, D is an array of macro values keyed by name, -# likewise P contains macro parameters if any. Preserve backslash -# newline sequences. - -ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* -sed -n ' -s/.\{148\}/&'"$ac_delim"'/g -t rset -:rset -s/^[ ]*#[ ]*define[ ][ ]*/ / -t def -d -:def -s/\\$// -t bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3"/p -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p -d -:bsnl -s/["\\]/\\&/g -s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ -D["\1"]=" \3\\\\\\n"\\/p -t cont -s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p -t cont -d -:cont -n -s/.\{148\}/&'"$ac_delim"'/g -t clear -:clear -s/\\$// -t bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/"/p -d -:bsnlc -s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p -b cont -' <confdefs.h | sed ' -s/'"$ac_delim"'/"\\\ -"/g' >>$CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - for (key in D) D_is_set[key] = 1 - FS = "" -} -/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { - line = \$ 0 - split(line, arg, " ") - if (arg[1] == "#") { - defundef = arg[2] - mac1 = arg[3] - } else { - defundef = substr(arg[1], 2) - mac1 = arg[2] - } - split(mac1, mac2, "(") #) - macro = mac2[1] - prefix = substr(line, 1, index(line, defundef) - 1) - if (D_is_set[macro]) { - # Preserve the white space surrounding the "#". - print prefix "define", macro P[macro] D[macro] - next - } else { - # Replace #undef with comments. This is necessary, for example, - # in the case of _POSIX_SOURCE, which is predefined and required - # on some systems where configure will not decide to define it. - if (defundef == "undef") { - print "/*", prefix defundef, macro, "*/" - next - } - } -} -{ print } -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 -fi # test -n "$CONFIG_HEADERS" - - -eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - :H) - # - # CONFIG_HEADER - # - if test x"$ac_file" != x-; then - { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} - else - rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - fi - else - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error $? "could not create -" "$LINENO" 5 - fi - ;; - - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "libtool":C) - - # See if we are running on zsh, and set the options that allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}"; then - setopt NO_GLOB_SUBST - fi - - cfgfile=${ofile}T - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL -# Generated automatically by $as_me ($PACKAGE) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. - -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit, 1996 - -# Copyright (C) 2014 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program or library that is built -# using GNU Libtool, you may include this file under the same -# distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - - -# The names of the tagged configurations supported by this script. -available_tags='' - -# Configured defaults for sys_lib_dlsearch_path munging. -: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shared archive member basename,for filename based shared library versioning on AIX. -shared_archive_member_spec=$shared_archive_member_spec - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# A file(cmd) program that detects file types. -FILECMD=$lt_FILECMD - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive (by configure). -lt_ar_flags=$lt_ar_flags - -# Flags to create an archive. -AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm into a list of symbols to manually relocate. -global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# The name lister interface. -nm_interface=$lt_lt_cv_nm_interface - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and where our libraries should be installed. -lt_sysroot=$lt_sysroot - -# Command to truncate a binary pipe. -lt_truncate_bin=$lt_lt_cv_truncate_bin - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Detected run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path - -# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. -configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \$shlibpath_var if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# ### END LIBTOOL CONFIG - -_LT_EOF - - cat <<'_LT_EOF' >> "$cfgfile" - -# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE - -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} - - -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -func_cc_basename () -{ - for cc_temp in $*""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac - done - func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -} - - -# ### END FUNCTIONS SHARED WITH CONFIGURE - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test set != "${COLLECT_NAMES+set}"; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain=$ac_aux_dir/ltmain.sh - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - $SED '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - ;; - "disable-rpath":C) - sed < libtool > libtool-2 \ - 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_RPATH_SED__ "/' - mv libtool-2 libtool - chmod 755 libtool - libtool="./libtool" - ;; - - esac -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - - -echo "copying header files" - -for file in $srcdir/ldns//*.h; do - sh $srcdir/install-sh -m 644 $file ldns/ -done - - - - - diff --git a/ldns/dane.c b/ldns/dane.c deleted file mode 100644 index 30dc1f7..0000000 --- a/ldns/dane.c +++ /dev/null @@ -1,941 +0,0 @@ -/* - * Verify or create TLS authentication with DANE (RFC6698) - * - * (c) NLnetLabs 2012 - * - * See the file LICENSE for the license. - * - */ - -#include <ldns/config.h> -#ifdef USE_DANE - -#include <ldns/ldns.h> -#include <ldns/dane.h> - -#include <unistd.h> -#include <stdlib.h> -#include <sys/types.h> -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif - -#ifdef HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/err.h> -#include <openssl/x509v3.h> -#endif - -ldns_status -ldns_dane_create_tlsa_owner(ldns_rdf** tlsa_owner, const ldns_rdf* name, - uint16_t port, ldns_dane_transport transport) -{ - char buf[LDNS_MAX_DOMAINLEN]; - size_t s; - - assert(tlsa_owner != NULL); - assert(name != NULL); - assert(ldns_rdf_get_type(name) == LDNS_RDF_TYPE_DNAME); - - s = (size_t)snprintf(buf, LDNS_MAX_DOMAINLEN, "X_%d", (int)port); - buf[0] = (char)(s - 1); - - switch(transport) { - case LDNS_DANE_TRANSPORT_TCP: - s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\004_tcp"); - break; - - case LDNS_DANE_TRANSPORT_UDP: - s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\004_udp"); - break; - - case LDNS_DANE_TRANSPORT_SCTP: - s += snprintf(buf + s, LDNS_MAX_DOMAINLEN - s, "\005_sctp"); - break; - - default: - return LDNS_STATUS_DANE_UNKNOWN_TRANSPORT; - } - if (s + ldns_rdf_size(name) > LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - memcpy(buf + s, ldns_rdf_data(name), ldns_rdf_size(name)); - *tlsa_owner = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, - s + ldns_rdf_size(name), buf); - if (*tlsa_owner == NULL) { - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - - -#ifdef HAVE_SSL -ldns_status -ldns_dane_cert2rdf(ldns_rdf** rdf, X509* cert, - ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type) -{ - unsigned char* buf = NULL; - size_t len; - - X509_PUBKEY* xpubkey; - EVP_PKEY* epubkey; - - unsigned char* digest; - - assert(rdf != NULL); - assert(cert != NULL); - - switch(selector) { - case LDNS_TLSA_SELECTOR_FULL_CERTIFICATE: - - len = (size_t)i2d_X509(cert, &buf); - break; - - case LDNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO: - -#ifndef S_SPLINT_S - xpubkey = X509_get_X509_PUBKEY(cert); -#endif - if (! xpubkey) { - return LDNS_STATUS_SSL_ERR; - } - epubkey = X509_PUBKEY_get(xpubkey); - if (! epubkey) { - return LDNS_STATUS_SSL_ERR; - } - len = (size_t)i2d_PUBKEY(epubkey, &buf); - break; - - default: - return LDNS_STATUS_DANE_UNKNOWN_SELECTOR; - } - - switch(matching_type) { - case LDNS_TLSA_MATCHING_TYPE_NO_HASH_USED: - - *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, len, buf); - - return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; - break; - - case LDNS_TLSA_MATCHING_TYPE_SHA256: - - digest = LDNS_XMALLOC(unsigned char, LDNS_SHA256_DIGEST_LENGTH); - if (digest == NULL) { - LDNS_FREE(buf); - return LDNS_STATUS_MEM_ERR; - } - (void) ldns_sha256(buf, (unsigned int)len, digest); - *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, LDNS_SHA256_DIGEST_LENGTH, - digest); - LDNS_FREE(buf); - - return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; - break; - - case LDNS_TLSA_MATCHING_TYPE_SHA512: - - digest = LDNS_XMALLOC(unsigned char, LDNS_SHA512_DIGEST_LENGTH); - if (digest == NULL) { - LDNS_FREE(buf); - return LDNS_STATUS_MEM_ERR; - } - (void) ldns_sha512(buf, (unsigned int)len, digest); - *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HEX, LDNS_SHA512_DIGEST_LENGTH, - digest); - LDNS_FREE(buf); - - return *rdf ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; - break; - - default: - LDNS_FREE(buf); - return LDNS_STATUS_DANE_UNKNOWN_MATCHING_TYPE; - } -} - - -/* Ordinary PKIX validation of cert (with extra_certs to help) - * against the CA's in store - */ -static ldns_status -ldns_dane_pkix_validate(X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* store) -{ - X509_STORE_CTX* vrfy_ctx; - ldns_status s; - - if (! store) { - return LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - vrfy_ctx = X509_STORE_CTX_new(); - if (! vrfy_ctx) { - - return LDNS_STATUS_SSL_ERR; - - } else if (X509_STORE_CTX_init(vrfy_ctx, store, - cert, extra_certs) != 1) { - s = LDNS_STATUS_SSL_ERR; - - } else if (X509_verify_cert(vrfy_ctx) == 1) { - - s = LDNS_STATUS_OK; - - } else { - s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - X509_STORE_CTX_free(vrfy_ctx); - return s; -} - - -/* Orinary PKIX validation of cert (with extra_certs to help) - * against the CA's in store, but also return the validation chain. - */ -static ldns_status -ldns_dane_pkix_validate_and_get_chain(STACK_OF(X509)** chain, X509* cert, - STACK_OF(X509)* extra_certs, X509_STORE* store) -{ - ldns_status s; - X509_STORE* empty_store = NULL; - X509_STORE_CTX* vrfy_ctx; - - assert(chain != NULL); - - if (! store) { - store = empty_store = X509_STORE_new(); - } - s = LDNS_STATUS_SSL_ERR; - vrfy_ctx = X509_STORE_CTX_new(); - if (! vrfy_ctx) { - - goto exit_free_empty_store; - - } else if (X509_STORE_CTX_init(vrfy_ctx, store, - cert, extra_certs) != 1) { - goto exit_free_vrfy_ctx; - - } else if (X509_verify_cert(vrfy_ctx) == 1) { - - s = LDNS_STATUS_OK; - - } else { - s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - *chain = X509_STORE_CTX_get1_chain(vrfy_ctx); - if (! *chain) { - s = LDNS_STATUS_SSL_ERR; - } - -exit_free_vrfy_ctx: - X509_STORE_CTX_free(vrfy_ctx); - -exit_free_empty_store: - if (empty_store) { - X509_STORE_free(empty_store); - } - return s; -} - - -/* Return the validation chain that can be build out of cert, with extra_certs. - */ -static ldns_status -ldns_dane_pkix_get_chain(STACK_OF(X509)** chain, - X509* cert, STACK_OF(X509)* extra_certs) -{ - ldns_status s; - X509_STORE* empty_store = NULL; - X509_STORE_CTX* vrfy_ctx; - - assert(chain != NULL); - - empty_store = X509_STORE_new(); - s = LDNS_STATUS_SSL_ERR; - vrfy_ctx = X509_STORE_CTX_new(); - if (! vrfy_ctx) { - - goto exit_free_empty_store; - - } else if (X509_STORE_CTX_init(vrfy_ctx, empty_store, - cert, extra_certs) != 1) { - goto exit_free_vrfy_ctx; - } - (void) X509_verify_cert(vrfy_ctx); - *chain = X509_STORE_CTX_get1_chain(vrfy_ctx); - if (! *chain) { - s = LDNS_STATUS_SSL_ERR; - } else { - s = LDNS_STATUS_OK; - } -exit_free_vrfy_ctx: - X509_STORE_CTX_free(vrfy_ctx); - -exit_free_empty_store: - X509_STORE_free(empty_store); - return s; -} - - -/* Pop n+1 certs and return the last popped. - */ -static ldns_status -ldns_dane_get_nth_cert_from_validation_chain( - X509** cert, STACK_OF(X509)* chain, int n, bool ca) -{ - if (n >= sk_X509_num(chain) || n < 0) { - return LDNS_STATUS_DANE_OFFSET_OUT_OF_RANGE; - } - *cert = sk_X509_pop(chain); - while (n-- > 0) { - X509_free(*cert); - *cert = sk_X509_pop(chain); - } - if (ca && ! X509_check_ca(*cert)) { - return LDNS_STATUS_DANE_NON_CA_CERTIFICATE; - } - return LDNS_STATUS_OK; -} - - -/* Create validation chain with cert and extra_certs and returns the last - * self-signed (if present). - */ -static ldns_status -ldns_dane_pkix_get_last_self_signed(X509** out_cert, - X509* cert, STACK_OF(X509)* extra_certs) -{ - ldns_status s; - X509_STORE* empty_store = NULL; - X509_STORE_CTX* vrfy_ctx; - - assert(out_cert != NULL); - - empty_store = X509_STORE_new(); - s = LDNS_STATUS_SSL_ERR; - vrfy_ctx = X509_STORE_CTX_new(); - if (! vrfy_ctx) { - goto exit_free_empty_store; - - } else if (X509_STORE_CTX_init(vrfy_ctx, empty_store, - cert, extra_certs) != 1) { - goto exit_free_vrfy_ctx; - - } - (void) X509_verify_cert(vrfy_ctx); - if (X509_STORE_CTX_get_error(vrfy_ctx) == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN || - X509_STORE_CTX_get_error(vrfy_ctx) == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT){ - - *out_cert = X509_STORE_CTX_get_current_cert( vrfy_ctx); - s = LDNS_STATUS_OK; - } else { - s = LDNS_STATUS_DANE_PKIX_NO_SELF_SIGNED_TRUST_ANCHOR; - } -exit_free_vrfy_ctx: - X509_STORE_CTX_free(vrfy_ctx); - -exit_free_empty_store: - X509_STORE_free(empty_store); - return s; -} - - -ldns_status -ldns_dane_select_certificate(X509** selected_cert, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store, - ldns_tlsa_certificate_usage cert_usage, int offset) -{ - ldns_status s; - STACK_OF(X509)* pkix_validation_chain = NULL; - - assert(selected_cert != NULL); - assert(cert != NULL); - - /* With PKIX validation explicitly turned off (pkix_validation_store - * == NULL), treat the "CA constraint" and "Service certificate - * constraint" the same as "Trust anchor assertion" and "Domain issued - * certificate" respectively. - */ - if (pkix_validation_store == NULL) { - switch (cert_usage) { - - case LDNS_TLSA_USAGE_CA_CONSTRAINT: - - cert_usage = LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION; - break; - - case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT: - - cert_usage = LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE; - break; - - default: - break; - } - } - - /* Now what to do with each Certificate usage... - */ - switch (cert_usage) { - - case LDNS_TLSA_USAGE_CA_CONSTRAINT: - - s = ldns_dane_pkix_validate_and_get_chain( - &pkix_validation_chain, - cert, extra_certs, - pkix_validation_store); - if (! pkix_validation_chain) { - return s; - } - if (s == LDNS_STATUS_OK) { - if (offset == -1) { - offset = 0; - } - s = ldns_dane_get_nth_cert_from_validation_chain( - selected_cert, pkix_validation_chain, - offset, true); - } - sk_X509_pop_free(pkix_validation_chain, X509_free); - return s; - break; - - - case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT: - - *selected_cert = cert; - return ldns_dane_pkix_validate(cert, extra_certs, - pkix_validation_store); - break; - - - case LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION: - - if (offset == -1) { - s = ldns_dane_pkix_get_last_self_signed( - selected_cert, cert, extra_certs); - return s; - } else { - s = ldns_dane_pkix_get_chain( - &pkix_validation_chain, - cert, extra_certs); - if (s == LDNS_STATUS_OK) { - s = - ldns_dane_get_nth_cert_from_validation_chain( - selected_cert, pkix_validation_chain, - offset, false); - } else if (! pkix_validation_chain) { - return s; - } - sk_X509_pop_free(pkix_validation_chain, X509_free); - return s; - } - break; - - - case LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE: - - *selected_cert = cert; - return LDNS_STATUS_OK; - break; - - default: - return LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE; - break; - } -} - - -ldns_status -ldns_dane_create_tlsa_rr(ldns_rr** tlsa, - ldns_tlsa_certificate_usage certificate_usage, - ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type, - X509* cert) -{ - ldns_rdf* rdf; - ldns_status s; - - assert(tlsa != NULL); - assert(cert != NULL); - - /* create rr */ - *tlsa = ldns_rr_new_frm_type(LDNS_RR_TYPE_TLSA); - if (*tlsa == NULL) { - return LDNS_STATUS_MEM_ERR; - } - - rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, - (uint8_t)certificate_usage); - if (rdf == NULL) { - goto memerror; - } - (void) ldns_rr_set_rdf(*tlsa, rdf, 0); - - rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t)selector); - if (rdf == NULL) { - goto memerror; - } - (void) ldns_rr_set_rdf(*tlsa, rdf, 1); - - rdf = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t)matching_type); - if (rdf == NULL) { - goto memerror; - } - (void) ldns_rr_set_rdf(*tlsa, rdf, 2); - - s = ldns_dane_cert2rdf(&rdf, cert, selector, matching_type); - if (s == LDNS_STATUS_OK) { - (void) ldns_rr_set_rdf(*tlsa, rdf, 3); - return LDNS_STATUS_OK; - } - ldns_rr_free(*tlsa); - *tlsa = NULL; - return s; - -memerror: - ldns_rr_free(*tlsa); - *tlsa = NULL; - return LDNS_STATUS_MEM_ERR; -} - - -#ifdef USE_DANE_VERIFY -/* Return tlsas that actually are TLSA resource records with known values - * for the Certificate usage, Selector and Matching type rdata fields. - */ -static ldns_rr_list* -ldns_dane_filter_unusable_records(const ldns_rr_list* tlsas) -{ - size_t i; - ldns_rr_list* r = ldns_rr_list_new(); - ldns_rr* tlsa_rr; - - if (! r) { - return NULL; - } - for (i = 0; i < ldns_rr_list_rr_count(tlsas); i++) { - tlsa_rr = ldns_rr_list_rr(tlsas, i); - if (ldns_rr_get_type(tlsa_rr) == LDNS_RR_TYPE_TLSA && - ldns_rr_rd_count(tlsa_rr) == 4 && - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0)) <= 3 && - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1)) <= 1 && - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2)) <= 2) { - - if (! ldns_rr_list_push_rr(r, tlsa_rr)) { - ldns_rr_list_free(r); - return NULL; - } - } - } - return r; -} - - -#if !defined(USE_DANE_TA_USAGE) -/* Return whether cert/selector/matching_type matches data. - */ -static ldns_status -ldns_dane_match_cert_with_data(X509* cert, ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type, ldns_rdf* data) -{ - ldns_status s; - ldns_rdf* match_data; - - s = ldns_dane_cert2rdf(&match_data, cert, selector, matching_type); - if (s == LDNS_STATUS_OK) { - if (ldns_rdf_compare(data, match_data) != 0) { - s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH; - } - ldns_rdf_free(match_data); - } - return s; -} - - -/* Return whether any certificate from the chain with selector/matching_type - * matches data. - * ca should be true if the certificate has to be a CA certificate too. - */ -static ldns_status -ldns_dane_match_any_cert_with_data(STACK_OF(X509)* chain, - ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type, - ldns_rdf* data, bool ca) -{ - ldns_status s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH; - size_t n, i; - X509* cert; - - n = (size_t)sk_X509_num(chain); - for (i = 0; i < n; i++) { - cert = sk_X509_pop(chain); - if (! cert) { - s = LDNS_STATUS_SSL_ERR; - break; - } - s = ldns_dane_match_cert_with_data(cert, - selector, matching_type, data); - if (ca && s == LDNS_STATUS_OK && ! X509_check_ca(cert)) { - s = LDNS_STATUS_DANE_NON_CA_CERTIFICATE; - } - X509_free(cert); - if (s != LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH) { - break; - } - /* when s == LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH, - * try to match the next certificate - */ - } - return s; -} -#endif /* !defined(USE_DANE_TA_USAGE) */ -#endif /* USE_DANE_VERIFY */ - -#ifdef USE_DANE_VERIFY -ldns_status -ldns_dane_verify_rr(const ldns_rr* tlsa_rr, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store) -{ -#if defined(USE_DANE_TA_USAGE) - SSL_CTX *ssl_ctx = NULL; - SSL *ssl = NULL; - X509_STORE_CTX *store_ctx = NULL; -#else - STACK_OF(X509)* pkix_validation_chain = NULL; -#endif - ldns_status s = LDNS_STATUS_OK; - - ldns_tlsa_certificate_usage usage; - ldns_tlsa_selector selector; - ldns_tlsa_matching_type mtype; - ldns_rdf* data; - - if (! tlsa_rr || ldns_rr_get_type(tlsa_rr) != LDNS_RR_TYPE_TLSA || - ldns_rr_rd_count(tlsa_rr) != 4 || - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0)) > 3 || - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1)) > 1 || - ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2)) > 2 ) { - /* No (usable) TLSA, so regular PKIX validation - */ - return ldns_dane_pkix_validate(cert, extra_certs, - pkix_validation_store); - } - usage = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 0)); - selector = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 1)); - mtype = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr, 2)); - data = ldns_rr_rdf(tlsa_rr, 3) ; - -#if defined(USE_DANE_TA_USAGE) - /* Rely on OpenSSL dane functions. - * - * OpenSSL does not provide offline dane verification. The dane unit - * tests within openssl use the undocumented SSL_get0_dane() and - * X509_STORE_CTX_set0_dane() to convey dane parameters set on SSL and - * SSL_CTX to a X509_STORE_CTX that can be used to do offline - * verification. We use these undocumented means with the ldns - * dane function prototypes which did only offline dane verification. - */ - if (!(ssl_ctx = SSL_CTX_new(TLS_client_method()))) - s = LDNS_STATUS_MEM_ERR; - - else if (SSL_CTX_dane_enable(ssl_ctx) <= 0) - s = LDNS_STATUS_SSL_ERR; - - else if (SSL_CTX_dane_set_flags( - ssl_ctx, DANE_FLAG_NO_DANE_EE_NAMECHECKS), - !(ssl = SSL_new(ssl_ctx))) - s = LDNS_STATUS_MEM_ERR; - - else if (SSL_set_connect_state(ssl), - (SSL_dane_enable(ssl, NULL) <= 0)) - s = LDNS_STATUS_SSL_ERR; - - else if (SSL_dane_tlsa_add(ssl, usage, selector, mtype, - ldns_rdf_data(data), ldns_rdf_size(data)) <= 0) - s = LDNS_STATUS_SSL_ERR; - - else if (!(store_ctx = X509_STORE_CTX_new())) - s = LDNS_STATUS_MEM_ERR; - - else if (!X509_STORE_CTX_init(store_ctx, pkix_validation_store, cert, extra_certs)) - s = LDNS_STATUS_SSL_ERR; - - else { - int ret; - - X509_STORE_CTX_set_default(store_ctx, - SSL_is_server(ssl) ? "ssl_client" : "ssl_server"); - X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx), - SSL_get0_param(ssl)); - X509_STORE_CTX_set0_dane(store_ctx, SSL_get0_dane(ssl)); - if (SSL_get_verify_callback(ssl)) - X509_STORE_CTX_set_verify_cb(store_ctx, SSL_get_verify_callback(ssl)); - - ret = X509_verify_cert(store_ctx); - if (!ret) { - if (X509_STORE_CTX_get_error(store_ctx) == X509_V_ERR_DANE_NO_MATCH) - s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH; - else - s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - X509_STORE_CTX_cleanup(store_ctx); - } - if (store_ctx) - X509_STORE_CTX_free(store_ctx); - if (ssl) - SSL_free(ssl); - if (ssl_ctx) - SSL_CTX_free(ssl_ctx); - return s; -#else - switch (usage) { - case LDNS_TLSA_USAGE_CA_CONSTRAINT: - s = ldns_dane_pkix_validate_and_get_chain( - &pkix_validation_chain, - cert, extra_certs, - pkix_validation_store); - if (! pkix_validation_chain) { - return s; - } - if (s == LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE) { - /* - * NO PKIX validation. We still try to match *any* - * certificate from the chain, so we return - * TLSA errors over PKIX errors. - * - * i.e. When the TLSA matches no certificate, we return - * TLSA_DID_NOT_MATCH and not PKIX_DID_NOT_VALIDATE - */ - s = ldns_dane_match_any_cert_with_data( - pkix_validation_chain, - selector, mtype, data, true); - - if (s == LDNS_STATUS_OK) { - /* A TLSA record did match a cert from the - * chain, thus the error is failed PKIX - * validation. - */ - s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - - } else if (s == LDNS_STATUS_OK) { - /* PKIX validated, does the TLSA match too? */ - - s = ldns_dane_match_any_cert_with_data( - pkix_validation_chain, - selector, mtype, data, true); - } - sk_X509_pop_free(pkix_validation_chain, X509_free); - return s; - break; - - case LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT: - - s = ldns_dane_match_cert_with_data(cert, - selector, mtype, data); - - if (s == LDNS_STATUS_OK) { - return ldns_dane_pkix_validate(cert, extra_certs, - pkix_validation_store); - } - return s; - break; - - case LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION: -#if 0 - s = ldns_dane_pkix_get_chain(&pkix_validation_chain, - cert, extra_certs); - - if (s == LDNS_STATUS_OK) { - s = ldns_dane_match_any_cert_with_data( - pkix_validation_chain, - selector, mtype, data, false); - - } else if (! pkix_validation_chain) { - return s; - } - sk_X509_pop_free(pkix_validation_chain, X509_free); - return s; -#else - return LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA; -#endif - break; - - case LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE: - return ldns_dane_match_cert_with_data(cert, - selector, mtype, data); - break; - - default: - break; - } -#endif - return LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE; -} - - -ldns_status -ldns_dane_verify(const ldns_rr_list* tlsas, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store) -{ -#if defined(USE_DANE_TA_USAGE) - SSL_CTX *ssl_ctx = NULL; - ldns_rdf *basename_rdf = NULL; - char *basename = NULL; - SSL *ssl = NULL; - X509_STORE_CTX *store_ctx = NULL; -#else - ldns_status ps; -#endif - size_t i; - ldns_rr* tlsa_rr; - ldns_rr_list *usable_tlsas; - ldns_status s = LDNS_STATUS_OK; - - assert(cert != NULL); - - if (! tlsas || ldns_rr_list_rr_count(tlsas) == 0) - /* No TLSA's, so regular PKIX validation - */ - return ldns_dane_pkix_validate(cert, extra_certs, - pkix_validation_store); - -/* To enable name checks (which we don't) */ -#if defined(USE_DANE_TA_USAGE) && 0 - else if (!(basename_rdf = ldns_dname_clone_from( - ldns_rr_list_owner(tlsas), 2))) - /* Could nog get DANE base name */ - s = LDNS_STATUS_ERR; - - else if (!(basename = ldns_rdf2str(basename_rdf))) - s = LDNS_STATUS_MEM_ERR; - - else if (strlen(basename) && (basename[strlen(basename)-1] = 0)) - s = LDNS_STATUS_ERR; /* Intended to be unreachable */ -#endif - - else if (!(usable_tlsas = ldns_dane_filter_unusable_records(tlsas))) - return LDNS_STATUS_MEM_ERR; - - else if (ldns_rr_list_rr_count(usable_tlsas) == 0) { - /* No TLSA's, so regular PKIX validation - */ - ldns_rr_list_free(usable_tlsas); - return ldns_dane_pkix_validate(cert, extra_certs, - pkix_validation_store); - } -#if defined(USE_DANE_TA_USAGE) - /* Rely on OpenSSL dane functions. - * - * OpenSSL does not provide offline dane verification. The dane unit - * tests within openssl use the undocumented SSL_get0_dane() and - * X509_STORE_CTX_set0_dane() to convey dane parameters set on SSL and - * SSL_CTX to a X509_STORE_CTX that can be used to do offline - * verification. We use these undocumented means with the ldns - * dane function prototypes which did only offline dane verification. - */ - if (!(ssl_ctx = SSL_CTX_new(TLS_client_method()))) - s = LDNS_STATUS_MEM_ERR; - - else if (SSL_CTX_dane_enable(ssl_ctx) <= 0) - s = LDNS_STATUS_SSL_ERR; - - else if (SSL_CTX_dane_set_flags( - ssl_ctx, DANE_FLAG_NO_DANE_EE_NAMECHECKS), - !(ssl = SSL_new(ssl_ctx))) - s = LDNS_STATUS_MEM_ERR; - - else if (SSL_set_connect_state(ssl), - (SSL_dane_enable(ssl, basename) <= 0)) - s = LDNS_STATUS_SSL_ERR; - - else for (i = 0; i < ldns_rr_list_rr_count(usable_tlsas); i++) { - ldns_tlsa_certificate_usage usage; - ldns_tlsa_selector selector; - ldns_tlsa_matching_type mtype; - ldns_rdf* data; - - tlsa_rr = ldns_rr_list_rr(usable_tlsas, i); - usage = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,0)); - selector= ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,1)); - mtype = ldns_rdf2native_int8(ldns_rr_rdf(tlsa_rr,2)); - data = ldns_rr_rdf(tlsa_rr,3) ; - - if (SSL_dane_tlsa_add(ssl, usage, selector, mtype, - ldns_rdf_data(data), - ldns_rdf_size(data)) <= 0) { - s = LDNS_STATUS_SSL_ERR; - break; - } - } - if (!s && !(store_ctx = X509_STORE_CTX_new())) - s = LDNS_STATUS_MEM_ERR; - - else if (!X509_STORE_CTX_init(store_ctx, pkix_validation_store, cert, extra_certs)) - s = LDNS_STATUS_SSL_ERR; - - else { - int ret; - - X509_STORE_CTX_set_default(store_ctx, - SSL_is_server(ssl) ? "ssl_client" : "ssl_server"); - X509_VERIFY_PARAM_set1(X509_STORE_CTX_get0_param(store_ctx), - SSL_get0_param(ssl)); - X509_STORE_CTX_set0_dane(store_ctx, SSL_get0_dane(ssl)); - if (SSL_get_verify_callback(ssl)) - X509_STORE_CTX_set_verify_cb(store_ctx, SSL_get_verify_callback(ssl)); - - ret = X509_verify_cert(store_ctx); - if (!ret) { - if (X509_STORE_CTX_get_error(store_ctx) == X509_V_ERR_DANE_NO_MATCH) - s = LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH; - else - s = LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE; - } - X509_STORE_CTX_cleanup(store_ctx); - } - if (store_ctx) - X509_STORE_CTX_free(store_ctx); - if (ssl) - SSL_free(ssl); - if (ssl_ctx) - SSL_CTX_free(ssl_ctx); - if (basename) - free(basename); - ldns_rdf_deep_free(basename_rdf); -#else - for (i = 0; i < ldns_rr_list_rr_count(usable_tlsas); i++) { - tlsa_rr = ldns_rr_list_rr(usable_tlsas, i); - ps = s; - s = ldns_dane_verify_rr(tlsa_rr, cert, extra_certs, - pkix_validation_store); - - if (s != LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH && - s != LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE && - s != LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA) { - - /* which would be LDNS_STATUS_OK (match) - * or some fatal error preventing use from - * trying the next TLSA record. - */ - break; - } - s = (s > ps ? s : ps); /* pref NEED_OPENSSL_GE_1_1_FOR_DANE_TA - * over PKIX_DID_NOT_VALIDATE - * over TLSA_DID_NOT_MATCH - */ - } -#endif - ldns_rr_list_free(usable_tlsas); - return s; -} -#endif /* USE_DANE_VERIFY */ -#endif /* HAVE_SSL */ -#endif /* USE_DANE */ diff --git a/ldns/dname.c b/ldns/dname.c deleted file mode 100644 index 17afe1d..0000000 --- a/ldns/dname.c +++ /dev/null @@ -1,602 +0,0 @@ -/* - * dname.c - * - * dname specific rdata implementations - * A dname is a rdf structure with type LDNS_RDF_TYPE_DNAME - * It is not a /real/ type! All function must therefor check - * for LDNS_RDF_TYPE_DNAME. - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif - -/* Returns whether the last label in the name is a root label (a empty label). - * Note that it is not enough to just test the last character to be 0, - * because it may be part of the last label itself. - */ -static bool -ldns_dname_last_label_is_root_label(const ldns_rdf* dname) -{ - size_t src_pos; - size_t len = 0; - - for (src_pos = 0; src_pos < ldns_rdf_size(dname); src_pos += len + 1) { - len = ldns_rdf_data(dname)[src_pos]; - } - assert(src_pos == ldns_rdf_size(dname)); - - return src_pos > 0 && len == 0; -} - -ldns_rdf * -ldns_dname_cat_clone(const ldns_rdf *rd1, const ldns_rdf *rd2) -{ - ldns_rdf *new; - uint16_t new_size; - uint8_t *buf; - uint16_t left_size; - - if (ldns_rdf_get_type(rd1) != LDNS_RDF_TYPE_DNAME || - ldns_rdf_get_type(rd2) != LDNS_RDF_TYPE_DNAME) { - return NULL; - } - - /* remove root label if it is present at the end of the left - * rd, by reducing the size with 1 - */ - left_size = ldns_rdf_size(rd1); - if (ldns_dname_last_label_is_root_label(rd1)) { - left_size--; - } - - /* we overwrite the nullbyte of rd1 */ - new_size = left_size + ldns_rdf_size(rd2); - buf = LDNS_XMALLOC(uint8_t, new_size); - if (!buf) { - return NULL; - } - - /* put the two dname's after each other */ - memcpy(buf, ldns_rdf_data(rd1), left_size); - memcpy(buf + left_size, ldns_rdf_data(rd2), ldns_rdf_size(rd2)); - - new = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, new_size, buf); - - LDNS_FREE(buf); - return new; -} - -ldns_status -ldns_dname_cat(ldns_rdf *rd1, const ldns_rdf *rd2) -{ - uint16_t left_size; - uint16_t size; - uint8_t* newd; - - if (ldns_rdf_get_type(rd1) != LDNS_RDF_TYPE_DNAME || - ldns_rdf_get_type(rd2) != LDNS_RDF_TYPE_DNAME) { - return LDNS_STATUS_ERR; - } - - /* remove root label if it is present at the end of the left - * rd, by reducing the size with 1 - */ - left_size = ldns_rdf_size(rd1); - if (ldns_dname_last_label_is_root_label(rd1)) { - left_size--; - } - - size = left_size + ldns_rdf_size(rd2); - newd = LDNS_XREALLOC(ldns_rdf_data(rd1), uint8_t, size); - if(!newd) { - return LDNS_STATUS_MEM_ERR; - } - - ldns_rdf_set_data(rd1, newd); - memcpy(ldns_rdf_data(rd1) + left_size, ldns_rdf_data(rd2), - ldns_rdf_size(rd2)); - ldns_rdf_set_size(rd1, size); - - return LDNS_STATUS_OK; -} - -ldns_rdf* -ldns_dname_reverse(const ldns_rdf *dname) -{ - size_t rd_size; - uint8_t* buf; - ldns_rdf* new; - size_t src_pos; - size_t len ; - - assert(ldns_rdf_get_type(dname) == LDNS_RDF_TYPE_DNAME); - - rd_size = ldns_rdf_size(dname); - buf = LDNS_XMALLOC(uint8_t, rd_size); - if (! buf) { - return NULL; - } - new = ldns_rdf_new(LDNS_RDF_TYPE_DNAME, rd_size, buf); - if (! new) { - LDNS_FREE(buf); - return NULL; - } - - /* If dname ends in a root label, the reverse should too. - */ - if (ldns_dname_last_label_is_root_label(dname)) { - buf[rd_size - 1] = 0; - rd_size -= 1; - } - for (src_pos = 0; src_pos < rd_size; src_pos += len + 1) { - len = ldns_rdf_data(dname)[src_pos]; - memcpy(&buf[rd_size - src_pos - len - 1], - &ldns_rdf_data(dname)[src_pos], len + 1); - } - return new; -} - -ldns_rdf * -ldns_dname_clone_from(const ldns_rdf *d, uint16_t n) -{ - uint8_t *data; - uint8_t label_size; - size_t data_size; - - if (!d || - ldns_rdf_get_type(d) != LDNS_RDF_TYPE_DNAME || - ldns_dname_label_count(d) < n) { - return NULL; - } - - data = ldns_rdf_data(d); - data_size = ldns_rdf_size(d); - while (n > 0) { - label_size = data[0] + 1; - data += label_size; - if (data_size < label_size) { - /* this label is very broken */ - return NULL; - } - data_size -= label_size; - n--; - } - - return ldns_dname_new_frm_data(data_size, data); -} - -ldns_rdf * -ldns_dname_left_chop(const ldns_rdf *d) -{ - uint8_t label_pos; - ldns_rdf *chop; - - if (!d) { - return NULL; - } - - if (ldns_rdf_get_type(d) != LDNS_RDF_TYPE_DNAME) { - return NULL; - } - if (ldns_dname_label_count(d) == 0) { - /* root label */ - return NULL; - } - /* 05blaat02nl00 */ - label_pos = ldns_rdf_data(d)[0]; - - chop = ldns_dname_new_frm_data(ldns_rdf_size(d) - label_pos - 1, - ldns_rdf_data(d) + label_pos + 1); - return chop; -} - -uint8_t -ldns_dname_label_count(const ldns_rdf *r) -{ - uint16_t src_pos; - uint16_t len; - uint8_t i; - size_t r_size; - - if (!r) { - return 0; - } - - i = 0; - src_pos = 0; - r_size = ldns_rdf_size(r); - - if (ldns_rdf_get_type(r) != LDNS_RDF_TYPE_DNAME) { - return 0; - } else { - len = ldns_rdf_data(r)[src_pos]; /* start of the label */ - - /* single root label */ - if (1 == r_size) { - return 0; - } else { - while ((len > 0) && src_pos < r_size) { - src_pos++; - src_pos += len; - len = ldns_rdf_data(r)[src_pos]; - i++; - } - } - } - return i; -} - -ldns_rdf * -ldns_dname_new(uint16_t s, void *d) -{ - ldns_rdf *rd; - - if (!s || !d) { - return NULL; - } - rd = LDNS_MALLOC(ldns_rdf); - if (!rd) { - return NULL; - } - ldns_rdf_set_size(rd, s); - ldns_rdf_set_type(rd, LDNS_RDF_TYPE_DNAME); - ldns_rdf_set_data(rd, d); - return rd; -} - -ldns_rdf * -ldns_dname_new_frm_str(const char *str) -{ - return ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, str); -} - -ldns_rdf * -ldns_dname_new_frm_data(uint16_t size, const void *data) -{ - return ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, size, data); -} - -void -ldns_dname2canonical(const ldns_rdf *rd) -{ - uint8_t *rdd; - uint16_t i; - - if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_DNAME) { - return; - } - - rdd = (uint8_t*)ldns_rdf_data(rd); - for (i = 0; i < ldns_rdf_size(rd); i++, rdd++) { - *rdd = (uint8_t)LDNS_DNAME_NORMALIZE((int)*rdd); - } -} - -bool -ldns_dname_is_subdomain(const ldns_rdf *sub, const ldns_rdf *parent) -{ - uint8_t sub_lab; - uint8_t par_lab; - int8_t i, j; - ldns_rdf *tmp_sub = NULL; - ldns_rdf *tmp_par = NULL; - ldns_rdf *sub_clone; - ldns_rdf *parent_clone; - bool result = true; - - if (ldns_rdf_get_type(sub) != LDNS_RDF_TYPE_DNAME || - ldns_rdf_get_type(parent) != LDNS_RDF_TYPE_DNAME || - ldns_rdf_compare(sub, parent) == 0) { - return false; - } - - /* would be nicer if we do not have to clone... */ - sub_clone = ldns_dname_clone_from(sub, 0); - parent_clone = ldns_dname_clone_from(parent, 0); - ldns_dname2canonical(sub_clone); - ldns_dname2canonical(parent_clone); - - sub_lab = ldns_dname_label_count(sub_clone); - par_lab = ldns_dname_label_count(parent_clone); - - /* if sub sits above parent, it cannot be a child/sub domain */ - if (sub_lab < par_lab) { - result = false; - } else { - /* check all labels the from the parent labels, from right to left. - * When they /all/ match we have found a subdomain - */ - j = sub_lab - 1; /* we count from zero, thank you */ - for (i = par_lab -1; i >= 0; i--) { - tmp_sub = ldns_dname_label(sub_clone, j); - tmp_par = ldns_dname_label(parent_clone, i); - if (!tmp_sub || !tmp_par) { - /* deep free does null check */ - ldns_rdf_deep_free(tmp_sub); - ldns_rdf_deep_free(tmp_par); - result = false; - break; - } - - if (ldns_rdf_compare(tmp_sub, tmp_par) != 0) { - /* they are not equal */ - ldns_rdf_deep_free(tmp_sub); - ldns_rdf_deep_free(tmp_par); - result = false; - break; - } - ldns_rdf_deep_free(tmp_sub); - ldns_rdf_deep_free(tmp_par); - j--; - } - } - ldns_rdf_deep_free(sub_clone); - ldns_rdf_deep_free(parent_clone); - return result; -} - -int -ldns_dname_compare(const ldns_rdf *dname1, const ldns_rdf *dname2) -{ - size_t lc1, lc2, lc1f, lc2f; - size_t i; - int result = 0; - uint8_t *lp1, *lp2; - - /* see RFC4034 for this algorithm */ - /* this algorithm assumes the names are normalized to case */ - - /* only when both are not NULL we can say anything about them */ - if (!dname1 && !dname2) { - return 0; - } - if (!dname1 || !dname2) { - return -1; - } - /* asserts must happen later as we are looking in the - * dname, which could be NULL. But this case is handled - * above - */ - assert(ldns_rdf_get_type(dname1) == LDNS_RDF_TYPE_DNAME); - assert(ldns_rdf_get_type(dname2) == LDNS_RDF_TYPE_DNAME); - - lc1 = ldns_dname_label_count(dname1); - lc2 = ldns_dname_label_count(dname2); - - if (lc1 == 0 && lc2 == 0) { - return 0; - } - if (lc1 == 0) { - return -1; - } - if (lc2 == 0) { - return 1; - } - lc1--; - lc2--; - /* we start at the last label */ - while (true) { - /* find the label first */ - lc1f = lc1; - lp1 = ldns_rdf_data(dname1); - while (lc1f > 0) { - lp1 += *lp1 + 1; - lc1f--; - } - - /* and find the other one */ - lc2f = lc2; - lp2 = ldns_rdf_data(dname2); - while (lc2f > 0) { - lp2 += *lp2 + 1; - lc2f--; - } - - /* now check the label character for character. */ - for (i = 1; i < (size_t)(*lp1 + 1); i++) { - if (i > *lp2) { - /* apparently label 1 is larger */ - result = 1; - goto done; - } - if (LDNS_DNAME_NORMALIZE((int) *(lp1 + i)) < - LDNS_DNAME_NORMALIZE((int) *(lp2 + i))) { - result = -1; - goto done; - } else if (LDNS_DNAME_NORMALIZE((int) *(lp1 + i)) > - LDNS_DNAME_NORMALIZE((int) *(lp2 + i))) { - result = 1; - goto done; - } - } - if (*lp1 < *lp2) { - /* apparently label 2 is larger */ - result = -1; - goto done; - } - if (lc1 == 0 && lc2 > 0) { - result = -1; - goto done; - } else if (lc1 > 0 && lc2 == 0) { - result = 1; - goto done; - } else if (lc1 == 0 && lc2 == 0) { - result = 0; - goto done; - } - lc1--; - lc2--; - } - - done: - return result; -} - -int -ldns_dname_is_wildcard(const ldns_rdf* dname) -{ - return ( ldns_dname_label_count(dname) > 0 && - ldns_rdf_data(dname)[0] == 1 && - ldns_rdf_data(dname)[1] == '*'); -} - -int -ldns_dname_match_wildcard(const ldns_rdf *dname, const ldns_rdf *wildcard) -{ - ldns_rdf *wc_chopped; - int result; - /* check whether it really is a wildcard */ - if (ldns_dname_is_wildcard(wildcard)) { - /* ok, so the dname needs to be a subdomain of the wildcard - * without the * - */ - wc_chopped = ldns_dname_left_chop(wildcard); - result = (int) ldns_dname_is_subdomain(dname, wc_chopped); - ldns_rdf_deep_free(wc_chopped); - } else { - result = (ldns_dname_compare(dname, wildcard) == 0); - } - return result; -} - -/* nsec test: does prev <= middle < next - * -1 = yes - * 0 = error/can't tell - * 1 = no - */ -int -ldns_dname_interval(const ldns_rdf *prev, const ldns_rdf *middle, - const ldns_rdf *next) -{ - int prev_check, next_check; - - assert(ldns_rdf_get_type(prev) == LDNS_RDF_TYPE_DNAME); - assert(ldns_rdf_get_type(middle) == LDNS_RDF_TYPE_DNAME); - assert(ldns_rdf_get_type(next) == LDNS_RDF_TYPE_DNAME); - - prev_check = ldns_dname_compare(prev, middle); - next_check = ldns_dname_compare(middle, next); - /* <= next. This cannot be the case for nsec, because then we would - * have gotten the nsec of next... - */ - if (next_check == 0) { - return 0; - } - - /* <= */ - if ((prev_check == -1 || prev_check == 0) && - /* < */ - next_check == -1) { - return -1; - } else { - return 1; - } -} - - -bool -ldns_dname_str_absolute(const char *dname_str) -{ - const char* s; - if(dname_str && strcmp(dname_str, ".") == 0) - return 1; - if(!dname_str || strlen(dname_str) < 2) - return 0; - if(dname_str[strlen(dname_str) - 1] != '.') - return 0; - if(dname_str[strlen(dname_str) - 2] != '\\') - return 1; /* ends in . and no \ before it */ - /* so we have the case of ends in . and there is \ before it */ - for(s=dname_str; *s; s++) { - if(*s == '\\') { - if(s[1] && s[2] && s[3] /* check length */ - && isdigit((unsigned char)s[1]) - && isdigit((unsigned char)s[2]) - && isdigit((unsigned char)s[3])) - s += 3; - else if(!s[1] || isdigit((unsigned char)s[1])) /* escape of nul,0-9 */ - return 0; /* parse error */ - else s++; /* another character escaped */ - } - else if(!*(s+1) && *s == '.') - return 1; /* trailing dot, unescaped */ - } - return 0; -} - -bool -ldns_dname_absolute(const ldns_rdf *rdf) -{ - char *str = ldns_rdf2str(rdf); - if (str) { - bool r = ldns_dname_str_absolute(str); - LDNS_FREE(str); - return r; - } - return false; -} - -ldns_rdf * -ldns_dname_label(const ldns_rdf *rdf, uint8_t labelpos) -{ - uint8_t labelcnt; - uint16_t src_pos; - uint16_t len; - ldns_rdf *tmpnew; - size_t s; - uint8_t *data; - - if (ldns_rdf_get_type(rdf) != LDNS_RDF_TYPE_DNAME) { - return NULL; - } - - labelcnt = 0; - src_pos = 0; - s = ldns_rdf_size(rdf); - - len = ldns_rdf_data(rdf)[src_pos]; /* label start */ - while ((len > 0) && src_pos < s) { - if (labelcnt == labelpos) { - /* found our label */ - data = LDNS_XMALLOC(uint8_t, len + 2); - if (!data) { - return NULL; - } - memcpy(data, ldns_rdf_data(rdf) + src_pos, len + 1); - data[len + 2 - 1] = 0; - - tmpnew = ldns_rdf_new( LDNS_RDF_TYPE_DNAME - , len + 2, data); - if (!tmpnew) { - LDNS_FREE(data); - return NULL; - } - return tmpnew; - } - src_pos++; - src_pos += len; - len = ldns_rdf_data(rdf)[src_pos]; - labelcnt++; - } - return NULL; -} diff --git a/ldns/dnssec.c b/ldns/dnssec.c deleted file mode 100644 index 52c35ee..0000000 --- a/ldns/dnssec.c +++ /dev/null @@ -1,1953 +0,0 @@ -/* - * dnssec.c - * - * contains the cryptographic function needed for DNSSEC in ldns - * The crypto library used is openssl - * - * (c) NLnet Labs, 2004-2008 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> -#include <ldns/dnssec.h> - -#include <strings.h> -#include <time.h> - -#ifdef HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/err.h> -#include <openssl/md5.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> -#ifdef USE_DSA -#include <openssl/dsa.h> -#endif -#endif - -ldns_rr * -ldns_dnssec_get_rrsig_for_name_and_type(const ldns_rdf *name, - const ldns_rr_type type, - const ldns_rr_list *rrs) -{ - size_t i; - ldns_rr *candidate; - - if (!name || !rrs) { - return NULL; - } - - for (i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - candidate = ldns_rr_list_rr(rrs, i); - if (ldns_rr_get_type(candidate) == LDNS_RR_TYPE_RRSIG) { - if (ldns_dname_compare(ldns_rr_owner(candidate), - name) == 0 && - ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(candidate)) - == type - ) { - return candidate; - } - } - } - - return NULL; -} - -ldns_rr * -ldns_dnssec_get_dnskey_for_rrsig(const ldns_rr *rrsig, - const ldns_rr_list *rrs) -{ - size_t i; - ldns_rr *candidate; - - if (!rrsig || !rrs) { - return NULL; - } - - for (i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - candidate = ldns_rr_list_rr(rrs, i); - if (ldns_rr_get_type(candidate) == LDNS_RR_TYPE_DNSKEY) { - if (ldns_dname_compare(ldns_rr_owner(candidate), - ldns_rr_rrsig_signame(rrsig)) == 0 && - ldns_rdf2native_int16(ldns_rr_rrsig_keytag(rrsig)) == - ldns_calc_keytag(candidate) - ) { - return candidate; - } - } - } - - return NULL; -} - -ldns_rdf * -ldns_nsec_get_bitmap(const ldns_rr *nsec) { - if (ldns_rr_get_type(nsec) == LDNS_RR_TYPE_NSEC) { - return ldns_rr_rdf(nsec, 1); - } else if (ldns_rr_get_type(nsec) == LDNS_RR_TYPE_NSEC3) { - return ldns_rr_rdf(nsec, 5); - } else { - return NULL; - } -} - -/*return the owner name of the closest encloser for name from the list of rrs */ -/* this is NOT the hash, but the original name! */ -ldns_rdf * -ldns_dnssec_nsec3_closest_encloser(const ldns_rdf *qname, - ATTR_UNUSED(ldns_rr_type qtype), - const ldns_rr_list *nsec3s) -{ - /* remember parameters, they must match */ - uint8_t algorithm; - uint32_t iterations; - uint8_t salt_length; - uint8_t *salt; - - ldns_rdf *sname, *hashed_sname, *tmp; - bool flag; - - bool exact_match_found; - bool in_range_found; - - ldns_status status; - ldns_rdf *zone_name; - - size_t nsec_i; - ldns_rr *nsec; - ldns_rdf *result = NULL; - - if (!qname || !nsec3s || ldns_rr_list_rr_count(nsec3s) < 1) { - return NULL; - } - - nsec = ldns_rr_list_rr(nsec3s, 0); - algorithm = ldns_nsec3_algorithm(nsec); - salt_length = ldns_nsec3_salt_length(nsec); - salt = ldns_nsec3_salt_data(nsec); - iterations = ldns_nsec3_iterations(nsec); - - sname = ldns_rdf_clone(qname); - - flag = false; - - zone_name = ldns_dname_left_chop(ldns_rr_owner(nsec)); - - /* algorithm from nsec3-07 8.3 */ - while (ldns_dname_label_count(sname) > 0) { - exact_match_found = false; - in_range_found = false; - - hashed_sname = ldns_nsec3_hash_name(sname, - algorithm, - iterations, - salt_length, - salt); - - status = ldns_dname_cat(hashed_sname, zone_name); - if(status != LDNS_STATUS_OK) { - LDNS_FREE(salt); - ldns_rdf_deep_free(zone_name); - ldns_rdf_deep_free(sname); - ldns_rdf_deep_free(hashed_sname); - return NULL; - } - - for (nsec_i = 0; nsec_i < ldns_rr_list_rr_count(nsec3s); nsec_i++) { - nsec = ldns_rr_list_rr(nsec3s, nsec_i); - - /* check values of iterations etc! */ - - /* exact match? */ - if (ldns_dname_compare(ldns_rr_owner(nsec), hashed_sname) == 0) { - exact_match_found = true; - } else if (ldns_nsec_covers_name(nsec, hashed_sname)) { - in_range_found = true; - } - - } - if (!exact_match_found && in_range_found) { - flag = true; - } else if (exact_match_found && flag) { - result = ldns_rdf_clone(sname); - /* RFC 5155: 8.3. 2.** "The proof is complete" */ - ldns_rdf_deep_free(hashed_sname); - goto done; - } else if (exact_match_found && !flag) { - /* error! */ - ldns_rdf_deep_free(hashed_sname); - goto done; - } else { - flag = false; - } - - ldns_rdf_deep_free(hashed_sname); - tmp = sname; - sname = ldns_dname_left_chop(sname); - ldns_rdf_deep_free(tmp); - } - - done: - LDNS_FREE(salt); - ldns_rdf_deep_free(zone_name); - ldns_rdf_deep_free(sname); - - return result; -} - -bool -ldns_dnssec_pkt_has_rrsigs(const ldns_pkt *pkt) -{ - size_t i; - for (i = 0; i < ldns_pkt_ancount(pkt); i++) { - if (ldns_rr_get_type(ldns_rr_list_rr(ldns_pkt_answer(pkt), i)) == - LDNS_RR_TYPE_RRSIG) { - return true; - } - } - for (i = 0; i < ldns_pkt_nscount(pkt); i++) { - if (ldns_rr_get_type(ldns_rr_list_rr(ldns_pkt_authority(pkt), i)) == - LDNS_RR_TYPE_RRSIG) { - return true; - } - } - return false; -} - -ldns_rr_list * -ldns_dnssec_pkt_get_rrsigs_for_name_and_type(const ldns_pkt *pkt, - const ldns_rdf *name, - ldns_rr_type type) -{ - uint16_t t_netorder; - ldns_rr_list *sigs; - ldns_rr_list *sigs_covered; - ldns_rdf *rdf_t; - - sigs = ldns_pkt_rr_list_by_name_and_type(pkt, - name, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANY_NOQUESTION - ); - - t_netorder = htons(type); /* rdf are in network order! */ - rdf_t = ldns_rdf_new(LDNS_RDF_TYPE_TYPE, LDNS_RDF_SIZE_WORD, &t_netorder); - sigs_covered = ldns_rr_list_subtype_by_rdf(sigs, rdf_t, 0); - - ldns_rdf_free(rdf_t); - ldns_rr_list_deep_free(sigs); - - return sigs_covered; - -} - -ldns_rr_list * -ldns_dnssec_pkt_get_rrsigs_for_type(const ldns_pkt *pkt, ldns_rr_type type) -{ - uint16_t t_netorder; - ldns_rr_list *sigs; - ldns_rr_list *sigs_covered; - ldns_rdf *rdf_t; - - sigs = ldns_pkt_rr_list_by_type(pkt, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANY_NOQUESTION - ); - - t_netorder = htons(type); /* rdf are in network order! */ - rdf_t = ldns_rdf_new(LDNS_RDF_TYPE_TYPE, - 2, - &t_netorder); - sigs_covered = ldns_rr_list_subtype_by_rdf(sigs, rdf_t, 0); - - ldns_rdf_free(rdf_t); - ldns_rr_list_deep_free(sigs); - - return sigs_covered; - -} - -/* used only on the public key RR */ -uint16_t -ldns_calc_keytag(const ldns_rr *key) -{ - uint16_t ac16; - ldns_buffer *keybuf; - size_t keysize; - - if (!key) { - return 0; - } - - if (ldns_rr_get_type(key) != LDNS_RR_TYPE_DNSKEY && - ldns_rr_get_type(key) != LDNS_RR_TYPE_KEY - ) { - return 0; - } - - /* rdata to buf - only put the rdata in a buffer */ - keybuf = ldns_buffer_new(LDNS_MIN_BUFLEN); /* grows */ - if (!keybuf) { - return 0; - } - (void)ldns_rr_rdata2buffer_wire(keybuf, key); - /* the current pos in the buffer is the keysize */ - keysize= ldns_buffer_position(keybuf); - - ac16 = ldns_calc_keytag_raw(ldns_buffer_begin(keybuf), keysize); - ldns_buffer_free(keybuf); - return ac16; -} - -uint16_t ldns_calc_keytag_raw(const uint8_t* key, size_t keysize) -{ - unsigned int i; - uint32_t ac32; - uint16_t ac16; - - if(keysize < 4) { - return 0; - } - /* look at the algorithm field, copied from 2535bis */ - if (key[3] == LDNS_RSAMD5) { - ac16 = 0; - if (keysize > 4) { - memmove(&ac16, key + keysize - 3, 2); - } - ac16 = ntohs(ac16); - return (uint16_t) ac16; - } else { - ac32 = 0; - for (i = 0; (size_t)i < keysize; ++i) { - ac32 += (i & 1) ? key[i] : key[i] << 8; - } - ac32 += (ac32 >> 16) & 0xFFFF; - return (uint16_t) (ac32 & 0xFFFF); - } -} - -#ifdef HAVE_SSL -DSA * -ldns_key_buf2dsa(const ldns_buffer *key) -{ - return ldns_key_buf2dsa_raw((const unsigned char*)ldns_buffer_begin(key), - ldns_buffer_position(key)); -} - -DSA * -ldns_key_buf2dsa_raw(const unsigned char* key, size_t len) -{ - uint8_t T; - uint16_t length; - uint16_t offset; - DSA *dsa; - BIGNUM *Q; BIGNUM *P; - BIGNUM *G; BIGNUM *Y; - - if(len == 0) - return NULL; - T = (uint8_t)key[0]; - length = (64 + T * 8); - offset = 1; - - if (T > 8) { - return NULL; - } - if(len < (size_t)1 + SHA_DIGEST_LENGTH + 3*length) - return NULL; - - Q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL); - offset += SHA_DIGEST_LENGTH; - - P = BN_bin2bn(key+offset, (int)length, NULL); - offset += length; - - G = BN_bin2bn(key+offset, (int)length, NULL); - offset += length; - - Y = BN_bin2bn(key+offset, (int)length, NULL); - - /* create the key and set its properties */ - if(!Q || !P || !G || !Y || !(dsa = DSA_new())) { - BN_free(Q); - BN_free(P); - BN_free(G); - BN_free(Y); - return NULL; - } -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -#ifndef S_SPLINT_S - dsa->p = P; - dsa->q = Q; - dsa->g = G; - dsa->pub_key = Y; -#endif /* splint */ -#else /* OPENSSL_VERSION_NUMBER */ - if (!DSA_set0_pqg(dsa, P, Q, G)) { - /* QPG not yet attached, need to free */ - BN_free(Q); - BN_free(P); - BN_free(G); - - DSA_free(dsa); - BN_free(Y); - return NULL; - } - if (!DSA_set0_key(dsa, Y, NULL)) { - /* QPG attached, cleaned up by DSA_fre() */ - DSA_free(dsa); - BN_free(Y); - return NULL; - } -#endif /* OPENSSL_VERSION_NUMBER */ - return dsa; -} - -RSA * -ldns_key_buf2rsa(const ldns_buffer *key) -{ - return ldns_key_buf2rsa_raw((const unsigned char*)ldns_buffer_begin(key), - ldns_buffer_position(key)); -} - -RSA * -ldns_key_buf2rsa_raw(const unsigned char* key, size_t len) -{ - uint16_t offset; - uint16_t exp; - uint16_t int16; - RSA *rsa; - BIGNUM *modulus; - BIGNUM *exponent; - - if (len == 0) - return NULL; - if (key[0] == 0) { - if(len < 3) - return NULL; - /* need some smart comment here XXX*/ - /* the exponent is too large so it's places - * futher...???? */ - memmove(&int16, key+1, 2); - exp = ntohs(int16); - offset = 3; - } else { - exp = key[0]; - offset = 1; - } - - /* key length at least one */ - if(len < (size_t)offset + exp + 1) - return NULL; - - /* Exponent */ - exponent = BN_new(); - if(!exponent) return NULL; - (void) BN_bin2bn(key+offset, (int)exp, exponent); - offset += exp; - - /* Modulus */ - modulus = BN_new(); - if(!modulus) { - BN_free(exponent); - return NULL; - } - /* length of the buffer must match the key length! */ - (void) BN_bin2bn(key+offset, (int)(len - offset), modulus); - - rsa = RSA_new(); - if(!rsa) { - BN_free(exponent); - BN_free(modulus); - return NULL; - } -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -#ifndef S_SPLINT_S - rsa->n = modulus; - rsa->e = exponent; -#endif /* splint */ -#else /* OPENSSL_VERSION_NUMBER */ - if (!RSA_set0_key(rsa, modulus, exponent, NULL)) { - BN_free(exponent); - BN_free(modulus); - RSA_free(rsa); - return NULL; - } -#endif /* OPENSSL_VERSION_NUMBER */ - - return rsa; -} - -int -ldns_digest_evp(const unsigned char* data, unsigned int len, unsigned char* dest, - const EVP_MD* md) -{ - EVP_MD_CTX* ctx; - ctx = EVP_MD_CTX_create(); - if(!ctx) - return false; - if(!EVP_DigestInit_ex(ctx, md, NULL) || - !EVP_DigestUpdate(ctx, data, len) || - !EVP_DigestFinal_ex(ctx, dest, NULL)) { - EVP_MD_CTX_destroy(ctx); - return false; - } - EVP_MD_CTX_destroy(ctx); - return true; -} -#endif /* HAVE_SSL */ - -ldns_rr * -ldns_key_rr2ds(const ldns_rr *key, ldns_hash h) -{ - ldns_rdf *tmp; - ldns_rr *ds; - uint16_t keytag; - uint8_t sha1hash; - uint8_t *digest; - ldns_buffer *data_buf; -#ifdef USE_GOST - const EVP_MD* md = NULL; -#endif - - if (ldns_rr_get_type(key) != LDNS_RR_TYPE_DNSKEY) { - return NULL; - } - - ds = ldns_rr_new(); - if (!ds) { - return NULL; - } - ldns_rr_set_type(ds, LDNS_RR_TYPE_DS); - ldns_rr_set_owner(ds, ldns_rdf_clone( - ldns_rr_owner(key))); - ldns_rr_set_ttl(ds, ldns_rr_ttl(key)); - ldns_rr_set_class(ds, ldns_rr_get_class(key)); - - switch(h) { - default: - case LDNS_SHA1: - digest = LDNS_XMALLOC(uint8_t, LDNS_SHA1_DIGEST_LENGTH); - if (!digest) { - ldns_rr_free(ds); - return NULL; - } - break; - case LDNS_SHA256: - digest = LDNS_XMALLOC(uint8_t, LDNS_SHA256_DIGEST_LENGTH); - if (!digest) { - ldns_rr_free(ds); - return NULL; - } - break; - case LDNS_HASH_GOST: -#ifdef USE_GOST - (void)ldns_key_EVP_load_gost_id(); - md = EVP_get_digestbyname("md_gost94"); - if(!md) { - ldns_rr_free(ds); - return NULL; - } - digest = LDNS_XMALLOC(uint8_t, EVP_MD_size(md)); - if (!digest) { - ldns_rr_free(ds); - return NULL; - } - break; -#else - /* not implemented */ - ldns_rr_free(ds); - return NULL; -#endif - case LDNS_SHA384: -#ifdef USE_ECDSA - digest = LDNS_XMALLOC(uint8_t, SHA384_DIGEST_LENGTH); - if (!digest) { - ldns_rr_free(ds); - return NULL; - } - break; -#else - /* not implemented */ - ldns_rr_free(ds); - return NULL; -#endif - } - - data_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!data_buf) { - LDNS_FREE(digest); - ldns_rr_free(ds); - return NULL; - } - - /* keytag */ - keytag = htons(ldns_calc_keytag((ldns_rr*)key)); - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_INT16, - sizeof(uint16_t), - &keytag); - ldns_rr_push_rdf(ds, tmp); - - /* copy the algorithm field */ - if ((tmp = ldns_rr_rdf(key, 2)) == NULL) { - LDNS_FREE(digest); - ldns_buffer_free(data_buf); - ldns_rr_free(ds); - return NULL; - } else { - ldns_rr_push_rdf(ds, ldns_rdf_clone( tmp )); - } - - /* digest hash type */ - sha1hash = (uint8_t)h; - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_INT8, - sizeof(uint8_t), - &sha1hash); - ldns_rr_push_rdf(ds, tmp); - - /* digest */ - /* owner name */ - tmp = ldns_rdf_clone(ldns_rr_owner(key)); - ldns_dname2canonical(tmp); - if (ldns_rdf2buffer_wire(data_buf, tmp) != LDNS_STATUS_OK) { - LDNS_FREE(digest); - ldns_buffer_free(data_buf); - ldns_rr_free(ds); - ldns_rdf_deep_free(tmp); - return NULL; - } - ldns_rdf_deep_free(tmp); - - /* all the rdata's */ - if (ldns_rr_rdata2buffer_wire(data_buf, - (ldns_rr*)key) != LDNS_STATUS_OK) { - LDNS_FREE(digest); - ldns_buffer_free(data_buf); - ldns_rr_free(ds); - return NULL; - } - switch(h) { - case LDNS_SHA1: - (void) ldns_sha1((unsigned char *) ldns_buffer_begin(data_buf), - (unsigned int) ldns_buffer_position(data_buf), - (unsigned char *) digest); - - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, - LDNS_SHA1_DIGEST_LENGTH, - digest); - ldns_rr_push_rdf(ds, tmp); - - break; - case LDNS_SHA256: - (void) ldns_sha256((unsigned char *) ldns_buffer_begin(data_buf), - (unsigned int) ldns_buffer_position(data_buf), - (unsigned char *) digest); - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, - LDNS_SHA256_DIGEST_LENGTH, - digest); - ldns_rr_push_rdf(ds, tmp); - break; - case LDNS_HASH_GOST: -#ifdef USE_GOST - if(!ldns_digest_evp((unsigned char *) ldns_buffer_begin(data_buf), - (unsigned int) ldns_buffer_position(data_buf), - (unsigned char *) digest, md)) { - LDNS_FREE(digest); - ldns_buffer_free(data_buf); - ldns_rr_free(ds); - return NULL; - } - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, - (size_t)EVP_MD_size(md), - digest); - ldns_rr_push_rdf(ds, tmp); -#endif - break; - case LDNS_SHA384: -#ifdef USE_ECDSA - (void) SHA384((unsigned char *) ldns_buffer_begin(data_buf), - (unsigned int) ldns_buffer_position(data_buf), - (unsigned char *) digest); - tmp = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, - SHA384_DIGEST_LENGTH, - digest); - ldns_rr_push_rdf(ds, tmp); -#endif - break; - } - - LDNS_FREE(digest); - ldns_buffer_free(data_buf); - return ds; -} - -/* From RFC3845: - * - * 2.1.2. The List of Type Bit Map(s) Field - * - * The RR type space is split into 256 window blocks, each representing - * the low-order 8 bits of the 16-bit RR type space. Each block that - * has at least one active RR type is encoded using a single octet - * window number (from 0 to 255), a single octet bitmap length (from 1 - * to 32) indicating the number of octets used for the window block's - * bitmap, and up to 32 octets (256 bits) of bitmap. - * - * Window blocks are present in the NSEC RR RDATA in increasing - * numerical order. - * - * "|" denotes concatenation - * - * Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) + - * - * <cut> - * - * Blocks with no types present MUST NOT be included. Trailing zero - * octets in the bitmap MUST be omitted. The length of each block's - * bitmap is determined by the type code with the largest numerical - * value within that block, among the set of RR types present at the - * NSEC RR's owner name. Trailing zero octets not specified MUST be - * interpreted as zero octets. - */ -ldns_rdf * -ldns_dnssec_create_nsec_bitmap(ldns_rr_type rr_type_list[], - size_t size, - ldns_rr_type nsec_type) -{ - uint8_t window; /* most significant octet of type */ - uint8_t subtype; /* least significant octet of type */ - int windows[256]; /* Max subtype per window */ - uint8_t windowpresent[256]; /* bool if window appears in bitmap */ - ldns_rr_type* d; /* used to traverse rr_type_list*/ - size_t i; /* used to traverse windows array */ - - size_t sz; /* size needed for type bitmap rdf */ - uint8_t* data = NULL; /* rdf data */ - uint8_t* dptr; /* used to itraverse rdf data */ - ldns_rdf* rdf; /* bitmap rdf to return */ - - if (nsec_type != LDNS_RR_TYPE_NSEC && - nsec_type != LDNS_RR_TYPE_NSEC3) { - return NULL; - } - memset(windows, 0, sizeof(int)*256); - memset(windowpresent, 0, 256); - - /* Which other windows need to be in the bitmap rdf? - */ - for (d = rr_type_list; d < rr_type_list + size; d++) { - window = *d >> 8; - subtype = *d & 0xff; - windowpresent[window] = 1; - if (windows[window] < (int)subtype) { - windows[window] = (int)subtype; - } - } - - /* How much space do we need in the rdf for those windows? - */ - sz = 0; - for (i = 0; i < 256; i++) { - if (windowpresent[i]) { - sz += windows[i] / 8 + 3; - } - } - if (sz > 0) { - /* Format rdf data according RFC3845 Section 2.1.2 (see above) - */ - dptr = data = LDNS_CALLOC(uint8_t, sz); - if (!data) { - return NULL; - } - for (i = 0; i < 256; i++) { - if (windowpresent[i]) { - *dptr++ = (uint8_t)i; - *dptr++ = (uint8_t)(windows[i] / 8 + 1); - - /* Now let windows[i] index the bitmap - * within data - */ - windows[i] = (int)(dptr - data); - - dptr += dptr[-1]; - } - } - } - - /* Set the bits? - */ - for (d = rr_type_list; d < rr_type_list + size; d++) { - subtype = *d & 0xff; - data[windows[*d >> 8] + subtype/8] |= (0x80 >> (subtype % 8)); - } - - /* Allocate and return rdf structure for the data - */ - rdf = ldns_rdf_new(LDNS_RDF_TYPE_BITMAP, sz, data); - if (!rdf) { - LDNS_FREE(data); - return NULL; - } - return rdf; -} - -int -ldns_dnssec_rrsets_contains_type(const ldns_dnssec_rrsets *rrsets, - ldns_rr_type type) -{ - const ldns_dnssec_rrsets *cur_rrset = rrsets; - while (cur_rrset) { - if (cur_rrset->type == type) { - return 1; - } - cur_rrset = cur_rrset->next; - } - return 0; -} - -ldns_rr * -ldns_dnssec_create_nsec(const ldns_dnssec_name *from, - const ldns_dnssec_name *to, - ldns_rr_type nsec_type) -{ - ldns_rr *nsec_rr; - ldns_rr_type types[65536]; - size_t type_count = 0; - ldns_dnssec_rrsets *cur_rrsets; - int on_delegation_point; - - if (!from || !to || (nsec_type != LDNS_RR_TYPE_NSEC)) { - return NULL; - } - - nsec_rr = ldns_rr_new(); - ldns_rr_set_type(nsec_rr, nsec_type); - ldns_rr_set_owner(nsec_rr, ldns_rdf_clone(ldns_dnssec_name_name(from))); - ldns_rr_push_rdf(nsec_rr, ldns_rdf_clone(ldns_dnssec_name_name(to))); - - on_delegation_point = ldns_dnssec_rrsets_contains_type( - from->rrsets, LDNS_RR_TYPE_NS) - && !ldns_dnssec_rrsets_contains_type( - from->rrsets, LDNS_RR_TYPE_SOA); - - cur_rrsets = from->rrsets; - while (cur_rrsets) { - /* Do not include non-authoritative rrsets on the delegation point - * in the type bitmap */ - if ((on_delegation_point && ( - cur_rrsets->type == LDNS_RR_TYPE_NS - || cur_rrsets->type == LDNS_RR_TYPE_DS)) - || (!on_delegation_point && - cur_rrsets->type != LDNS_RR_TYPE_RRSIG - && cur_rrsets->type != LDNS_RR_TYPE_NSEC)) { - - types[type_count] = cur_rrsets->type; - type_count++; - } - cur_rrsets = cur_rrsets->next; - - } - types[type_count] = LDNS_RR_TYPE_RRSIG; - type_count++; - types[type_count] = LDNS_RR_TYPE_NSEC; - type_count++; - - ldns_rr_push_rdf(nsec_rr, ldns_dnssec_create_nsec_bitmap(types, - type_count, - nsec_type)); - - return nsec_rr; -} - -ldns_rr * -ldns_dnssec_create_nsec3(const ldns_dnssec_name *from, - const ldns_dnssec_name *to, - const ldns_rdf *zone_name, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt) -{ - ldns_rr *nsec_rr; - ldns_rr_type types[65536]; - size_t type_count = 0; - ldns_dnssec_rrsets *cur_rrsets; - ldns_status status; - int on_delegation_point; - - if (!from) { - return NULL; - } - - nsec_rr = ldns_rr_new_frm_type(LDNS_RR_TYPE_NSEC3); - ldns_rr_set_owner(nsec_rr, - ldns_nsec3_hash_name(ldns_dnssec_name_name(from), - algorithm, - iterations, - salt_length, - salt)); - status = ldns_dname_cat(ldns_rr_owner(nsec_rr), zone_name); - if(status != LDNS_STATUS_OK) { - ldns_rr_free(nsec_rr); - return NULL; - } - ldns_nsec3_add_param_rdfs(nsec_rr, - algorithm, - flags, - iterations, - salt_length, - salt); - - on_delegation_point = ldns_dnssec_rrsets_contains_type( - from->rrsets, LDNS_RR_TYPE_NS) - && !ldns_dnssec_rrsets_contains_type( - from->rrsets, LDNS_RR_TYPE_SOA); - cur_rrsets = from->rrsets; - while (cur_rrsets) { - /* Do not include non-authoritative rrsets on the delegation point - * in the type bitmap. Potentionally not skipping insecure - * delegation should have been done earlier, in function - * ldns_dnssec_zone_create_nsec3s, or even earlier in: - * ldns_dnssec_zone_sign_nsec3_flg . - */ - if ((on_delegation_point && ( - cur_rrsets->type == LDNS_RR_TYPE_NS - || cur_rrsets->type == LDNS_RR_TYPE_DS)) - || (!on_delegation_point && - cur_rrsets->type != LDNS_RR_TYPE_RRSIG)) { - - types[type_count] = cur_rrsets->type; - type_count++; - } - cur_rrsets = cur_rrsets->next; - } - /* always add rrsig type if this is not an unsigned - * delegation - */ - if (type_count > 0 && - !(type_count == 1 && types[0] == LDNS_RR_TYPE_NS)) { - types[type_count] = LDNS_RR_TYPE_RRSIG; - type_count++; - } - - /* leave next rdata empty if they weren't precomputed yet */ - if (to && to->hashed_name) { - (void) ldns_rr_set_rdf(nsec_rr, - ldns_rdf_clone(to->hashed_name), - 4); - } else { - (void) ldns_rr_set_rdf(nsec_rr, NULL, 4); - } - - ldns_rr_push_rdf(nsec_rr, - ldns_dnssec_create_nsec_bitmap(types, - type_count, - LDNS_RR_TYPE_NSEC3)); - - return nsec_rr; -} - -ldns_rr * -ldns_create_nsec(ldns_rdf *cur_owner, ldns_rdf *next_owner, ldns_rr_list *rrs) -{ - /* we do not do any check here - garbage in, garbage out */ - - /* the the start and end names - get the type from the - * before rrlist */ - - /* inefficient, just give it a name, a next name, and a list of rrs */ - /* we make 1 big uberbitmap first, then windows */ - /* todo: make something more efficient :) */ - uint16_t i; - ldns_rr *i_rr; - uint16_t i_type; - - ldns_rr *nsec = NULL; - ldns_rr_type i_type_list[65536]; - size_t type_count = 0; - - nsec = ldns_rr_new(); - ldns_rr_set_type(nsec, LDNS_RR_TYPE_NSEC); - ldns_rr_set_owner(nsec, ldns_rdf_clone(cur_owner)); - ldns_rr_push_rdf(nsec, ldns_rdf_clone(next_owner)); - - for (i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - i_rr = ldns_rr_list_rr(rrs, i); - if (ldns_rdf_compare(cur_owner, - ldns_rr_owner(i_rr)) == 0) { - i_type = ldns_rr_get_type(i_rr); - if (i_type != LDNS_RR_TYPE_RRSIG && i_type != LDNS_RR_TYPE_NSEC) { - if (type_count == 0 || i_type_list[type_count-1] != i_type) { - i_type_list[type_count] = i_type; - type_count++; - } - } - } - } - - i_type_list[type_count] = LDNS_RR_TYPE_RRSIG; - type_count++; - i_type_list[type_count] = LDNS_RR_TYPE_NSEC; - type_count++; - - ldns_rr_push_rdf(nsec, - ldns_dnssec_create_nsec_bitmap(i_type_list, - type_count, LDNS_RR_TYPE_NSEC)); - - return nsec; -} - -ldns_rdf * -ldns_nsec3_hash_name(const ldns_rdf *name, - uint8_t algorithm, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt) -{ - size_t hashed_owner_str_len; - ldns_rdf *cann; - ldns_rdf *hashed_owner; - unsigned char *hashed_owner_str; - char *hashed_owner_b32; - size_t hashed_owner_b32_len; - uint32_t cur_it; - /* define to contain the largest possible hash, which is - * sha1 at the moment */ - unsigned char hash[LDNS_SHA1_DIGEST_LENGTH]; - ldns_status status; - - /* TODO: mnemonic list for hash algs SHA-1, default to 1 now (sha1) */ - if (algorithm != LDNS_SHA1) { - return NULL; - } - - /* prepare the owner name according to the draft section bla */ - cann = ldns_rdf_clone(name); - if(!cann) { -#ifdef STDERR_MSGS - fprintf(stderr, "Memory error\n"); -#endif - return NULL; - } - ldns_dname2canonical(cann); - - hashed_owner_str_len = salt_length + ldns_rdf_size(cann); - hashed_owner_str = LDNS_XMALLOC(unsigned char, hashed_owner_str_len); - if(!hashed_owner_str) { - ldns_rdf_deep_free(cann); - return NULL; - } - memcpy(hashed_owner_str, ldns_rdf_data(cann), ldns_rdf_size(cann)); - memcpy(hashed_owner_str + ldns_rdf_size(cann), salt, salt_length); - ldns_rdf_deep_free(cann); - - for (cur_it = iterations + 1; cur_it > 0; cur_it--) { - (void) ldns_sha1((unsigned char *) hashed_owner_str, - (unsigned int) hashed_owner_str_len, hash); - - LDNS_FREE(hashed_owner_str); - hashed_owner_str_len = salt_length + LDNS_SHA1_DIGEST_LENGTH; - hashed_owner_str = LDNS_XMALLOC(unsigned char, hashed_owner_str_len); - if (!hashed_owner_str) { - return NULL; - } - memcpy(hashed_owner_str, hash, LDNS_SHA1_DIGEST_LENGTH); - memcpy(hashed_owner_str + LDNS_SHA1_DIGEST_LENGTH, salt, salt_length); - hashed_owner_str_len = LDNS_SHA1_DIGEST_LENGTH + salt_length; - } - - LDNS_FREE(hashed_owner_str); - hashed_owner_str = hash; - hashed_owner_str_len = LDNS_SHA1_DIGEST_LENGTH; - - hashed_owner_b32 = LDNS_XMALLOC(char, - ldns_b32_ntop_calculate_size(hashed_owner_str_len) + 1); - if(!hashed_owner_b32) { - return NULL; - } - hashed_owner_b32_len = (size_t) ldns_b32_ntop_extended_hex( - (uint8_t *) hashed_owner_str, - hashed_owner_str_len, - hashed_owner_b32, - ldns_b32_ntop_calculate_size(hashed_owner_str_len)+1); - if (hashed_owner_b32_len < 1) { -#ifdef STDERR_MSGS - fprintf(stderr, "Error in base32 extended hex encoding "); - fprintf(stderr, "of hashed owner name (name: "); - ldns_rdf_print(stderr, name); - fprintf(stderr, ", return code: %u)\n", - (unsigned int) hashed_owner_b32_len); -#endif - LDNS_FREE(hashed_owner_b32); - return NULL; - } - hashed_owner_b32[hashed_owner_b32_len] = '\0'; - - status = ldns_str2rdf_dname(&hashed_owner, hashed_owner_b32); - if (status != LDNS_STATUS_OK) { -#ifdef STDERR_MSGS - fprintf(stderr, "Error creating rdf from %s\n", hashed_owner_b32); -#endif - LDNS_FREE(hashed_owner_b32); - return NULL; - } - - LDNS_FREE(hashed_owner_b32); - return hashed_owner; -} - -void -ldns_nsec3_add_param_rdfs(ldns_rr *rr, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt) -{ - ldns_rdf *salt_rdf = NULL; - uint8_t *salt_data = NULL; - ldns_rdf *old; - - old = ldns_rr_set_rdf(rr, - ldns_rdf_new_frm_data(LDNS_RDF_TYPE_INT8, - 1, (void*)&algorithm), - 0); - if (old) ldns_rdf_deep_free(old); - - old = ldns_rr_set_rdf(rr, - ldns_rdf_new_frm_data(LDNS_RDF_TYPE_INT8, - 1, (void*)&flags), - 1); - if (old) ldns_rdf_deep_free(old); - - old = ldns_rr_set_rdf(rr, - ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, - iterations), - 2); - if (old) ldns_rdf_deep_free(old); - - salt_data = LDNS_XMALLOC(uint8_t, salt_length + 1); - if(!salt_data) { - /* no way to return error */ - return; - } - salt_data[0] = salt_length; - memcpy(salt_data + 1, salt, salt_length); - salt_rdf = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_NSEC3_SALT, - salt_length + 1, - salt_data); - if(!salt_rdf) { - LDNS_FREE(salt_data); - /* no way to return error */ - return; - } - - old = ldns_rr_set_rdf(rr, salt_rdf, 3); - if (old) ldns_rdf_deep_free(old); - LDNS_FREE(salt_data); -} - -static int -rr_list_delegation_only(const ldns_rdf *origin, const ldns_rr_list *rr_list) -{ - size_t i; - ldns_rr *cur_rr; - if (!origin || !rr_list) return 0; - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - cur_rr = ldns_rr_list_rr(rr_list, i); - if (ldns_dname_compare(ldns_rr_owner(cur_rr), origin) == 0) { - return 0; - } - if (ldns_rr_get_type(cur_rr) != LDNS_RR_TYPE_NS) { - return 0; - } - } - return 1; -} - -/* this will NOT return the NSEC3 completed, you will have to run the - finalize function on the rrlist later! */ -ldns_rr * -ldns_create_nsec3(const ldns_rdf *cur_owner, - const ldns_rdf *cur_zone, - const ldns_rr_list *rrs, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt, - bool emptynonterminal) -{ - size_t i; - ldns_rr *i_rr; - uint16_t i_type; - - ldns_rr *nsec = NULL; - ldns_rdf *hashed_owner = NULL; - - ldns_status status; - - ldns_rr_type i_type_list[1024]; - size_t type_count = 0; - - hashed_owner = ldns_nsec3_hash_name(cur_owner, - algorithm, - iterations, - salt_length, - salt); - status = ldns_dname_cat(hashed_owner, cur_zone); - if(status != LDNS_STATUS_OK) { - ldns_rdf_deep_free(hashed_owner); - return NULL; - } - nsec = ldns_rr_new_frm_type(LDNS_RR_TYPE_NSEC3); - if(!nsec) { - ldns_rdf_deep_free(hashed_owner); - return NULL; - } - ldns_rr_set_type(nsec, LDNS_RR_TYPE_NSEC3); - ldns_rr_set_owner(nsec, hashed_owner); - - ldns_nsec3_add_param_rdfs(nsec, - algorithm, - flags, - iterations, - salt_length, - salt); - (void) ldns_rr_set_rdf(nsec, NULL, 4); - - - for (i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - i_rr = ldns_rr_list_rr(rrs, i); - if (ldns_rdf_compare(cur_owner, - ldns_rr_owner(i_rr)) == 0) { - i_type = ldns_rr_get_type(i_rr); - if (type_count == 0 || i_type_list[type_count-1] != i_type) { - i_type_list[type_count] = i_type; - type_count++; - } - } - } - - /* add RRSIG anyway, but only if this is not an ENT or - * an unsigned delegation */ - if (!emptynonterminal && !rr_list_delegation_only(cur_zone, rrs)) { - i_type_list[type_count] = LDNS_RR_TYPE_RRSIG; - type_count++; - } - - /* and SOA if owner == zone */ - if (ldns_dname_compare(cur_zone, cur_owner) == 0) { - i_type_list[type_count] = LDNS_RR_TYPE_SOA; - type_count++; - } - - ldns_rr_push_rdf(nsec, - ldns_dnssec_create_nsec_bitmap(i_type_list, - type_count, LDNS_RR_TYPE_NSEC3)); - - return nsec; -} - -uint8_t -ldns_nsec3_algorithm(const ldns_rr *nsec3_rr) -{ - if (nsec3_rr && - (ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3 || - ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3PARAM) - && (ldns_rr_rdf(nsec3_rr, 0) != NULL) - && ldns_rdf_size(ldns_rr_rdf(nsec3_rr, 0)) > 0) { - return ldns_rdf2native_int8(ldns_rr_rdf(nsec3_rr, 0)); - } - return 0; -} - -uint8_t -ldns_nsec3_flags(const ldns_rr *nsec3_rr) -{ - if (nsec3_rr && - (ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3 || - ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3PARAM) - && (ldns_rr_rdf(nsec3_rr, 1) != NULL) - && ldns_rdf_size(ldns_rr_rdf(nsec3_rr, 1)) > 0) { - return ldns_rdf2native_int8(ldns_rr_rdf(nsec3_rr, 1)); - } - return 0; -} - -bool -ldns_nsec3_optout(const ldns_rr *nsec3_rr) -{ - return (ldns_nsec3_flags(nsec3_rr) & LDNS_NSEC3_VARS_OPTOUT_MASK); -} - -uint16_t -ldns_nsec3_iterations(const ldns_rr *nsec3_rr) -{ - if (nsec3_rr && - (ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3 || - ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3PARAM) - && (ldns_rr_rdf(nsec3_rr, 2) != NULL) - && ldns_rdf_size(ldns_rr_rdf(nsec3_rr, 2)) > 0) { - return ldns_rdf2native_int16(ldns_rr_rdf(nsec3_rr, 2)); - } - return 0; - -} - -ldns_rdf * -ldns_nsec3_salt(const ldns_rr *nsec3_rr) -{ - if (nsec3_rr && - (ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3 || - ldns_rr_get_type(nsec3_rr) == LDNS_RR_TYPE_NSEC3PARAM) - ) { - return ldns_rr_rdf(nsec3_rr, 3); - } - return NULL; -} - -uint8_t -ldns_nsec3_salt_length(const ldns_rr *nsec3_rr) -{ - ldns_rdf *salt_rdf = ldns_nsec3_salt(nsec3_rr); - if (salt_rdf && ldns_rdf_size(salt_rdf) > 0) { - return (uint8_t) ldns_rdf_data(salt_rdf)[0]; - } - return 0; -} - -/* allocs data, free with LDNS_FREE() */ -uint8_t * -ldns_nsec3_salt_data(const ldns_rr *nsec3_rr) -{ - uint8_t salt_length; - uint8_t *salt; - - ldns_rdf *salt_rdf = ldns_nsec3_salt(nsec3_rr); - if (salt_rdf && ldns_rdf_size(salt_rdf) > 0) { - salt_length = ldns_rdf_data(salt_rdf)[0]; - salt = LDNS_XMALLOC(uint8_t, salt_length); - if(!salt) return NULL; - memcpy(salt, &ldns_rdf_data(salt_rdf)[1], salt_length); - return salt; - } - return NULL; -} - -ldns_rdf * -ldns_nsec3_next_owner(const ldns_rr *nsec3_rr) -{ - if (!nsec3_rr || ldns_rr_get_type(nsec3_rr) != LDNS_RR_TYPE_NSEC3) { - return NULL; - } else { - return ldns_rr_rdf(nsec3_rr, 4); - } -} - -ldns_rdf * -ldns_nsec3_bitmap(const ldns_rr *nsec3_rr) -{ - if (!nsec3_rr || ldns_rr_get_type(nsec3_rr) != LDNS_RR_TYPE_NSEC3) { - return NULL; - } else { - return ldns_rr_rdf(nsec3_rr, 5); - } -} - -ldns_rdf * -ldns_nsec3_hash_name_frm_nsec3(const ldns_rr *nsec, const ldns_rdf *name) -{ - uint8_t algorithm; - uint16_t iterations; - uint8_t salt_length; - uint8_t *salt = 0; - - ldns_rdf *hashed_owner; - - algorithm = ldns_nsec3_algorithm(nsec); - salt_length = ldns_nsec3_salt_length(nsec); - salt = ldns_nsec3_salt_data(nsec); - iterations = ldns_nsec3_iterations(nsec); - - hashed_owner = ldns_nsec3_hash_name(name, - algorithm, - iterations, - salt_length, - salt); - - LDNS_FREE(salt); - return hashed_owner; -} - -bool -ldns_nsec_bitmap_covers_type(const ldns_rdf* bitmap, ldns_rr_type type) -{ - uint8_t* dptr; - uint8_t* dend; - - /* From RFC3845 Section 2.1.2: - * - * "The RR type space is split into 256 window blocks, each re- - * presenting the low-order 8 bits of the 16-bit RR type space." - */ - uint8_t window = type >> 8; - uint8_t subtype = type & 0xff; - - if (! bitmap) { - return false; - } - assert(ldns_rdf_get_type(bitmap) == LDNS_RDF_TYPE_BITMAP); - - dptr = ldns_rdf_data(bitmap); - dend = ldns_rdf_data(bitmap) + ldns_rdf_size(bitmap); - - /* Type Bitmap = ( Window Block # | Bitmap Length | Bitmap ) + - * dptr[0] dptr[1] dptr[2:] - */ - while (dptr < dend && dptr[0] <= window) { - - if (dptr[0] == window && subtype / 8 < dptr[1] && - dptr + dptr[1] + 2 <= dend) { - - return dptr[2 + subtype / 8] & (0x80 >> (subtype % 8)); - } - dptr += dptr[1] + 2; /* next window */ - } - return false; -} - -ldns_status -ldns_nsec_bitmap_set_type(ldns_rdf* bitmap, ldns_rr_type type) -{ - uint8_t* dptr; - uint8_t* dend; - - /* From RFC3845 Section 2.1.2: - * - * "The RR type space is split into 256 window blocks, each re- - * presenting the low-order 8 bits of the 16-bit RR type space." - */ - uint8_t window = type >> 8; - uint8_t subtype = type & 0xff; - - if (! bitmap) { - return false; - } - assert(ldns_rdf_get_type(bitmap) == LDNS_RDF_TYPE_BITMAP); - - dptr = ldns_rdf_data(bitmap); - dend = ldns_rdf_data(bitmap) + ldns_rdf_size(bitmap); - - /* Type Bitmap = ( Window Block # | Bitmap Length | Bitmap ) + - * dptr[0] dptr[1] dptr[2:] - */ - while (dptr < dend && dptr[0] <= window) { - - if (dptr[0] == window && subtype / 8 < dptr[1] && - dptr + dptr[1] + 2 <= dend) { - - dptr[2 + subtype / 8] |= (0x80 >> (subtype % 8)); - return LDNS_STATUS_OK; - } - dptr += dptr[1] + 2; /* next window */ - } - return LDNS_STATUS_TYPE_NOT_IN_BITMAP; -} - -ldns_status -ldns_nsec_bitmap_clear_type(ldns_rdf* bitmap, ldns_rr_type type) -{ - uint8_t* dptr; - uint8_t* dend; - - /* From RFC3845 Section 2.1.2: - * - * "The RR type space is split into 256 window blocks, each re- - * presenting the low-order 8 bits of the 16-bit RR type space." - */ - uint8_t window = type >> 8; - uint8_t subtype = type & 0xff; - - if (! bitmap) { - return false; - } - - assert(ldns_rdf_get_type(bitmap) == LDNS_RDF_TYPE_BITMAP); - - dptr = ldns_rdf_data(bitmap); - dend = ldns_rdf_data(bitmap) + ldns_rdf_size(bitmap); - - /* Type Bitmap = ( Window Block # | Bitmap Length | Bitmap ) + - * dptr[0] dptr[1] dptr[2:] - */ - while (dptr < dend && dptr[0] <= window) { - - if (dptr[0] == window && subtype / 8 < dptr[1] && - dptr + dptr[1] + 2 <= dend) { - - dptr[2 + subtype / 8] &= ~(0x80 >> (subtype % 8)); - return LDNS_STATUS_OK; - } - dptr += dptr[1] + 2; /* next window */ - } - return LDNS_STATUS_TYPE_NOT_IN_BITMAP; -} - - -bool -ldns_nsec_covers_name(const ldns_rr *nsec, const ldns_rdf *name) -{ - ldns_rdf *nsec_owner = ldns_rr_owner(nsec); - ldns_rdf *hash_next; - char *next_hash_str; - ldns_rdf *nsec_next = NULL; - ldns_status status; - ldns_rdf *chopped_dname; - bool result; - - if (ldns_rr_get_type(nsec) == LDNS_RR_TYPE_NSEC) { - if (ldns_rr_rdf(nsec, 0) != NULL) { - nsec_next = ldns_rdf_clone(ldns_rr_rdf(nsec, 0)); - } else { - return false; - } - } else if (ldns_rr_get_type(nsec) == LDNS_RR_TYPE_NSEC3) { - hash_next = ldns_nsec3_next_owner(nsec); - next_hash_str = ldns_rdf2str(hash_next); - nsec_next = ldns_dname_new_frm_str(next_hash_str); - LDNS_FREE(next_hash_str); - chopped_dname = ldns_dname_left_chop(nsec_owner); - status = ldns_dname_cat(nsec_next, chopped_dname); - ldns_rdf_deep_free(chopped_dname); - if (status != LDNS_STATUS_OK) { - printf("error catting: %s\n", ldns_get_errorstr_by_id(status)); - } - } else { - ldns_rdf_deep_free(nsec_next); - return false; - } - - /* in the case of the last nsec */ - if(ldns_dname_compare(nsec_owner, nsec_next) > 0) { - result = (ldns_dname_compare(nsec_owner, name) <= 0 || - ldns_dname_compare(name, nsec_next) < 0); - } else if(ldns_dname_compare(nsec_owner, nsec_next) < 0) { - result = (ldns_dname_compare(nsec_owner, name) <= 0 && - ldns_dname_compare(name, nsec_next) < 0); - } else { - result = true; - } - - ldns_rdf_deep_free(nsec_next); - return result; -} - -#ifdef HAVE_SSL -/* sig may be null - if so look in the packet */ - -ldns_status -ldns_pkt_verify_time(const ldns_pkt *p, ldns_rr_type t, const ldns_rdf *o, - const ldns_rr_list *k, const ldns_rr_list *s, - time_t check_time, ldns_rr_list *good_keys) -{ - ldns_rr_list *rrset; - ldns_rr_list *sigs; - ldns_rr_list *sigs_covered; - ldns_rdf *rdf_t; - ldns_rr_type t_netorder; - ldns_status status; - - if (!k) { - return LDNS_STATUS_ERR; - /* return LDNS_STATUS_CRYPTO_NO_DNSKEY; */ - } - - if (t == LDNS_RR_TYPE_RRSIG) { - /* we don't have RRSIG(RRSIG) (yet? ;-) ) */ - return LDNS_STATUS_ERR; - } - - if (s) { - /* if s is not NULL, the sigs are given to use */ - sigs = (ldns_rr_list *)s; - } else { - /* otherwise get them from the packet */ - sigs = ldns_pkt_rr_list_by_name_and_type(p, o, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANY_NOQUESTION); - if (!sigs) { - /* no sigs */ - return LDNS_STATUS_ERR; - /* return LDNS_STATUS_CRYPTO_NO_RRSIG; */ - } - } - - /* rrsig are subtyped, so now we need to find the correct - * sigs for the type t - */ - t_netorder = htons(t); /* rdf are in network order! */ - /* a type identifier is a 16-bit number, so the size is 2 bytes */ - rdf_t = ldns_rdf_new(LDNS_RDF_TYPE_TYPE, 2, &t_netorder); - - sigs_covered = ldns_rr_list_subtype_by_rdf(sigs, rdf_t, 0); - ldns_rdf_free(rdf_t); - if (! sigs_covered) { - if (! s) { - ldns_rr_list_deep_free(sigs); - } - return LDNS_STATUS_ERR; - } - ldns_rr_list_deep_free(sigs_covered); - - rrset = ldns_pkt_rr_list_by_name_and_type(p, o, t, - LDNS_SECTION_ANY_NOQUESTION); - if (!rrset) { - if (! s) { - ldns_rr_list_deep_free(sigs); - } - return LDNS_STATUS_ERR; - } - status = ldns_verify_time(rrset, sigs, k, check_time, good_keys); - ldns_rr_list_deep_free(rrset); - return status; -} - -ldns_status -ldns_pkt_verify(const ldns_pkt *p, ldns_rr_type t, const ldns_rdf *o, - const ldns_rr_list *k, const ldns_rr_list *s, ldns_rr_list *good_keys) -{ - return ldns_pkt_verify_time(p, t, o, k, s, ldns_time(NULL), good_keys); -} -#endif /* HAVE_SSL */ - -ldns_status -ldns_dnssec_chain_nsec3_list(ldns_rr_list *nsec3_rrs) -{ - size_t i; - char *next_nsec_owner_str; - ldns_rdf *next_nsec_owner_label; - ldns_rdf *next_nsec_rdf; - ldns_status status = LDNS_STATUS_OK; - - for (i = 0; i < ldns_rr_list_rr_count(nsec3_rrs); i++) { - if (i == ldns_rr_list_rr_count(nsec3_rrs) - 1) { - next_nsec_owner_label = - ldns_dname_label(ldns_rr_owner(ldns_rr_list_rr(nsec3_rrs, - 0)), 0); - next_nsec_owner_str = ldns_rdf2str(next_nsec_owner_label); - if (next_nsec_owner_str[strlen(next_nsec_owner_str) - 1] - == '.') { - next_nsec_owner_str[strlen(next_nsec_owner_str) - 1] - = '\0'; - } - status = ldns_str2rdf_b32_ext(&next_nsec_rdf, - next_nsec_owner_str); - if (!ldns_rr_set_rdf(ldns_rr_list_rr(nsec3_rrs, i), - next_nsec_rdf, 4)) { - /* todo: error */ - } - - ldns_rdf_deep_free(next_nsec_owner_label); - LDNS_FREE(next_nsec_owner_str); - } else { - next_nsec_owner_label = - ldns_dname_label(ldns_rr_owner(ldns_rr_list_rr(nsec3_rrs, - i + 1)), - 0); - next_nsec_owner_str = ldns_rdf2str(next_nsec_owner_label); - if (next_nsec_owner_str[strlen(next_nsec_owner_str) - 1] - == '.') { - next_nsec_owner_str[strlen(next_nsec_owner_str) - 1] - = '\0'; - } - status = ldns_str2rdf_b32_ext(&next_nsec_rdf, - next_nsec_owner_str); - ldns_rdf_deep_free(next_nsec_owner_label); - LDNS_FREE(next_nsec_owner_str); - if (!ldns_rr_set_rdf(ldns_rr_list_rr(nsec3_rrs, i), - next_nsec_rdf, 4)) { - /* todo: error */ - } - } - } - return status; -} - -int -qsort_rr_compare_nsec3(const void *a, const void *b) -{ - const ldns_rr *rr1 = * (const ldns_rr **) a; - const ldns_rr *rr2 = * (const ldns_rr **) b; - if (rr1 == NULL && rr2 == NULL) { - return 0; - } - if (rr1 == NULL) { - return -1; - } - if (rr2 == NULL) { - return 1; - } - return ldns_rdf_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)); -} - -void -ldns_rr_list_sort_nsec3(ldns_rr_list *unsorted) -{ - qsort(unsorted->_rrs, - ldns_rr_list_rr_count(unsorted), - sizeof(ldns_rr *), - qsort_rr_compare_nsec3); -} - -int -ldns_dnssec_default_add_to_signatures( ATTR_UNUSED(ldns_rr *sig) - , ATTR_UNUSED(void *n) - ) -{ - return LDNS_SIGNATURE_LEAVE_ADD_NEW; -} - -int -ldns_dnssec_default_leave_signatures( ATTR_UNUSED(ldns_rr *sig) - , ATTR_UNUSED(void *n) - ) -{ - return LDNS_SIGNATURE_LEAVE_NO_ADD; -} - -int -ldns_dnssec_default_delete_signatures( ATTR_UNUSED(ldns_rr *sig) - , ATTR_UNUSED(void *n) - ) -{ - return LDNS_SIGNATURE_REMOVE_NO_ADD; -} - -int -ldns_dnssec_default_replace_signatures( ATTR_UNUSED(ldns_rr *sig) - , ATTR_UNUSED(void *n) - ) -{ - return LDNS_SIGNATURE_REMOVE_ADD_NEW; -} - -#ifdef HAVE_SSL -ldns_rdf * -ldns_convert_dsa_rrsig_asn12rdf(const ldns_buffer *sig, - const long sig_len) -{ -#ifdef USE_DSA - ldns_rdf *sigdata_rdf; - DSA_SIG *dsasig; - const BIGNUM *R, *S; - unsigned char *dsasig_data = (unsigned char*)ldns_buffer_begin(sig); - size_t byte_offset; - - dsasig = d2i_DSA_SIG(NULL, - (const unsigned char **)&dsasig_data, - sig_len); - if (!dsasig) { - DSA_SIG_free(dsasig); - return NULL; - } - - dsasig_data = LDNS_XMALLOC(unsigned char, 41); - if(!dsasig_data) { - DSA_SIG_free(dsasig); - return NULL; - } - dsasig_data[0] = 0; -# ifdef HAVE_DSA_SIG_GET0 - DSA_SIG_get0(dsasig, &R, &S); -# else - R = dsasig->r; - S = dsasig->s; -# endif - byte_offset = (size_t) (20 - BN_num_bytes(R)); - if (byte_offset > 20) { - DSA_SIG_free(dsasig); - LDNS_FREE(dsasig_data); - return NULL; - } - memset(&dsasig_data[1], 0, byte_offset); - BN_bn2bin(R, &dsasig_data[1 + byte_offset]); - byte_offset = (size_t) (20 - BN_num_bytes(S)); - if (byte_offset > 20) { - DSA_SIG_free(dsasig); - LDNS_FREE(dsasig_data); - return NULL; - } - memset(&dsasig_data[21], 0, byte_offset); - BN_bn2bin(S, &dsasig_data[21 + byte_offset]); - - sigdata_rdf = ldns_rdf_new(LDNS_RDF_TYPE_B64, 41, dsasig_data); - if(!sigdata_rdf) { - LDNS_FREE(dsasig_data); - } - DSA_SIG_free(dsasig); - - return sigdata_rdf; -#else - (void)sig; (void)sig_len; - return NULL; -#endif -} - -ldns_status -ldns_convert_dsa_rrsig_rdf2asn1(ldns_buffer *target_buffer, - const ldns_rdf *sig_rdf) -{ -#ifdef USE_DSA - /* the EVP api wants the DER encoding of the signature... */ - BIGNUM *R, *S; - DSA_SIG *dsasig; - unsigned char *raw_sig = NULL; - int raw_sig_len; - - if(ldns_rdf_size(sig_rdf) < 1 + 2*SHA_DIGEST_LENGTH) - return LDNS_STATUS_SYNTAX_RDATA_ERR; - /* extract the R and S field from the sig buffer */ - R = BN_new(); - if(!R) return LDNS_STATUS_MEM_ERR; - (void) BN_bin2bn((unsigned char *) ldns_rdf_data(sig_rdf) + 1, - SHA_DIGEST_LENGTH, R); - S = BN_new(); - if(!S) { - BN_free(R); - return LDNS_STATUS_MEM_ERR; - } - (void) BN_bin2bn((unsigned char *) ldns_rdf_data(sig_rdf) + 21, - SHA_DIGEST_LENGTH, S); - - dsasig = DSA_SIG_new(); - if (!dsasig) { - BN_free(R); - BN_free(S); - return LDNS_STATUS_MEM_ERR; - } -# ifdef HAVE_DSA_SIG_SET0 - if (! DSA_SIG_set0(dsasig, R, S)) - return LDNS_STATUS_SSL_ERR; -# else - dsasig->r = R; - dsasig->s = S; -# endif - - raw_sig_len = i2d_DSA_SIG(dsasig, &raw_sig); - if (raw_sig_len < 0) { - DSA_SIG_free(dsasig); - free(raw_sig); - return LDNS_STATUS_SSL_ERR; - } - if (ldns_buffer_reserve(target_buffer, (size_t) raw_sig_len)) { - ldns_buffer_write(target_buffer, raw_sig, (size_t)raw_sig_len); - } - - DSA_SIG_free(dsasig); - free(raw_sig); - - return ldns_buffer_status(target_buffer); -#else - (void)target_buffer; (void)sig_rdf; - return LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL; -#endif -} - -#ifdef USE_ECDSA -#ifndef S_SPLINT_S -ldns_rdf * -ldns_convert_ecdsa_rrsig_asn1len2rdf(const ldns_buffer *sig, - const long sig_len, int num_bytes) -{ - ECDSA_SIG* ecdsa_sig; - const BIGNUM *r, *s; - unsigned char *data = (unsigned char*)ldns_buffer_begin(sig); - ldns_rdf* rdf; - ecdsa_sig = d2i_ECDSA_SIG(NULL, (const unsigned char **)&data, sig_len); - if(!ecdsa_sig) return NULL; - -#ifdef HAVE_ECDSA_SIG_GET0 - ECDSA_SIG_get0(ecdsa_sig, &r, &s); -#else - r = ecdsa_sig->r; - s = ecdsa_sig->s; -#endif - /* "r | s". */ - if(BN_num_bytes(r) > num_bytes || - BN_num_bytes(s) > num_bytes) { - ECDSA_SIG_free(ecdsa_sig); - return NULL; /* numbers too big for passed curve size */ - } - data = LDNS_XMALLOC(unsigned char, num_bytes*2); - if(!data) { - ECDSA_SIG_free(ecdsa_sig); - return NULL; - } - /* write the bignums (in big-endian) a little offset if the BN code - * wants to write a shorter number of bytes, with zeroes prefixed */ - memset(data, 0, num_bytes*2); - BN_bn2bin(r, data+num_bytes-BN_num_bytes(r)); - BN_bn2bin(s, data+num_bytes*2-BN_num_bytes(s)); - rdf = ldns_rdf_new(LDNS_RDF_TYPE_B64, (size_t)(num_bytes*2), data); - ECDSA_SIG_free(ecdsa_sig); - return rdf; -} - -ldns_status -ldns_convert_ecdsa_rrsig_rdf2asn1(ldns_buffer *target_buffer, - const ldns_rdf *sig_rdf) -{ - /* convert from two BIGNUMs in the rdata buffer, to ASN notation. - * ASN preable: 30440220 <R 32bytefor256> 0220 <S 32bytefor256> - * the '20' is the length of that field (=bnsize). - * the '44' is the total remaining length. - * if negative, start with leading zero. - * if starts with 00s, remove them from the number. - */ - uint8_t pre[] = {0x30, 0x44, 0x02, 0x20}; - int pre_len = 4; - uint8_t mid[] = {0x02, 0x20}; - int mid_len = 2; - int raw_sig_len, r_high, s_high, r_rem=0, s_rem=0; - long bnsize = (long)ldns_rdf_size(sig_rdf) / 2; - uint8_t* d = ldns_rdf_data(sig_rdf); - /* if too short, or not even length, do not bother */ - if(bnsize < 16 || (size_t)bnsize*2 != ldns_rdf_size(sig_rdf)) - return LDNS_STATUS_ERR; - /* strip leading zeroes from r (but not last one) */ - while(r_rem < bnsize-1 && d[r_rem] == 0) - r_rem++; - /* strip leading zeroes from s (but not last one) */ - while(s_rem < bnsize-1 && d[bnsize+s_rem] == 0) - s_rem++; - - r_high = ((d[0+r_rem]&0x80)?1:0); - s_high = ((d[bnsize+s_rem]&0x80)?1:0); - raw_sig_len = pre_len + r_high + bnsize - r_rem + mid_len + - s_high + bnsize - s_rem; - if(ldns_buffer_reserve(target_buffer, (size_t) raw_sig_len)) { - ldns_buffer_write_u8(target_buffer, pre[0]); - ldns_buffer_write_u8(target_buffer, raw_sig_len-2); - ldns_buffer_write_u8(target_buffer, pre[2]); - ldns_buffer_write_u8(target_buffer, bnsize + r_high - r_rem); - if(r_high) - ldns_buffer_write_u8(target_buffer, 0); - ldns_buffer_write(target_buffer, d+r_rem, bnsize-r_rem); - ldns_buffer_write(target_buffer, mid, mid_len-1); - ldns_buffer_write_u8(target_buffer, bnsize + s_high - s_rem); - if(s_high) - ldns_buffer_write_u8(target_buffer, 0); - ldns_buffer_write(target_buffer, d+bnsize+s_rem, bnsize-s_rem); - } - return ldns_buffer_status(target_buffer); -} - -#endif /* S_SPLINT_S */ -#endif /* USE_ECDSA */ -#endif /* HAVE_SSL */ diff --git a/ldns/dnssec_sign.c b/ldns/dnssec_sign.c deleted file mode 100644 index c6d1dd2..0000000 --- a/ldns/dnssec_sign.c +++ /dev/null @@ -1,1614 +0,0 @@ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <ldns/dnssec.h> -#include <ldns/dnssec_sign.h> - -#include <strings.h> -#include <time.h> - -#ifdef HAVE_SSL -/* this entire file is rather useless when you don't have - * crypto... - */ -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/err.h> -#include <openssl/md5.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> -#ifdef USE_DSA -#include <openssl/dsa.h> -#endif -#endif /* HAVE_SSL */ - -ldns_rr * -ldns_create_empty_rrsig(const ldns_rr_list *rrset, - const ldns_key *current_key) -{ - uint32_t orig_ttl; - ldns_rr_class orig_class; - time_t now; - ldns_rr *current_sig; - uint8_t label_count; - ldns_rdf *signame; - - label_count = ldns_dname_label_count(ldns_rr_owner(ldns_rr_list_rr(rrset, - 0))); - /* RFC4035 2.2: not counting the leftmost label if it is a wildcard */ - if(ldns_dname_is_wildcard(ldns_rr_owner(ldns_rr_list_rr(rrset, 0)))) - label_count --; - - current_sig = ldns_rr_new_frm_type(LDNS_RR_TYPE_RRSIG); - - /* set the type on the new signature */ - orig_ttl = ldns_rr_ttl(ldns_rr_list_rr(rrset, 0)); - orig_class = ldns_rr_get_class(ldns_rr_list_rr(rrset, 0)); - - ldns_rr_set_ttl(current_sig, orig_ttl); - ldns_rr_set_class(current_sig, orig_class); - ldns_rr_set_owner(current_sig, - ldns_rdf_clone( - ldns_rr_owner( - ldns_rr_list_rr(rrset, - 0)))); - - /* fill in what we know of the signature */ - - /* set the orig_ttl */ - (void)ldns_rr_rrsig_set_origttl( - current_sig, - ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, - orig_ttl)); - /* the signers name */ - signame = ldns_rdf_clone(ldns_key_pubkey_owner(current_key)); - ldns_dname2canonical(signame); - (void)ldns_rr_rrsig_set_signame( - current_sig, - signame); - /* label count - get it from the first rr in the rr_list */ - (void)ldns_rr_rrsig_set_labels( - current_sig, - ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, - label_count)); - /* inception, expiration */ - now = time(NULL); - if (ldns_key_inception(current_key) != 0) { - (void)ldns_rr_rrsig_set_inception( - current_sig, - ldns_native2rdf_int32( - LDNS_RDF_TYPE_TIME, - ldns_key_inception(current_key))); - } else { - (void)ldns_rr_rrsig_set_inception( - current_sig, - ldns_native2rdf_int32(LDNS_RDF_TYPE_TIME, now)); - } - if (ldns_key_expiration(current_key) != 0) { - (void)ldns_rr_rrsig_set_expiration( - current_sig, - ldns_native2rdf_int32( - LDNS_RDF_TYPE_TIME, - ldns_key_expiration(current_key))); - } else { - (void)ldns_rr_rrsig_set_expiration( - current_sig, - ldns_native2rdf_int32( - LDNS_RDF_TYPE_TIME, - now + LDNS_DEFAULT_EXP_TIME)); - } - - (void)ldns_rr_rrsig_set_keytag( - current_sig, - ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, - ldns_key_keytag(current_key))); - - (void)ldns_rr_rrsig_set_algorithm( - current_sig, - ldns_native2rdf_int8( - LDNS_RDF_TYPE_ALG, - ldns_key_algorithm(current_key))); - - (void)ldns_rr_rrsig_set_typecovered( - current_sig, - ldns_native2rdf_int16( - LDNS_RDF_TYPE_TYPE, - ldns_rr_get_type(ldns_rr_list_rr(rrset, - 0)))); - return current_sig; -} - -#ifdef HAVE_SSL -ldns_rdf * -ldns_sign_public_buffer(ldns_buffer *sign_buf, ldns_key *current_key) -{ - ldns_rdf *b64rdf = NULL; - - switch(ldns_key_algorithm(current_key)) { -#ifdef USE_DSA - case LDNS_SIGN_DSA: - case LDNS_SIGN_DSA_NSEC3: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), -# ifdef HAVE_EVP_DSS1 - EVP_dss1() -# else - EVP_sha1() -# endif - ); - break; -#endif /* USE_DSA */ - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_sha1()); - break; -#ifdef USE_SHA2 - case LDNS_SIGN_RSASHA256: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_sha256()); - break; - case LDNS_SIGN_RSASHA512: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_sha512()); - break; -#endif /* USE_SHA2 */ -#ifdef USE_GOST - case LDNS_SIGN_ECC_GOST: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_get_digestbyname("md_gost94")); - break; -#endif /* USE_GOST */ -#ifdef USE_ECDSA - case LDNS_SIGN_ECDSAP256SHA256: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_sha256()); - break; - case LDNS_SIGN_ECDSAP384SHA384: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_sha384()); - break; -#endif -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - NULL); - break; -#endif -#ifdef USE_ED448 - case LDNS_SIGN_ED448: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - NULL); - break; -#endif - case LDNS_SIGN_RSAMD5: - b64rdf = ldns_sign_public_evp( - sign_buf, - ldns_key_evp_key(current_key), - EVP_md5()); - break; - default: - /* do _you_ know this alg? */ - printf("unknown algorithm, "); - printf("is the one used available on this system?\n"); - break; - } - - return b64rdf; -} - -/** - * use this function to sign with a public/private key alg - * return the created signatures - */ -ldns_rr_list * -ldns_sign_public(ldns_rr_list *rrset, ldns_key_list *keys) -{ - ldns_rr_list *signatures; - ldns_rr_list *rrset_clone; - ldns_rr *current_sig; - ldns_rdf *b64rdf; - ldns_key *current_key; - size_t key_count; - uint16_t i; - ldns_buffer *sign_buf; - ldns_rdf *new_owner; - - if (!rrset || ldns_rr_list_rr_count(rrset) < 1 || !keys) { - return NULL; - } - - new_owner = NULL; - - /* prepare a signature and add all the know data - * prepare the rrset. Sign this together. */ - rrset_clone = ldns_rr_list_clone(rrset); - if (!rrset_clone) { - return NULL; - } - - /* make it canonical */ - for(i = 0; i < ldns_rr_list_rr_count(rrset_clone); i++) { - ldns_rr_set_ttl(ldns_rr_list_rr(rrset_clone, i), - ldns_rr_ttl(ldns_rr_list_rr(rrset, 0))); - ldns_rr2canonical(ldns_rr_list_rr(rrset_clone, i)); - } - /* sort */ - ldns_rr_list_sort(rrset_clone); - - signatures = ldns_rr_list_new(); - - for (key_count = 0; - key_count < ldns_key_list_key_count(keys); - key_count++) { - if (!ldns_key_use(ldns_key_list_key(keys, key_count))) { - continue; - } - sign_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!sign_buf) { - ldns_rr_list_free(rrset_clone); - ldns_rr_list_free(signatures); - ldns_rdf_free(new_owner); - return NULL; - } - b64rdf = NULL; - - current_key = ldns_key_list_key(keys, key_count); - /* sign all RRs with keys that have ZSKbit, !SEPbit. - sign DNSKEY RRs with keys that have ZSKbit&SEPbit */ - if (ldns_key_flags(current_key) & LDNS_KEY_ZONE_KEY) { - current_sig = ldns_create_empty_rrsig(rrset_clone, - current_key); - - /* right now, we have: a key, a semi-sig and an rrset. For - * which we can create the sig and base64 encode that and - * add that to the signature */ - - if (ldns_rrsig2buffer_wire(sign_buf, current_sig) - != LDNS_STATUS_OK) { - ldns_buffer_free(sign_buf); - /* ERROR */ - ldns_rr_list_deep_free(rrset_clone); - ldns_rr_free(current_sig); - ldns_rr_list_deep_free(signatures); - return NULL; - } - - /* add the rrset in sign_buf */ - if (ldns_rr_list2buffer_wire(sign_buf, rrset_clone) - != LDNS_STATUS_OK) { - ldns_buffer_free(sign_buf); - ldns_rr_list_deep_free(rrset_clone); - ldns_rr_free(current_sig); - ldns_rr_list_deep_free(signatures); - return NULL; - } - - b64rdf = ldns_sign_public_buffer(sign_buf, current_key); - - if (!b64rdf) { - /* signing went wrong */ - ldns_rr_list_deep_free(rrset_clone); - ldns_rr_free(current_sig); - ldns_rr_list_deep_free(signatures); - return NULL; - } - - ldns_rr_rrsig_set_sig(current_sig, b64rdf); - - /* push the signature to the signatures list */ - ldns_rr_list_push_rr(signatures, current_sig); - } - ldns_buffer_free(sign_buf); /* restart for the next key */ - } - ldns_rr_list_deep_free(rrset_clone); - - return signatures; -} - -/** - * Sign data with DSA - * - * \param[in] to_sign The ldns_buffer containing raw data that is - * to be signed - * \param[in] key The DSA key structure to sign with - * \return ldns_rdf for the RRSIG ldns_rr - */ -ldns_rdf * -ldns_sign_public_dsa(ldns_buffer *to_sign, DSA *key) -{ -#ifdef USE_DSA - unsigned char *sha1_hash; - ldns_rdf *sigdata_rdf; - ldns_buffer *b64sig; - - DSA_SIG *sig; - const BIGNUM *R, *S; - uint8_t *data; - size_t pad; - - b64sig = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!b64sig) { - return NULL; - } - - sha1_hash = SHA1((unsigned char*)ldns_buffer_begin(to_sign), - ldns_buffer_position(to_sign), NULL); - if (!sha1_hash) { - ldns_buffer_free(b64sig); - return NULL; - } - - sig = DSA_do_sign(sha1_hash, SHA_DIGEST_LENGTH, key); - if(!sig) { - ldns_buffer_free(b64sig); - return NULL; - } - - data = LDNS_XMALLOC(uint8_t, 1 + 2 * SHA_DIGEST_LENGTH); - if(!data) { - ldns_buffer_free(b64sig); - DSA_SIG_free(sig); - return NULL; - } - - data[0] = 1; -# ifdef HAVE_DSA_SIG_GET0 - DSA_SIG_get0(sig, &R, &S); -# else - R = sig->r; - S = sig->s; -# endif - pad = 20 - (size_t) BN_num_bytes(R); - if (pad > 0) { - memset(data + 1, 0, pad); - } - BN_bn2bin(R, (unsigned char *) (data + 1) + pad); - - pad = 20 - (size_t) BN_num_bytes(S); - if (pad > 0) { - memset(data + 1 + SHA_DIGEST_LENGTH, 0, pad); - } - BN_bn2bin(S, (unsigned char *) (data + 1 + SHA_DIGEST_LENGTH + pad)); - - sigdata_rdf = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, - 1 + 2 * SHA_DIGEST_LENGTH, - data); - - ldns_buffer_free(b64sig); - LDNS_FREE(data); - DSA_SIG_free(sig); - - return sigdata_rdf; -#else - (void)to_sign; (void)key; - return NULL; -#endif -} - -#ifdef USE_ECDSA -#ifndef S_SPLINT_S -/** returns the number of bytes per signature-component (i.e. bits/8), or 0. */ -static int -ldns_pkey_is_ecdsa(EVP_PKEY* pkey) -{ - EC_KEY* ec; - const EC_GROUP* g; -#ifdef HAVE_EVP_PKEY_BASE_ID - if(EVP_PKEY_base_id(pkey) != EVP_PKEY_EC) - return 0; -#else - if(EVP_PKEY_type(key->type) != EVP_PKEY_EC) - return 0; -#endif - ec = EVP_PKEY_get1_EC_KEY(pkey); - g = EC_KEY_get0_group(ec); - if(!g) { - EC_KEY_free(ec); - return 0; - } - if(EC_GROUP_get_curve_name(g) == NID_X9_62_prime256v1) { - EC_KEY_free(ec); - return 32; /* 256/8 */ - } - if(EC_GROUP_get_curve_name(g) == NID_secp384r1) { - EC_KEY_free(ec); - return 48; /* 384/8 */ - } - /* downref the eckey, the original is still inside the pkey */ - EC_KEY_free(ec); - return 0; -} -#endif /* splint */ -#endif /* USE_ECDSA */ - -ldns_rdf * -ldns_sign_public_evp(ldns_buffer *to_sign, - EVP_PKEY *key, - const EVP_MD *digest_type) -{ - unsigned int siglen; - ldns_rdf *sigdata_rdf = NULL; - ldns_buffer *b64sig; - EVP_MD_CTX *ctx; - const EVP_MD *md_type; - int r; - - siglen = 0; - b64sig = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!b64sig) { - return NULL; - } - - /* initializes a signing context */ - md_type = digest_type; -#ifdef USE_ED25519 - if(EVP_PKEY_id(key) == NID_ED25519) { - /* digest must be NULL for ED25519 sign and verify */ - md_type = NULL; - } else -#endif -#ifdef USE_ED448 - if(EVP_PKEY_id(key) == NID_ED448) { - md_type = NULL; - } else -#endif - if(!md_type) { - /* unknown message digest */ - ldns_buffer_free(b64sig); - return NULL; - } - -#ifdef HAVE_EVP_MD_CTX_NEW - ctx = EVP_MD_CTX_new(); -#else - ctx = (EVP_MD_CTX*)malloc(sizeof(*ctx)); - if(ctx) EVP_MD_CTX_init(ctx); -#endif - if(!ctx) { - ldns_buffer_free(b64sig); - return NULL; - } - -#if defined(USE_ED25519) || defined(USE_ED448) - if(md_type == NULL) { - /* for these methods we must use the one-shot DigestSign */ - r = EVP_DigestSignInit(ctx, NULL, md_type, NULL, key); - if(r == 1) { - size_t siglen_sizet = ldns_buffer_capacity(b64sig); - r = EVP_DigestSign(ctx, - (unsigned char*)ldns_buffer_begin(b64sig), - &siglen_sizet, - (unsigned char*)ldns_buffer_begin(to_sign), - ldns_buffer_position(to_sign)); - siglen = (unsigned int)siglen_sizet; - } - } else { -#else - r = 0; - if(md_type != NULL) { -#endif - r = EVP_SignInit(ctx, md_type); - if(r == 1) { - r = EVP_SignUpdate(ctx, (unsigned char*) - ldns_buffer_begin(to_sign), - ldns_buffer_position(to_sign)); - } - if(r == 1) { - r = EVP_SignFinal(ctx, (unsigned char*) - ldns_buffer_begin(b64sig), &siglen, key); - } - } - if(r != 1) { - ldns_buffer_free(b64sig); - EVP_MD_CTX_destroy(ctx); - return NULL; - } - - /* OpenSSL output is different, convert it */ - r = 0; -#ifdef USE_DSA -#ifndef S_SPLINT_S - /* unfortunately, OpenSSL output is different from DNS DSA format */ -# ifdef HAVE_EVP_PKEY_BASE_ID - if (EVP_PKEY_base_id(key) == EVP_PKEY_DSA) { -# else - if (EVP_PKEY_type(key->type) == EVP_PKEY_DSA) { -# endif - r = 1; - sigdata_rdf = ldns_convert_dsa_rrsig_asn12rdf(b64sig, siglen); - } -#endif -#endif -#if defined(USE_ECDSA) - if( -# ifdef HAVE_EVP_PKEY_BASE_ID - EVP_PKEY_base_id(key) -# else - EVP_PKEY_type(key->type) -# endif - == EVP_PKEY_EC) { -# ifdef USE_ECDSA - if(ldns_pkey_is_ecdsa(key)) { - r = 1; - sigdata_rdf = ldns_convert_ecdsa_rrsig_asn1len2rdf( - b64sig, (long)siglen, ldns_pkey_is_ecdsa(key)); - } -# endif /* USE_ECDSA */ - } -#endif /* PKEY_EC */ - if(r == 0) { - /* ok output for other types is the same */ - sigdata_rdf = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, siglen, - ldns_buffer_begin(b64sig)); - } - ldns_buffer_free(b64sig); - EVP_MD_CTX_destroy(ctx); - return sigdata_rdf; -} - -ldns_rdf * -ldns_sign_public_rsasha1(ldns_buffer *to_sign, RSA *key) -{ - unsigned char *sha1_hash; - unsigned int siglen; - ldns_rdf *sigdata_rdf; - ldns_buffer *b64sig; - int result; - - siglen = 0; - b64sig = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!b64sig) { - return NULL; - } - - sha1_hash = SHA1((unsigned char*)ldns_buffer_begin(to_sign), - ldns_buffer_position(to_sign), NULL); - if (!sha1_hash) { - ldns_buffer_free(b64sig); - return NULL; - } - - result = RSA_sign(NID_sha1, sha1_hash, SHA_DIGEST_LENGTH, - (unsigned char*)ldns_buffer_begin(b64sig), - &siglen, key); - if (result != 1) { - ldns_buffer_free(b64sig); - return NULL; - } - - sigdata_rdf = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, siglen, - ldns_buffer_begin(b64sig)); - ldns_buffer_free(b64sig); /* can't free this buffer ?? */ - return sigdata_rdf; -} - -ldns_rdf * -ldns_sign_public_rsamd5(ldns_buffer *to_sign, RSA *key) -{ - unsigned char *md5_hash; - unsigned int siglen; - ldns_rdf *sigdata_rdf; - ldns_buffer *b64sig; - - b64sig = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!b64sig) { - return NULL; - } - - md5_hash = MD5((unsigned char*)ldns_buffer_begin(to_sign), - ldns_buffer_position(to_sign), NULL); - if (!md5_hash) { - ldns_buffer_free(b64sig); - return NULL; - } - - RSA_sign(NID_md5, md5_hash, MD5_DIGEST_LENGTH, - (unsigned char*)ldns_buffer_begin(b64sig), - &siglen, key); - - sigdata_rdf = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, siglen, - ldns_buffer_begin(b64sig)); - ldns_buffer_free(b64sig); - return sigdata_rdf; -} -#endif /* HAVE_SSL */ - -/** - * Pushes all rrs from the rrsets of type A and AAAA on gluelist. - */ -static ldns_status -ldns_dnssec_addresses_on_glue_list( - ldns_dnssec_rrsets *cur_rrset, - ldns_rr_list *glue_list) -{ - ldns_dnssec_rrs *cur_rrs; - while (cur_rrset) { - if (cur_rrset->type == LDNS_RR_TYPE_A - || cur_rrset->type == LDNS_RR_TYPE_AAAA) { - for (cur_rrs = cur_rrset->rrs; - cur_rrs; - cur_rrs = cur_rrs->next) { - if (cur_rrs->rr) { - if (!ldns_rr_list_push_rr(glue_list, - cur_rrs->rr)) { - return LDNS_STATUS_MEM_ERR; - /* ldns_rr_list_push_rr() - * returns false when unable - * to increase the capacity - * of the ldsn_rr_list - */ - } - } - } - } - cur_rrset = cur_rrset->next; - } - return LDNS_STATUS_OK; -} - -/** - * Marks the names in the zone that are occluded. Those names will be skipped - * when walking the tree with the ldns_dnssec_name_node_next_nonglue() - * function. But watch out! Names that are partially occluded (like glue with - * the same name as the delegation) will not be marked and should specifically - * be taken into account separately. - * - * When glue_list is given (not NULL), in the process of marking the names, all - * glue resource records will be pushed to that list, even glue at delegation names. - * - * \param[in] zone the zone in which to mark the names - * \param[in] glue_list the list to which to push the glue rrs - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status -ldns_dnssec_zone_mark_and_get_glue(ldns_dnssec_zone *zone, - ldns_rr_list *glue_list) -{ - ldns_rbnode_t *node; - ldns_dnssec_name *name; - ldns_rdf *owner; - ldns_rdf *cut = NULL; /* keeps track of zone cuts */ - /* When the cut is caused by a delegation, below_delegation will be 1. - * When caused by a DNAME, below_delegation will be 0. - */ - int below_delegation = -1; /* init suppresses comiler warning */ - ldns_status s; - - if (!zone || !zone->names) { - return LDNS_STATUS_NULL; - } - for (node = ldns_rbtree_first(zone->names); - node != LDNS_RBTREE_NULL; - node = ldns_rbtree_next(node)) { - name = (ldns_dnssec_name *) node->data; - owner = ldns_dnssec_name_name(name); - - if (cut) { - /* The previous node was a zone cut, or a subdomain - * below a zone cut. Is this node (still) a subdomain - * below the cut? Then the name is occluded. Unless - * the name contains a SOA, after which we are - * authoritative again. - * - * FIXME! If there are labels in between the SOA and - * the cut, going from the authoritative space (below - * the SOA) up into occluded space again, will not be - * detected with the contruct below! - */ - if (ldns_dname_is_subdomain(owner, cut) && - !ldns_dnssec_rrsets_contains_type( - name->rrsets, LDNS_RR_TYPE_SOA)) { - - if (below_delegation && glue_list) { - s = ldns_dnssec_addresses_on_glue_list( - name->rrsets, glue_list); - if (s != LDNS_STATUS_OK) { - return s; - } - } - name->is_glue = true; /* Mark occluded name! */ - continue; - } else { - cut = NULL; - } - } - - /* The node is not below a zone cut. Is it a zone cut itself? - * Everything below a SOA is authoritative of course; Except - * when the name also contains a DNAME :). - */ - if (ldns_dnssec_rrsets_contains_type( - name->rrsets, LDNS_RR_TYPE_NS) - && !ldns_dnssec_rrsets_contains_type( - name->rrsets, LDNS_RR_TYPE_SOA)) { - cut = owner; - below_delegation = 1; - if (glue_list) { /* record glue on the zone cut */ - s = ldns_dnssec_addresses_on_glue_list( - name->rrsets, glue_list); - if (s != LDNS_STATUS_OK) { - return s; - } - } - } else if (ldns_dnssec_rrsets_contains_type( - name->rrsets, LDNS_RR_TYPE_DNAME)) { - cut = owner; - below_delegation = 0; - } - } - return LDNS_STATUS_OK; -} - -/** - * Marks the names in the zone that are occluded. Those names will be skipped - * when walking the tree with the ldns_dnssec_name_node_next_nonglue() - * function. But watch out! Names that are partially occluded (like glue with - * the same name as the delegation) will not be marked and should specifically - * be taken into account separately. - * - * \param[in] zone the zone in which to mark the names - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status -ldns_dnssec_zone_mark_glue(ldns_dnssec_zone *zone) -{ - return ldns_dnssec_zone_mark_and_get_glue(zone, NULL); -} - -ldns_rbnode_t * -ldns_dnssec_name_node_next_nonglue(ldns_rbnode_t *node) -{ - ldns_rbnode_t *next_node = NULL; - ldns_dnssec_name *next_name = NULL; - bool done = false; - - if (node == LDNS_RBTREE_NULL) { - return NULL; - } - next_node = node; - while (!done) { - if (next_node == LDNS_RBTREE_NULL) { - return NULL; - } else { - next_name = (ldns_dnssec_name *)next_node->data; - if (!next_name->is_glue) { - done = true; - } else { - next_node = ldns_rbtree_next(next_node); - } - } - } - return next_node; -} - -ldns_status -ldns_dnssec_zone_create_nsecs(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs) -{ - - ldns_rbnode_t *first_node, *cur_node, *next_node; - ldns_dnssec_name *cur_name, *next_name; - ldns_rr *nsec_rr; - uint32_t nsec_ttl; - ldns_dnssec_rrsets *soa; - - /* the TTL of NSEC rrs should be set to the minimum TTL of - * the zone SOA (RFC4035 Section 2.3) - */ - soa = ldns_dnssec_name_find_rrset(zone->soa, LDNS_RR_TYPE_SOA); - - /* did the caller actually set it? if not, - * fall back to default ttl - */ - if (soa && soa->rrs && soa->rrs->rr - && (ldns_rr_rdf(soa->rrs->rr, 6) != NULL)) { - nsec_ttl = ldns_rdf2native_int32(ldns_rr_rdf(soa->rrs->rr, 6)); - } else { - nsec_ttl = LDNS_DEFAULT_TTL; - } - - first_node = ldns_dnssec_name_node_next_nonglue( - ldns_rbtree_first(zone->names)); - cur_node = first_node; - if (cur_node) { - next_node = ldns_dnssec_name_node_next_nonglue( - ldns_rbtree_next(cur_node)); - } else { - next_node = NULL; - } - - while (cur_node && next_node) { - cur_name = (ldns_dnssec_name *)cur_node->data; - next_name = (ldns_dnssec_name *)next_node->data; - nsec_rr = ldns_dnssec_create_nsec(cur_name, - next_name, - LDNS_RR_TYPE_NSEC); - ldns_rr_set_ttl(nsec_rr, nsec_ttl); - if(ldns_dnssec_name_add_rr(cur_name, nsec_rr)!=LDNS_STATUS_OK){ - ldns_rr_free(nsec_rr); - return LDNS_STATUS_ERR; - } - ldns_rr_list_push_rr(new_rrs, nsec_rr); - cur_node = next_node; - if (cur_node) { - next_node = ldns_dnssec_name_node_next_nonglue( - ldns_rbtree_next(cur_node)); - } - } - - if (cur_node && !next_node) { - cur_name = (ldns_dnssec_name *)cur_node->data; - next_name = (ldns_dnssec_name *)first_node->data; - nsec_rr = ldns_dnssec_create_nsec(cur_name, - next_name, - LDNS_RR_TYPE_NSEC); - ldns_rr_set_ttl(nsec_rr, nsec_ttl); - if(ldns_dnssec_name_add_rr(cur_name, nsec_rr)!=LDNS_STATUS_OK){ - ldns_rr_free(nsec_rr); - return LDNS_STATUS_ERR; - } - ldns_rr_list_push_rr(new_rrs, nsec_rr); - } else { - printf("error\n"); - } - - return LDNS_STATUS_OK; -} - -#ifdef HAVE_SSL -static void -ldns_hashed_names_node_free(ldns_rbnode_t *node, void *arg) { - (void) arg; - LDNS_FREE(node); -} - -static ldns_status -ldns_dnssec_zone_create_nsec3s_mkmap(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt, - ldns_rbtree_t **map) -{ - ldns_rbnode_t *first_name_node; - ldns_rbnode_t *current_name_node; - ldns_dnssec_name *current_name; - ldns_status result = LDNS_STATUS_OK; - ldns_rr *nsec_rr; - ldns_rr_list *nsec3_list; - uint32_t nsec_ttl; - ldns_dnssec_rrsets *soa; - ldns_rbnode_t *hashmap_node; - - if (!zone || !new_rrs || !zone->names) { - return LDNS_STATUS_ERR; - } - - /* the TTL of NSEC rrs should be set to the minimum TTL of - * the zone SOA (RFC4035 Section 2.3) - */ - soa = ldns_dnssec_name_find_rrset(zone->soa, LDNS_RR_TYPE_SOA); - - /* did the caller actually set it? if not, - * fall back to default ttl - */ - if (soa && soa->rrs && soa->rrs->rr - && ldns_rr_rdf(soa->rrs->rr, 6) != NULL) { - nsec_ttl = ldns_rdf2native_int32(ldns_rr_rdf(soa->rrs->rr, 6)); - } else { - nsec_ttl = LDNS_DEFAULT_TTL; - } - - if (ldns_rdf_size(zone->soa->name) > 222) { - return LDNS_STATUS_NSEC3_DOMAINNAME_OVERFLOW; - } - - if (zone->hashed_names) { - ldns_traverse_postorder(zone->hashed_names, - ldns_hashed_names_node_free, NULL); - LDNS_FREE(zone->hashed_names); - } - zone->hashed_names = ldns_rbtree_create(ldns_dname_compare_v); - if (zone->hashed_names && map) { - *map = zone->hashed_names; - } - - first_name_node = ldns_dnssec_name_node_next_nonglue( - ldns_rbtree_first(zone->names)); - - current_name_node = first_name_node; - - while (current_name_node && current_name_node != LDNS_RBTREE_NULL && - result == LDNS_STATUS_OK) { - - current_name = (ldns_dnssec_name *) current_name_node->data; - nsec_rr = ldns_dnssec_create_nsec3(current_name, - NULL, - zone->soa->name, - algorithm, - flags, - iterations, - salt_length, - salt); - /* by default, our nsec based generator adds rrsigs - * remove the bitmap for empty nonterminals */ - if (!current_name->rrsets) { - ldns_rdf_deep_free(ldns_rr_pop_rdf(nsec_rr)); - } - ldns_rr_set_ttl(nsec_rr, nsec_ttl); - result = ldns_dnssec_name_add_rr(current_name, nsec_rr); - ldns_rr_list_push_rr(new_rrs, nsec_rr); - if (ldns_rr_owner(nsec_rr)) { - hashmap_node = LDNS_MALLOC(ldns_rbnode_t); - if (hashmap_node == NULL) { - return LDNS_STATUS_MEM_ERR; - } - current_name->hashed_name = - ldns_dname_label(ldns_rr_owner(nsec_rr), 0); - - if (current_name->hashed_name == NULL) { - LDNS_FREE(hashmap_node); - return LDNS_STATUS_MEM_ERR; - } - hashmap_node->key = current_name->hashed_name; - hashmap_node->data = current_name; - - if (! ldns_rbtree_insert(zone->hashed_names - , hashmap_node)) { - LDNS_FREE(hashmap_node); - } - } - current_name_node = ldns_dnssec_name_node_next_nonglue( - ldns_rbtree_next(current_name_node)); - } - if (result != LDNS_STATUS_OK) { - return result; - } - - /* Make sorted list of nsec3s (via zone->hashed_names) - */ - nsec3_list = ldns_rr_list_new(); - if (nsec3_list == NULL) { - return LDNS_STATUS_MEM_ERR; - } - for ( hashmap_node = ldns_rbtree_first(zone->hashed_names) - ; hashmap_node != LDNS_RBTREE_NULL - ; hashmap_node = ldns_rbtree_next(hashmap_node) - ) { - nsec_rr = ((ldns_dnssec_name *) hashmap_node->data)->nsec; - if (nsec_rr) { - ldns_rr_list_push_rr(nsec3_list, nsec_rr); - } - } - result = ldns_dnssec_chain_nsec3_list(nsec3_list); - ldns_rr_list_free(nsec3_list); - - return result; -} - -ldns_status -ldns_dnssec_zone_create_nsec3s(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt) -{ - return ldns_dnssec_zone_create_nsec3s_mkmap(zone, new_rrs, algorithm, - flags, iterations, salt_length, salt, NULL); - -} -#endif /* HAVE_SSL */ - -ldns_dnssec_rrs * -ldns_dnssec_remove_signatures( ldns_dnssec_rrs *signatures - , ATTR_UNUSED(ldns_key_list *key_list) - , int (*func)(ldns_rr *, void *) - , void *arg - ) -{ - ldns_dnssec_rrs *base_rrs = signatures; - ldns_dnssec_rrs *cur_rr = base_rrs; - ldns_dnssec_rrs *prev_rr = NULL; - ldns_dnssec_rrs *next_rr; - - uint16_t keytag; - size_t i; - - if (!cur_rr) { - switch(func(NULL, arg)) { - case LDNS_SIGNATURE_LEAVE_ADD_NEW: - case LDNS_SIGNATURE_REMOVE_ADD_NEW: - break; - case LDNS_SIGNATURE_LEAVE_NO_ADD: - case LDNS_SIGNATURE_REMOVE_NO_ADD: - ldns_key_list_set_use(key_list, false); - break; - default: -#ifdef STDERR_MSGS - fprintf(stderr, "[XX] unknown return value from callback\n"); -#endif - break; - } - return NULL; - } - (void)func(cur_rr->rr, arg); - - while (cur_rr) { - next_rr = cur_rr->next; - - switch (func(cur_rr->rr, arg)) { - case LDNS_SIGNATURE_LEAVE_ADD_NEW: - prev_rr = cur_rr; - break; - case LDNS_SIGNATURE_LEAVE_NO_ADD: - keytag = ldns_rdf2native_int16( - ldns_rr_rrsig_keytag(cur_rr->rr)); - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - if (ldns_key_keytag(ldns_key_list_key(key_list, i)) == - keytag) { - ldns_key_set_use(ldns_key_list_key(key_list, i), - false); - } - } - prev_rr = cur_rr; - break; - case LDNS_SIGNATURE_REMOVE_NO_ADD: - keytag = ldns_rdf2native_int16( - ldns_rr_rrsig_keytag(cur_rr->rr)); - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - if (ldns_key_keytag(ldns_key_list_key(key_list, i)) - == keytag) { - ldns_key_set_use(ldns_key_list_key(key_list, i), - false); - } - } - if (prev_rr) { - prev_rr->next = next_rr; - } else { - base_rrs = next_rr; - } - LDNS_FREE(cur_rr); - break; - case LDNS_SIGNATURE_REMOVE_ADD_NEW: - if (prev_rr) { - prev_rr->next = next_rr; - } else { - base_rrs = next_rr; - } - LDNS_FREE(cur_rr); - break; - default: -#ifdef STDERR_MSGS - fprintf(stderr, "[XX] unknown return value from callback\n"); -#endif - break; - } - cur_rr = next_rr; - } - - return base_rrs; -} - -#ifdef HAVE_SSL -ldns_status -ldns_dnssec_zone_create_rrsigs(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void*), - void *arg) -{ - return ldns_dnssec_zone_create_rrsigs_flg(zone, new_rrs, key_list, - func, arg, 0); -} - -/** If there are KSKs use only them and mark ZSKs unused */ -static void -ldns_key_list_filter_for_dnskey(ldns_key_list *key_list, int flags) -{ - bool algos[256] -#ifndef S_SPLINT_S - = { false } -#endif - ; - ldns_signing_algorithm saw_ksk = 0; - ldns_key *key; - size_t i; - - if (!ldns_key_list_key_count(key_list)) - return; - - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - key = ldns_key_list_key(key_list, i); - if ((ldns_key_flags(key) & LDNS_KEY_SEP_KEY) && !saw_ksk) - saw_ksk = ldns_key_algorithm(key); - algos[ldns_key_algorithm(key)] = true; - } - if (!saw_ksk) - return; - else - algos[saw_ksk] = 0; - - for (i =0; i < ldns_key_list_key_count(key_list); i++) { - key = ldns_key_list_key(key_list, i); - if (!(ldns_key_flags(key) & LDNS_KEY_SEP_KEY)) { - /* We have a ZSK. - * Still use it if it has a unique algorithm though! - */ - if ((flags & LDNS_SIGN_WITH_ALL_ALGORITHMS) && - algos[ldns_key_algorithm(key)]) - algos[ldns_key_algorithm(key)] = false; - else - ldns_key_set_use(key, 0); - } - } -} - -/** If there are no ZSKs use KSK as ZSK */ -static void -ldns_key_list_filter_for_non_dnskey(ldns_key_list *key_list, int flags) -{ - bool algos[256] -#ifndef S_SPLINT_S - = { false } -#endif - ; - ldns_signing_algorithm saw_zsk = 0; - ldns_key *key; - size_t i; - - if (!ldns_key_list_key_count(key_list)) - return; - - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - key = ldns_key_list_key(key_list, i); - if (!(ldns_key_flags(key) & LDNS_KEY_SEP_KEY) && !saw_zsk) - saw_zsk = ldns_key_algorithm(key); - algos[ldns_key_algorithm(key)] = true; - } - if (!saw_zsk) - return; - else - algos[saw_zsk] = 0; - - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - key = ldns_key_list_key(key_list, i); - if((ldns_key_flags(key) & LDNS_KEY_SEP_KEY)) { - /* We have a KSK. - * Still use it if it has a unique algorithm though! - */ - if ((flags & LDNS_SIGN_WITH_ALL_ALGORITHMS) && - algos[ldns_key_algorithm(key)]) - algos[ldns_key_algorithm(key)] = false; - else - ldns_key_set_use(key, 0); - } - } -} - -ldns_status -ldns_dnssec_zone_create_rrsigs_flg( ldns_dnssec_zone *zone - , ldns_rr_list *new_rrs - , ldns_key_list *key_list - , int (*func)(ldns_rr *, void*) - , void *arg - , int flags - ) -{ - ldns_status result = LDNS_STATUS_OK; - - ldns_rbnode_t *cur_node; - ldns_rr_list *rr_list; - - ldns_dnssec_name *cur_name; - ldns_dnssec_rrsets *cur_rrset; - ldns_dnssec_rrs *cur_rr; - - ldns_rr_list *siglist; - - size_t i; - - int on_delegation_point = 0; /* handle partially occluded names */ - - ldns_rr_list *pubkey_list = ldns_rr_list_new(); - for (i = 0; i<ldns_key_list_key_count(key_list); i++) { - ldns_rr_list_push_rr( pubkey_list - , ldns_key2rr(ldns_key_list_key( - key_list, i)) - ); - } - /* TODO: callback to see is list should be signed */ - /* TODO: remove 'old' signatures from signature list */ - cur_node = ldns_rbtree_first(zone->names); - while (cur_node != LDNS_RBTREE_NULL) { - cur_name = (ldns_dnssec_name *) cur_node->data; - - if (!cur_name->is_glue) { - on_delegation_point = ldns_dnssec_rrsets_contains_type( - cur_name->rrsets, LDNS_RR_TYPE_NS) - && !ldns_dnssec_rrsets_contains_type( - cur_name->rrsets, LDNS_RR_TYPE_SOA); - cur_rrset = cur_name->rrsets; - while (cur_rrset) { - /* reset keys to use */ - ldns_key_list_set_use(key_list, true); - - /* walk through old sigs, remove the old, - and mark which keys (not) to use) */ - cur_rrset->signatures = - ldns_dnssec_remove_signatures(cur_rrset->signatures, - key_list, - func, - arg); - if(cur_rrset->type == LDNS_RR_TYPE_DNSKEY || - cur_rrset->type == LDNS_RR_TYPE_CDNSKEY || - cur_rrset->type == LDNS_RR_TYPE_CDS) { - if(!(flags&LDNS_SIGN_DNSKEY_WITH_ZSK)) { - ldns_key_list_filter_for_dnskey(key_list, flags); - } - } else { - ldns_key_list_filter_for_non_dnskey(key_list, flags); - } - - /* TODO: just set count to zero? */ - rr_list = ldns_rr_list_new(); - - cur_rr = cur_rrset->rrs; - while (cur_rr) { - ldns_rr_list_push_rr(rr_list, cur_rr->rr); - cur_rr = cur_rr->next; - } - - /* only sign non-delegation RRsets */ - /* (glue should have been marked earlier, - * except on the delegation points itself) */ - if (!on_delegation_point || - ldns_rr_list_type(rr_list) - == LDNS_RR_TYPE_DS || - ldns_rr_list_type(rr_list) - == LDNS_RR_TYPE_NSEC || - ldns_rr_list_type(rr_list) - == LDNS_RR_TYPE_NSEC3) { - siglist = ldns_sign_public(rr_list, key_list); - for (i = 0; i < ldns_rr_list_rr_count(siglist); i++) { - if (cur_rrset->signatures) { - result = ldns_dnssec_rrs_add_rr(cur_rrset->signatures, - ldns_rr_list_rr(siglist, - i)); - } else { - cur_rrset->signatures = ldns_dnssec_rrs_new(); - cur_rrset->signatures->rr = - ldns_rr_list_rr(siglist, i); - } - if (new_rrs) { - ldns_rr_list_push_rr(new_rrs, - ldns_rr_list_rr(siglist, - i)); - } - } - ldns_rr_list_free(siglist); - } - - ldns_rr_list_free(rr_list); - - cur_rrset = cur_rrset->next; - } - - /* sign the nsec */ - ldns_key_list_set_use(key_list, true); - cur_name->nsec_signatures = - ldns_dnssec_remove_signatures(cur_name->nsec_signatures, - key_list, - func, - arg); - ldns_key_list_filter_for_non_dnskey(key_list, flags); - - rr_list = ldns_rr_list_new(); - ldns_rr_list_push_rr(rr_list, cur_name->nsec); - siglist = ldns_sign_public(rr_list, key_list); - - for (i = 0; i < ldns_rr_list_rr_count(siglist); i++) { - if (cur_name->nsec_signatures) { - result = ldns_dnssec_rrs_add_rr(cur_name->nsec_signatures, - ldns_rr_list_rr(siglist, i)); - } else { - cur_name->nsec_signatures = ldns_dnssec_rrs_new(); - cur_name->nsec_signatures->rr = - ldns_rr_list_rr(siglist, i); - } - if (new_rrs) { - ldns_rr_list_push_rr(new_rrs, - ldns_rr_list_rr(siglist, i)); - } - } - - ldns_rr_list_free(siglist); - ldns_rr_list_free(rr_list); - } - cur_node = ldns_rbtree_next(cur_node); - } - - ldns_rr_list_deep_free(pubkey_list); - return result; -} - -ldns_status -ldns_dnssec_zone_sign(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg) -{ - return ldns_dnssec_zone_sign_flg(zone, new_rrs, key_list, func, arg, 0); -} - -ldns_status -ldns_dnssec_zone_sign_flg(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - int flags) -{ - ldns_status result = LDNS_STATUS_OK; - - if (!zone || !new_rrs || !key_list) { - return LDNS_STATUS_ERR; - } - - /* zone is already sorted */ - result = ldns_dnssec_zone_mark_glue(zone); - if (result != LDNS_STATUS_OK) { - return result; - } - - /* check whether we need to add nsecs */ - if (zone->names && !((ldns_dnssec_name *)zone->names->root->data)->nsec) { - result = ldns_dnssec_zone_create_nsecs(zone, new_rrs); - if (result != LDNS_STATUS_OK) { - return result; - } - } - - result = ldns_dnssec_zone_create_rrsigs_flg(zone, - new_rrs, - key_list, - func, - arg, - flags); - - return result; -} - -ldns_status -ldns_dnssec_zone_sign_nsec3(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt) -{ - return ldns_dnssec_zone_sign_nsec3_flg_mkmap(zone, new_rrs, key_list, - func, arg, algorithm, flags, iterations, salt_length, salt, 0, - NULL); -} - -ldns_status -ldns_dnssec_zone_sign_nsec3_flg_mkmap(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt, - int signflags, - ldns_rbtree_t **map) -{ - ldns_rr *nsec3, *nsec3param; - ldns_status result = LDNS_STATUS_OK; - - /* zone is already sorted */ - result = ldns_dnssec_zone_mark_glue(zone); - if (result != LDNS_STATUS_OK) { - return result; - } - - /* TODO if there are already nsec3s presents and their - * parameters are the same as these, we don't have to recreate - */ - if (zone->names) { - /* add empty nonterminals */ - result = ldns_dnssec_zone_add_empty_nonterminals(zone); - if (result != LDNS_STATUS_OK) { - return result; - } - - nsec3 = ((ldns_dnssec_name *)zone->names->root->data)->nsec; - if (nsec3 && ldns_rr_get_type(nsec3) == LDNS_RR_TYPE_NSEC3) { - /* no need to recreate */ - } else { - if (!ldns_dnssec_zone_find_rrset(zone, - zone->soa->name, - LDNS_RR_TYPE_NSEC3PARAM)) { - /* create and add the nsec3param rr */ - nsec3param = - ldns_rr_new_frm_type(LDNS_RR_TYPE_NSEC3PARAM); - ldns_rr_set_owner(nsec3param, - ldns_rdf_clone(zone->soa->name)); - ldns_nsec3_add_param_rdfs(nsec3param, - algorithm, - flags, - iterations, - salt_length, - salt); - /* always set bit 7 of the flags to zero, according to - * rfc5155 section 11. The bits are counted from right to left, - * so bit 7 in rfc5155 is bit 0 in ldns */ - ldns_set_bit(ldns_rdf_data(ldns_rr_rdf(nsec3param, 1)), 0, 0); - result = ldns_dnssec_zone_add_rr(zone, nsec3param); - if (result != LDNS_STATUS_OK) { - return result; - } - ldns_rr_list_push_rr(new_rrs, nsec3param); - } - result = ldns_dnssec_zone_create_nsec3s_mkmap(zone, - new_rrs, - algorithm, - flags, - iterations, - salt_length, - salt, - map); - if (result != LDNS_STATUS_OK) { - return result; - } - } - - result = ldns_dnssec_zone_create_rrsigs_flg(zone, - new_rrs, - key_list, - func, - arg, - signflags); - } - - return result; -} - -ldns_status -ldns_dnssec_zone_sign_nsec3_flg(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt, - int signflags) -{ - return ldns_dnssec_zone_sign_nsec3_flg_mkmap(zone, new_rrs, key_list, - func, arg, algorithm, flags, iterations, salt_length, salt, - signflags, NULL); -} - -ldns_zone * -ldns_zone_sign(const ldns_zone *zone, ldns_key_list *key_list) -{ - ldns_dnssec_zone *dnssec_zone; - ldns_zone *signed_zone; - ldns_rr_list *new_rrs; - size_t i; - - signed_zone = ldns_zone_new(); - dnssec_zone = ldns_dnssec_zone_new(); - - (void) ldns_dnssec_zone_add_rr(dnssec_zone, ldns_zone_soa(zone)); - ldns_zone_set_soa(signed_zone, ldns_rr_clone(ldns_zone_soa(zone))); - - for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(zone)); i++) { - (void) ldns_dnssec_zone_add_rr(dnssec_zone, - ldns_rr_list_rr(ldns_zone_rrs(zone), - i)); - ldns_zone_push_rr(signed_zone, - ldns_rr_clone(ldns_rr_list_rr(ldns_zone_rrs(zone), - i))); - } - - new_rrs = ldns_rr_list_new(); - (void) ldns_dnssec_zone_sign(dnssec_zone, - new_rrs, - key_list, - ldns_dnssec_default_replace_signatures, - NULL); - - for (i = 0; i < ldns_rr_list_rr_count(new_rrs); i++) { - ldns_rr_list_push_rr(ldns_zone_rrs(signed_zone), - ldns_rr_clone(ldns_rr_list_rr(new_rrs, i))); - } - - ldns_rr_list_deep_free(new_rrs); - ldns_dnssec_zone_free(dnssec_zone); - - return signed_zone; -} - -ldns_zone * -ldns_zone_sign_nsec3(ldns_zone *zone, ldns_key_list *key_list, uint8_t algorithm, uint8_t flags, uint16_t iterations, uint8_t salt_length, uint8_t *salt) -{ - ldns_dnssec_zone *dnssec_zone; - ldns_zone *signed_zone; - ldns_rr_list *new_rrs; - size_t i; - - signed_zone = ldns_zone_new(); - dnssec_zone = ldns_dnssec_zone_new(); - - (void) ldns_dnssec_zone_add_rr(dnssec_zone, ldns_zone_soa(zone)); - ldns_zone_set_soa(signed_zone, ldns_rr_clone(ldns_zone_soa(zone))); - - for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(zone)); i++) { - (void) ldns_dnssec_zone_add_rr(dnssec_zone, - ldns_rr_list_rr(ldns_zone_rrs(zone), - i)); - ldns_zone_push_rr(signed_zone, - ldns_rr_clone(ldns_rr_list_rr(ldns_zone_rrs(zone), - i))); - } - - new_rrs = ldns_rr_list_new(); - (void) ldns_dnssec_zone_sign_nsec3(dnssec_zone, - new_rrs, - key_list, - ldns_dnssec_default_replace_signatures, - NULL, - algorithm, - flags, - iterations, - salt_length, - salt); - - for (i = 0; i < ldns_rr_list_rr_count(new_rrs); i++) { - ldns_rr_list_push_rr(ldns_zone_rrs(signed_zone), - ldns_rr_clone(ldns_rr_list_rr(new_rrs, i))); - } - - ldns_rr_list_deep_free(new_rrs); - ldns_dnssec_zone_free(dnssec_zone); - - return signed_zone; -} -#endif /* HAVE_SSL */ - - diff --git a/ldns/dnssec_verify.c b/ldns/dnssec_verify.c deleted file mode 100644 index d22962e..0000000 --- a/ldns/dnssec_verify.c +++ /dev/null @@ -1,2813 +0,0 @@ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> -#include <time.h> - -#ifdef HAVE_SSL -/* this entire file is rather useless when you don't have - * crypto... - */ -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/err.h> -#include <openssl/md5.h> - -ldns_dnssec_data_chain * -ldns_dnssec_data_chain_new(void) -{ - ldns_dnssec_data_chain *nc = LDNS_CALLOC(ldns_dnssec_data_chain, 1); - if(!nc) return NULL; - /* - * not needed anymore because CALLOC initalizes everything to zero. - - nc->rrset = NULL; - nc->parent_type = 0; - nc->parent = NULL; - nc->signatures = NULL; - nc->packet_rcode = 0; - nc->packet_qtype = 0; - nc->packet_nodata = false; - - */ - return nc; -} - -void -ldns_dnssec_data_chain_free(ldns_dnssec_data_chain *chain) -{ - LDNS_FREE(chain); -} - -void -ldns_dnssec_data_chain_deep_free(ldns_dnssec_data_chain *chain) -{ - ldns_rr_list_deep_free(chain->rrset); - ldns_rr_list_deep_free(chain->signatures); - if (chain->parent) { - ldns_dnssec_data_chain_deep_free(chain->parent); - } - LDNS_FREE(chain); -} - -void -ldns_dnssec_data_chain_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_data_chain *chain) -{ - ldns_lookup_table *rcode; - const ldns_rr_descriptor *rr_descriptor; - if (chain) { - ldns_dnssec_data_chain_print_fmt(out, fmt, chain->parent); - if (ldns_rr_list_rr_count(chain->rrset) > 0) { - rcode = ldns_lookup_by_id(ldns_rcodes, - (int) chain->packet_rcode); - if (rcode) { - fprintf(out, ";; rcode: %s\n", rcode->name); - } - - rr_descriptor = ldns_rr_descript(chain->packet_qtype); - if (rr_descriptor && rr_descriptor->_name) { - fprintf(out, ";; qtype: %s\n", rr_descriptor->_name); - } else if (chain->packet_qtype != 0) { - fprintf(out, "TYPE%u", - chain->packet_qtype); - } - if (chain->packet_nodata) { - fprintf(out, ";; NODATA response\n"); - } - fprintf(out, "rrset:\n"); - ldns_rr_list_print_fmt(out, fmt, chain->rrset); - fprintf(out, "sigs:\n"); - ldns_rr_list_print_fmt(out, fmt, chain->signatures); - fprintf(out, "---\n"); - } else { - fprintf(out, "<no data>\n"); - } - } -} -void -ldns_dnssec_data_chain_print(FILE *out, const ldns_dnssec_data_chain *chain) -{ - ldns_dnssec_data_chain_print_fmt( - out, ldns_output_format_default, chain); -} - - -static void -ldns_dnssec_build_data_chain_dnskey(ldns_resolver *res, - uint16_t qflags, - const ldns_pkt *pkt, - ldns_rr_list *signatures, - ldns_dnssec_data_chain *new_chain, - ldns_rdf *key_name, - ldns_rr_class c) { - ldns_rr_list *keys; - ldns_pkt *my_pkt; - if (signatures && ldns_rr_list_rr_count(signatures) > 0) { - new_chain->signatures = ldns_rr_list_clone(signatures); - new_chain->parent_type = 0; - - keys = ldns_pkt_rr_list_by_name_and_type( - pkt, - key_name, - LDNS_RR_TYPE_DNSKEY, - LDNS_SECTION_ANY_NOQUESTION - ); - if (!keys) { - my_pkt = ldns_resolver_query(res, - key_name, - LDNS_RR_TYPE_DNSKEY, - c, - qflags); - if (my_pkt) { - keys = ldns_pkt_rr_list_by_name_and_type( - my_pkt, - key_name, - LDNS_RR_TYPE_DNSKEY, - LDNS_SECTION_ANY_NOQUESTION - ); - new_chain->parent = ldns_dnssec_build_data_chain(res, - qflags, - keys, - my_pkt, - NULL); - new_chain->parent->packet_qtype = LDNS_RR_TYPE_DNSKEY; - ldns_pkt_free(my_pkt); - } - } else { - new_chain->parent = ldns_dnssec_build_data_chain(res, - qflags, - keys, - pkt, - NULL); - new_chain->parent->packet_qtype = LDNS_RR_TYPE_DNSKEY; - } - ldns_rr_list_deep_free(keys); - } -} - -static void -ldns_dnssec_build_data_chain_other(ldns_resolver *res, - uint16_t qflags, - ldns_dnssec_data_chain *new_chain, - ldns_rdf *key_name, - ldns_rr_class c, - ldns_rr_list *dss) -{ - /* 'self-signed', parent is a DS */ - - /* okay, either we have other keys signing the current one, - * or the current - * one should have a DS record in the parent zone. - * How do we find this out? Try both? - * - * request DNSKEYS for current zone, - * add all signatures to current level - */ - ldns_pkt *my_pkt; - ldns_rr_list *signatures2; - - new_chain->parent_type = 1; - - my_pkt = ldns_resolver_query(res, - key_name, - LDNS_RR_TYPE_DS, - c, - qflags); - if (my_pkt) { - dss = ldns_pkt_rr_list_by_name_and_type(my_pkt, - key_name, - LDNS_RR_TYPE_DS, - LDNS_SECTION_ANY_NOQUESTION - ); - if (dss) { - new_chain->parent = ldns_dnssec_build_data_chain(res, - qflags, - dss, - my_pkt, - NULL); - new_chain->parent->packet_qtype = LDNS_RR_TYPE_DS; - ldns_rr_list_deep_free(dss); - } - ldns_pkt_free(my_pkt); - } - - my_pkt = ldns_resolver_query(res, - key_name, - LDNS_RR_TYPE_DNSKEY, - c, - qflags); - if (my_pkt) { - signatures2 = ldns_pkt_rr_list_by_name_and_type(my_pkt, - key_name, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANSWER); - if (signatures2) { - if (new_chain->signatures) { - printf("There were already sigs!\n"); - ldns_rr_list_deep_free(new_chain->signatures); - printf("replacing the old sigs\n"); - } - new_chain->signatures = signatures2; - } - ldns_pkt_free(my_pkt); - } -} - -static ldns_dnssec_data_chain * -ldns_dnssec_build_data_chain_nokeyname(ldns_resolver *res, - uint16_t qflags, - ldns_rr *orig_rr, - const ldns_rr_list *rrset, - ldns_dnssec_data_chain *new_chain) -{ - ldns_rdf *possible_parent_name; - ldns_pkt *my_pkt; - /* apparently we were not able to find a signing key, so - we assume the chain ends here - */ - /* try parents for auth denial of DS */ - if (orig_rr) { - possible_parent_name = ldns_rr_owner(orig_rr); - } else if (rrset && ldns_rr_list_rr_count(rrset) > 0) { - possible_parent_name = ldns_rr_owner(ldns_rr_list_rr(rrset, 0)); - } else { - /* no information to go on, give up */ - return new_chain; - } - - my_pkt = ldns_resolver_query(res, - possible_parent_name, - LDNS_RR_TYPE_DS, - LDNS_RR_CLASS_IN, - qflags); - if (!my_pkt) { - return new_chain; - } - - if (ldns_pkt_ancount(my_pkt) > 0) { - /* add error, no sigs but DS in parent */ - /*ldns_pkt_print(stdout, my_pkt);*/ - ldns_pkt_free(my_pkt); - } else { - /* are there signatures? */ - new_chain->parent = ldns_dnssec_build_data_chain(res, - qflags, - NULL, - my_pkt, - NULL); - - new_chain->parent->packet_qtype = LDNS_RR_TYPE_DS; - - } - return new_chain; -} - - -ldns_dnssec_data_chain * -ldns_dnssec_build_data_chain(ldns_resolver *res, - uint16_t qflags, - const ldns_rr_list *rrset, - const ldns_pkt *pkt, - ldns_rr *orig_rr) -{ - ldns_rr_list *signatures = NULL; - ldns_rr_list *dss = NULL; - - ldns_rr_list *my_rrset; - - ldns_pkt *my_pkt; - - ldns_rdf *name = NULL, *key_name = NULL; - ldns_rr_type type = 0; - ldns_rr_class c = 0; - - bool other_rrset = false; - - ldns_dnssec_data_chain *new_chain = ldns_dnssec_data_chain_new(); - - assert(pkt != NULL); - - if (!ldns_dnssec_pkt_has_rrsigs(pkt)) { - /* hmm. no dnssec data in the packet. go up to try and deny - * DS? */ - return new_chain; - } - - if (orig_rr) { - new_chain->rrset = ldns_rr_list_new(); - ldns_rr_list_push_rr(new_chain->rrset, orig_rr); - new_chain->parent = ldns_dnssec_build_data_chain(res, - qflags, - rrset, - pkt, - NULL); - new_chain->packet_rcode = ldns_pkt_get_rcode(pkt); - new_chain->packet_qtype = ldns_rr_get_type(orig_rr); - if (ldns_pkt_ancount(pkt) == 0) { - new_chain->packet_nodata = true; - } - return new_chain; - } - - if (!rrset || ldns_rr_list_rr_count(rrset) < 1) { - /* hmm, no data, do we have denial? only works if pkt was given, - otherwise caller has to do the check himself */ - new_chain->packet_nodata = true; - if (pkt) { - my_rrset = ldns_pkt_rr_list_by_type(pkt, - LDNS_RR_TYPE_NSEC, - LDNS_SECTION_ANY_NOQUESTION - ); - if (my_rrset) { - if (ldns_rr_list_rr_count(my_rrset) > 0) { - type = LDNS_RR_TYPE_NSEC; - other_rrset = true; - } else { - ldns_rr_list_deep_free(my_rrset); - my_rrset = NULL; - } - } else { - /* nothing, try nsec3 */ - my_rrset = ldns_pkt_rr_list_by_type(pkt, - LDNS_RR_TYPE_NSEC3, - LDNS_SECTION_ANY_NOQUESTION); - if (my_rrset) { - if (ldns_rr_list_rr_count(my_rrset) > 0) { - type = LDNS_RR_TYPE_NSEC3; - other_rrset = true; - } else { - ldns_rr_list_deep_free(my_rrset); - my_rrset = NULL; - } - } else { - /* nothing, stop */ - /* try parent zone? for denied insecure? */ - return new_chain; - } - } - } else { - return new_chain; - } - } else { - my_rrset = (ldns_rr_list *) rrset; - } - - if (my_rrset && ldns_rr_list_rr_count(my_rrset) > 0) { - new_chain->rrset = ldns_rr_list_clone(my_rrset); - name = ldns_rr_owner(ldns_rr_list_rr(my_rrset, 0)); - type = ldns_rr_get_type(ldns_rr_list_rr(my_rrset, 0)); - c = ldns_rr_get_class(ldns_rr_list_rr(my_rrset, 0)); - } - - if (other_rrset) { - ldns_rr_list_deep_free(my_rrset); - } - - /* normally there will only be 1 signature 'set' - but there can be more than 1 denial (wildcards) - so check for NSEC - */ - if (type == LDNS_RR_TYPE_NSEC || type == LDNS_RR_TYPE_NSEC3) { - /* just throw in all signatures, the tree builder must sort - this out */ - if (pkt) { - signatures = ldns_dnssec_pkt_get_rrsigs_for_type(pkt, type); - } else { - my_pkt = ldns_resolver_query(res, name, type, c, qflags); - if (my_pkt) { - signatures = ldns_dnssec_pkt_get_rrsigs_for_type(pkt, type); - ldns_pkt_free(my_pkt); - } - } - } else { - if (pkt) { - signatures = - ldns_dnssec_pkt_get_rrsigs_for_name_and_type(pkt, - name, - type); - } - if (!signatures) { - my_pkt = ldns_resolver_query(res, name, type, c, qflags); - if (my_pkt) { - signatures = - ldns_dnssec_pkt_get_rrsigs_for_name_and_type(my_pkt, - name, - type); - ldns_pkt_free(my_pkt); - } - } - } - - if (signatures && ldns_rr_list_rr_count(signatures) > 0) { - key_name = ldns_rr_rdf(ldns_rr_list_rr(signatures, 0), 7); - } - if (!key_name) { - if (signatures) { - ldns_rr_list_deep_free(signatures); - } - return ldns_dnssec_build_data_chain_nokeyname(res, - qflags, - orig_rr, - rrset, - new_chain); - } - if (type != LDNS_RR_TYPE_DNSKEY) { - if (type != LDNS_RR_TYPE_DS || - ldns_dname_is_subdomain(name, key_name)) { - ldns_dnssec_build_data_chain_dnskey(res, - qflags, - pkt, - signatures, - new_chain, - key_name, - c - ); - } - } else { - ldns_dnssec_build_data_chain_other(res, - qflags, - new_chain, - key_name, - c, - dss - ); - } - if (signatures) { - ldns_rr_list_deep_free(signatures); - } - return new_chain; -} - -ldns_dnssec_trust_tree * -ldns_dnssec_trust_tree_new(void) -{ - ldns_dnssec_trust_tree *new_tree = LDNS_XMALLOC(ldns_dnssec_trust_tree, - 1); - if(!new_tree) return NULL; - new_tree->rr = NULL; - new_tree->rrset = NULL; - new_tree->parent_count = 0; - - return new_tree; -} - -void -ldns_dnssec_trust_tree_free(ldns_dnssec_trust_tree *tree) -{ - size_t i; - if (tree) { - for (i = 0; i < tree->parent_count; i++) { - ldns_dnssec_trust_tree_free(tree->parents[i]); - } - } - LDNS_FREE(tree); -} - -size_t -ldns_dnssec_trust_tree_depth(ldns_dnssec_trust_tree *tree) -{ - size_t result = 0; - size_t parent = 0; - size_t i; - - for (i = 0; i < tree->parent_count; i++) { - parent = ldns_dnssec_trust_tree_depth(tree->parents[i]); - if (parent > result) { - result = parent; - } - } - return 1 + result; -} - -/* TODO ldns_ */ -static void -print_tabs(FILE *out, size_t nr, uint8_t *map, size_t treedepth) -{ - size_t i; - for (i = 0; i < nr; i++) { - if (i == nr - 1) { - fprintf(out, "|---"); - } else if (map && i < treedepth && map[i] == 1) { - fprintf(out, "| "); - } else { - fprintf(out, " "); - } - } -} - -static void -ldns_dnssec_trust_tree_print_sm_fmt(FILE *out, - const ldns_output_format *fmt, - ldns_dnssec_trust_tree *tree, - size_t tabs, - bool extended, - uint8_t *sibmap, - size_t treedepth) -{ - size_t i; - const ldns_rr_descriptor *descriptor; - bool mapset = false; - - if (!sibmap) { - treedepth = ldns_dnssec_trust_tree_depth(tree); - sibmap = LDNS_XMALLOC(uint8_t, treedepth); - if(!sibmap) - return; /* mem err */ - memset(sibmap, 0, treedepth); - mapset = true; - } - - if (tree) { - if (tree->rr) { - print_tabs(out, tabs, sibmap, treedepth); - ldns_rdf_print(out, ldns_rr_owner(tree->rr)); - descriptor = ldns_rr_descript(ldns_rr_get_type(tree->rr)); - - if (descriptor->_name) { - fprintf(out, " (%s", descriptor->_name); - } else { - fprintf(out, " (TYPE%d", - ldns_rr_get_type(tree->rr)); - } - if (tabs > 0) { - if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_DNSKEY) { - fprintf(out, " keytag: %u", - (unsigned int) ldns_calc_keytag(tree->rr)); - fprintf(out, " alg: "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 2)); - fprintf(out, " flags: "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0)); - } else if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_DS) { - fprintf(out, " keytag: "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0)); - fprintf(out, " digest type: "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 2)); - } - if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NSEC) { - fprintf(out, " "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 0)); - fprintf(out, " "); - ldns_rdf_print(out, ldns_rr_rdf(tree->rr, 1)); - } - } - - fprintf(out, ")\n"); - for (i = 0; i < tree->parent_count; i++) { - if (tree->parent_count > 1 && i < tree->parent_count - 1) { - sibmap[tabs] = 1; - } else { - sibmap[tabs] = 0; - } - /* only print errors */ - if (ldns_rr_get_type(tree->parents[i]->rr) == - LDNS_RR_TYPE_NSEC || - ldns_rr_get_type(tree->parents[i]->rr) == - LDNS_RR_TYPE_NSEC3) { - if (tree->parent_status[i] == LDNS_STATUS_OK) { - print_tabs(out, tabs + 1, sibmap, treedepth); - if (tabs == 0 && - ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NS && - ldns_rr_rd_count(tree->rr) > 0) { - fprintf(out, "Existence of DS is denied by:\n"); - } else { - fprintf(out, "Existence is denied by:\n"); - } - } else { - /* NS records aren't signed */ - if (ldns_rr_get_type(tree->rr) == LDNS_RR_TYPE_NS) { - fprintf(out, "Existence of DS is denied by:\n"); - } else { - print_tabs(out, tabs + 1, sibmap, treedepth); - fprintf(out, - "Error in denial of existence: %s\n", - ldns_get_errorstr_by_id( - tree->parent_status[i])); - } - } - } else - if (tree->parent_status[i] != LDNS_STATUS_OK) { - print_tabs(out, tabs + 1, sibmap, treedepth); - fprintf(out, - "%s:\n", - ldns_get_errorstr_by_id( - tree->parent_status[i])); - if (tree->parent_status[i] - == LDNS_STATUS_SSL_ERR) { - printf("; SSL Error: "); - ERR_load_crypto_strings(); - ERR_print_errors_fp(stdout); - printf("\n"); - } - ldns_rr_print_fmt(out, fmt, - tree-> - parent_signature[i]); - printf("For RRset:\n"); - ldns_rr_list_print_fmt(out, fmt, - tree->rrset); - printf("With key:\n"); - ldns_rr_print_fmt(out, fmt, - tree->parents[i]->rr); - } - ldns_dnssec_trust_tree_print_sm_fmt(out, fmt, - tree->parents[i], - tabs+1, - extended, - sibmap, - treedepth); - } - } else { - print_tabs(out, tabs, sibmap, treedepth); - fprintf(out, "<no data>\n"); - } - } else { - fprintf(out, "<null pointer>\n"); - } - - if (mapset) { - LDNS_FREE(sibmap); - } -} - -void -ldns_dnssec_trust_tree_print_fmt(FILE *out, const ldns_output_format *fmt, - ldns_dnssec_trust_tree *tree, - size_t tabs, - bool extended) -{ - ldns_dnssec_trust_tree_print_sm_fmt(out, fmt, - tree, tabs, extended, NULL, 0); -} - -void -ldns_dnssec_trust_tree_print(FILE *out, - ldns_dnssec_trust_tree *tree, - size_t tabs, - bool extended) -{ - ldns_dnssec_trust_tree_print_fmt(out, ldns_output_format_default, - tree, tabs, extended); -} - - -ldns_status -ldns_dnssec_trust_tree_add_parent(ldns_dnssec_trust_tree *tree, - const ldns_dnssec_trust_tree *parent, - const ldns_rr *signature, - const ldns_status parent_status) -{ - if (tree - && parent - && tree->parent_count < LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS) { - /* - printf("Add parent for: "); - ldns_rr_print(stdout, tree->rr); - printf("parent: "); - ldns_rr_print(stdout, parent->rr); - */ - tree->parents[tree->parent_count] = - (ldns_dnssec_trust_tree *) parent; - tree->parent_status[tree->parent_count] = parent_status; - tree->parent_signature[tree->parent_count] = (ldns_rr *) signature; - tree->parent_count++; - return LDNS_STATUS_OK; - } else { - return LDNS_STATUS_ERR; - } -} - -/* if rr is null, take the first from the rrset */ -ldns_dnssec_trust_tree * -ldns_dnssec_derive_trust_tree_time( - ldns_dnssec_data_chain *data_chain, - ldns_rr *rr, - time_t check_time - ) -{ - ldns_rr_list *cur_rrset; - ldns_rr_list *cur_sigs; - ldns_rr *cur_rr = NULL; - ldns_rr *cur_sig_rr; - size_t i, j; - - ldns_dnssec_trust_tree *new_tree = ldns_dnssec_trust_tree_new(); - if(!new_tree) - return NULL; - - if (data_chain && data_chain->rrset) { - cur_rrset = data_chain->rrset; - - cur_sigs = data_chain->signatures; - - if (rr) { - cur_rr = rr; - } - - if (!cur_rr && ldns_rr_list_rr_count(cur_rrset) > 0) { - cur_rr = ldns_rr_list_rr(cur_rrset, 0); - } - - if (cur_rr) { - new_tree->rr = cur_rr; - new_tree->rrset = cur_rrset; - /* there are three possibilities: - 1 - 'normal' rrset, signed by a key - 2 - dnskey signed by other dnskey - 3 - dnskey proven by higher level DS - (data denied by nsec is a special case that can - occur in multiple places) - - */ - if (cur_sigs) { - for (i = 0; i < ldns_rr_list_rr_count(cur_sigs); i++) { - /* find the appropriate key in the parent list */ - cur_sig_rr = ldns_rr_list_rr(cur_sigs, i); - - if (ldns_rr_get_type(cur_rr) == LDNS_RR_TYPE_NSEC) { - if (ldns_dname_compare(ldns_rr_owner(cur_sig_rr), - ldns_rr_owner(cur_rr))) - { - /* find first that does match */ - - for (j = 0; - j < ldns_rr_list_rr_count(cur_rrset) && - ldns_dname_compare(ldns_rr_owner(cur_sig_rr),ldns_rr_owner(cur_rr)) != 0; - j++) { - cur_rr = ldns_rr_list_rr(cur_rrset, j); - - } - if (ldns_dname_compare(ldns_rr_owner(cur_sig_rr), - ldns_rr_owner(cur_rr))) - { - break; - } - } - - } - /* option 1 */ - if (data_chain->parent) { - ldns_dnssec_derive_trust_tree_normal_rrset_time( - new_tree, - data_chain, - cur_sig_rr, - check_time); - } - - /* option 2 */ - ldns_dnssec_derive_trust_tree_dnskey_rrset_time( - new_tree, - data_chain, - cur_rr, - cur_sig_rr, - check_time); - } - - ldns_dnssec_derive_trust_tree_ds_rrset_time( - new_tree, data_chain, - cur_rr, check_time); - } else { - /* no signatures? maybe it's nsec data */ - - /* just add every rr from parent as new parent */ - ldns_dnssec_derive_trust_tree_no_sig_time( - new_tree, data_chain, check_time); - } - } - } - - return new_tree; -} - -ldns_dnssec_trust_tree * -ldns_dnssec_derive_trust_tree(ldns_dnssec_data_chain *data_chain, ldns_rr *rr) -{ - return ldns_dnssec_derive_trust_tree_time(data_chain, rr, ldns_time(NULL)); -} - -void -ldns_dnssec_derive_trust_tree_normal_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_sig_rr, - time_t check_time) -{ - size_t i, j; - ldns_rr_list *cur_rrset = ldns_rr_list_clone(data_chain->rrset); - ldns_dnssec_trust_tree *cur_parent_tree; - ldns_rr *cur_parent_rr; - uint16_t cur_keytag; - ldns_rr_list *tmp_rrset = NULL; - ldns_status cur_status; - - cur_keytag = ldns_rdf2native_int16(ldns_rr_rrsig_keytag(cur_sig_rr)); - - for (j = 0; j < ldns_rr_list_rr_count(data_chain->parent->rrset); j++) { - cur_parent_rr = ldns_rr_list_rr(data_chain->parent->rrset, j); - if (ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DNSKEY) { - if (ldns_calc_keytag(cur_parent_rr) == cur_keytag) { - - /* TODO: check wildcard nsec too */ - if (cur_rrset && ldns_rr_list_rr_count(cur_rrset) > 0) { - tmp_rrset = cur_rrset; - if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) - == LDNS_RR_TYPE_NSEC || - ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) - == LDNS_RR_TYPE_NSEC3) { - /* might contain different names! - sort and split */ - ldns_rr_list_sort(cur_rrset); - assert(tmp_rrset == cur_rrset); - tmp_rrset = ldns_rr_list_pop_rrset(cur_rrset); - - /* with nsecs, this might be the wrong one */ - while (tmp_rrset && - ldns_rr_list_rr_count(cur_rrset) > 0 && - ldns_dname_compare( - ldns_rr_owner(ldns_rr_list_rr( - tmp_rrset, 0)), - ldns_rr_owner(cur_sig_rr)) != 0) { - ldns_rr_list_deep_free(tmp_rrset); - tmp_rrset = - ldns_rr_list_pop_rrset(cur_rrset); - } - } - cur_status = ldns_verify_rrsig_time( - tmp_rrset, - cur_sig_rr, - cur_parent_rr, - check_time); - if (tmp_rrset && tmp_rrset != cur_rrset - ) { - ldns_rr_list_deep_free( - tmp_rrset); - tmp_rrset = NULL; - } - /* avoid dupes */ - for (i = 0; i < new_tree->parent_count; i++) { - if (cur_parent_rr == new_tree->parents[i]->rr) { - goto done; - } - } - - cur_parent_tree = - ldns_dnssec_derive_trust_tree_time( - data_chain->parent, - cur_parent_rr, - check_time); - (void)ldns_dnssec_trust_tree_add_parent(new_tree, - cur_parent_tree, - cur_sig_rr, - cur_status); - } - } - } - } - done: - ldns_rr_list_deep_free(cur_rrset); -} - -void -ldns_dnssec_derive_trust_tree_normal_rrset(ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_sig_rr) -{ - ldns_dnssec_derive_trust_tree_normal_rrset_time( - new_tree, data_chain, cur_sig_rr, ldns_time(NULL)); -} - -void -ldns_dnssec_derive_trust_tree_dnskey_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, - ldns_rr *cur_sig_rr, - time_t check_time) -{ - size_t j; - ldns_rr_list *cur_rrset = data_chain->rrset; - ldns_dnssec_trust_tree *cur_parent_tree; - ldns_rr *cur_parent_rr; - uint16_t cur_keytag; - ldns_status cur_status; - - cur_keytag = ldns_rdf2native_int16(ldns_rr_rrsig_keytag(cur_sig_rr)); - - for (j = 0; j < ldns_rr_list_rr_count(cur_rrset); j++) { - cur_parent_rr = ldns_rr_list_rr(cur_rrset, j); - if (cur_parent_rr != cur_rr && - ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DNSKEY) { - if (ldns_calc_keytag(cur_parent_rr) == cur_keytag - ) { - cur_parent_tree = ldns_dnssec_trust_tree_new(); - cur_parent_tree->rr = cur_parent_rr; - cur_parent_tree->rrset = cur_rrset; - cur_status = ldns_verify_rrsig_time( - cur_rrset, cur_sig_rr, - cur_parent_rr, check_time); - if (ldns_dnssec_trust_tree_add_parent(new_tree, - cur_parent_tree, cur_sig_rr, cur_status)) - ldns_dnssec_trust_tree_free(cur_parent_tree); - } - } - } -} - -void -ldns_dnssec_derive_trust_tree_dnskey_rrset(ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, - ldns_rr *cur_sig_rr) -{ - ldns_dnssec_derive_trust_tree_dnskey_rrset_time( - new_tree, data_chain, cur_rr, cur_sig_rr, ldns_time(NULL)); -} - -void -ldns_dnssec_derive_trust_tree_ds_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, - time_t check_time) -{ - size_t j, h; - ldns_rr_list *cur_rrset = data_chain->rrset; - ldns_dnssec_trust_tree *cur_parent_tree; - ldns_rr *cur_parent_rr; - - /* try the parent to see whether there are DSs there */ - if (ldns_rr_get_type(cur_rr) == LDNS_RR_TYPE_DNSKEY && - data_chain->parent && - data_chain->parent->rrset - ) { - for (j = 0; - j < ldns_rr_list_rr_count(data_chain->parent->rrset); - j++) { - cur_parent_rr = ldns_rr_list_rr(data_chain->parent->rrset, j); - if (ldns_rr_get_type(cur_parent_rr) == LDNS_RR_TYPE_DS) { - for (h = 0; h < ldns_rr_list_rr_count(cur_rrset); h++) { - cur_rr = ldns_rr_list_rr(cur_rrset, h); - if (ldns_rr_compare_ds(cur_rr, cur_parent_rr)) { - cur_parent_tree = - ldns_dnssec_derive_trust_tree_time( - data_chain->parent, - cur_parent_rr, - check_time); - (void) ldns_dnssec_trust_tree_add_parent( - new_tree, - cur_parent_tree, - NULL, - LDNS_STATUS_OK); - } else { - /*ldns_rr_print(stdout, cur_parent_rr);*/ - } - } - } - } - } -} - -void -ldns_dnssec_derive_trust_tree_ds_rrset(ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr) -{ - ldns_dnssec_derive_trust_tree_ds_rrset_time( - new_tree, data_chain, cur_rr, ldns_time(NULL)); -} - -void -ldns_dnssec_derive_trust_tree_no_sig_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - time_t check_time) -{ - size_t i; - ldns_rr_list *cur_rrset; - ldns_rr *cur_parent_rr; - ldns_dnssec_trust_tree *cur_parent_tree; - ldns_status result; - - if (data_chain->parent && data_chain->parent->rrset) { - cur_rrset = data_chain->parent->rrset; - /* nsec? */ - if (cur_rrset && ldns_rr_list_rr_count(cur_rrset) > 0) { - if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) == - LDNS_RR_TYPE_NSEC3) { - result = ldns_dnssec_verify_denial_nsec3( - new_tree->rr, - cur_rrset, - data_chain->parent->signatures, - data_chain->packet_rcode, - data_chain->packet_qtype, - data_chain->packet_nodata); - } else if (ldns_rr_get_type(ldns_rr_list_rr(cur_rrset, 0)) == - LDNS_RR_TYPE_NSEC) { - result = ldns_dnssec_verify_denial( - new_tree->rr, - cur_rrset, - data_chain->parent->signatures); - } else { - /* unsigned zone, unsigned parent */ - result = LDNS_STATUS_OK; - } - } else { - result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - } - for (i = 0; i < ldns_rr_list_rr_count(cur_rrset); i++) { - cur_parent_rr = ldns_rr_list_rr(cur_rrset, i); - cur_parent_tree = - ldns_dnssec_derive_trust_tree_time( - data_chain->parent, - cur_parent_rr, - check_time); - if (ldns_dnssec_trust_tree_add_parent(new_tree, - cur_parent_tree, NULL, result)) - ldns_dnssec_trust_tree_free(cur_parent_tree); - - } - } -} - -void -ldns_dnssec_derive_trust_tree_no_sig(ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain) -{ - ldns_dnssec_derive_trust_tree_no_sig_time( - new_tree, data_chain, ldns_time(NULL)); -} - -/* - * returns OK if there is a path from tree to key with only OK - * the (first) error in between otherwise - * or NOT_FOUND if the key wasn't present at all - */ -ldns_status -ldns_dnssec_trust_tree_contains_keys(ldns_dnssec_trust_tree *tree, - ldns_rr_list *trusted_keys) -{ - size_t i; - ldns_status result = LDNS_STATUS_CRYPTO_NO_DNSKEY; - bool equal; - ldns_status parent_result; - - if (tree && trusted_keys && ldns_rr_list_rr_count(trusted_keys) > 0) - { if (tree->rr) { - for (i = 0; i < ldns_rr_list_rr_count(trusted_keys); i++) { - equal = ldns_rr_compare_ds( - tree->rr, - ldns_rr_list_rr(trusted_keys, i)); - if (equal) { - result = LDNS_STATUS_OK; - return result; - } - } - } - for (i = 0; i < tree->parent_count; i++) { - parent_result = - ldns_dnssec_trust_tree_contains_keys(tree->parents[i], - trusted_keys); - if (parent_result != LDNS_STATUS_CRYPTO_NO_DNSKEY) { - if (tree->parent_status[i] != LDNS_STATUS_OK) { - result = tree->parent_status[i]; - } else { - if (tree->rr && - ldns_rr_get_type(tree->rr) - == LDNS_RR_TYPE_NSEC && - parent_result == LDNS_STATUS_OK - ) { - result = - LDNS_STATUS_DNSSEC_EXISTENCE_DENIED; - } else { - result = parent_result; - } - } - } - } - } else { - result = LDNS_STATUS_ERR; - } - - return result; -} - -ldns_status -ldns_verify_time( - const ldns_rr_list *rrset, - const ldns_rr_list *rrsig, - const ldns_rr_list *keys, - time_t check_time, - ldns_rr_list *good_keys - ) -{ - uint16_t i; - ldns_status verify_result = LDNS_STATUS_ERR; - - if (!rrset || !rrsig || !keys) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrset) < 1) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrsig) < 1) { - return LDNS_STATUS_CRYPTO_NO_RRSIG; - } - - if (ldns_rr_list_rr_count(keys) < 1) { - verify_result = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY; - } else { - for (i = 0; i < ldns_rr_list_rr_count(rrsig); i++) { - ldns_status s = ldns_verify_rrsig_keylist_time( - rrset, ldns_rr_list_rr(rrsig, i), - keys, check_time, good_keys); - /* try a little to get more descriptive error */ - if(s == LDNS_STATUS_OK) { - verify_result = LDNS_STATUS_OK; - } else if(verify_result == LDNS_STATUS_ERR) - verify_result = s; - else if(s != LDNS_STATUS_ERR && verify_result == - LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY) - verify_result = s; - } - } - return verify_result; -} - -ldns_status -ldns_verify(ldns_rr_list *rrset, ldns_rr_list *rrsig, const ldns_rr_list *keys, - ldns_rr_list *good_keys) -{ - return ldns_verify_time(rrset, rrsig, keys, ldns_time(NULL), good_keys); -} - -ldns_status -ldns_verify_notime(ldns_rr_list *rrset, ldns_rr_list *rrsig, - const ldns_rr_list *keys, ldns_rr_list *good_keys) -{ - uint16_t i; - ldns_status verify_result = LDNS_STATUS_ERR; - - if (!rrset || !rrsig || !keys) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrset) < 1) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrsig) < 1) { - return LDNS_STATUS_CRYPTO_NO_RRSIG; - } - - if (ldns_rr_list_rr_count(keys) < 1) { - verify_result = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY; - } else { - for (i = 0; i < ldns_rr_list_rr_count(rrsig); i++) { - ldns_status s = ldns_verify_rrsig_keylist_notime(rrset, - ldns_rr_list_rr(rrsig, i), keys, good_keys); - - /* try a little to get more descriptive error */ - if (s == LDNS_STATUS_OK) { - verify_result = LDNS_STATUS_OK; - } else if (verify_result == LDNS_STATUS_ERR) { - verify_result = s; - } else if (s != LDNS_STATUS_ERR && verify_result == - LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY) { - verify_result = s; - } - } - } - return verify_result; -} - -ldns_rr_list * -ldns_fetch_valid_domain_keys_time(const ldns_resolver *res, - const ldns_rdf *domain, - const ldns_rr_list *keys, - time_t check_time, - ldns_status *status) -{ - ldns_rr_list * trusted_keys = NULL; - ldns_rr_list * ds_keys = NULL; - ldns_rdf * prev_parent_domain; - ldns_rdf * parent_domain; - ldns_rr_list * parent_keys = NULL; - - if (res && domain && keys) { - - if ((trusted_keys = ldns_validate_domain_dnskey_time(res, - domain, keys, check_time))) { - *status = LDNS_STATUS_OK; - } else { - /* No trusted keys in this domain, we'll have to find some in the parent domain */ - *status = LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY; - - parent_domain = ldns_dname_left_chop(domain); - while (parent_domain && /* Fail if we are at the root*/ - ldns_rdf_size(parent_domain) > 0) { - - if ((parent_keys = - ldns_fetch_valid_domain_keys_time(res, - parent_domain, - keys, - check_time, - status))) { - /* Check DS records */ - if ((ds_keys = - ldns_validate_domain_ds_time(res, - domain, - parent_keys, - check_time))) { - trusted_keys = - ldns_fetch_valid_domain_keys_time( - res, - domain, - ds_keys, - check_time, - status); - ldns_rr_list_deep_free(ds_keys); - } else { - /* No valid DS at the parent -- fail */ - *status = LDNS_STATUS_CRYPTO_NO_TRUSTED_DS ; - } - ldns_rr_list_deep_free(parent_keys); - break; - } else { - parent_domain = ldns_dname_left_chop(( - prev_parent_domain - = parent_domain - )); - ldns_rdf_deep_free(prev_parent_domain); - } - } - if (parent_domain) { - ldns_rdf_deep_free(parent_domain); - } - } - } - return trusted_keys; -} - -ldns_rr_list * -ldns_fetch_valid_domain_keys(const ldns_resolver *res, - const ldns_rdf *domain, - const ldns_rr_list *keys, - ldns_status *status) -{ - return ldns_fetch_valid_domain_keys_time( - res, domain, keys, ldns_time(NULL), status); -} - -ldns_rr_list * -ldns_validate_domain_dnskey_time( - const ldns_resolver * res, - const ldns_rdf * domain, - const ldns_rr_list * keys, - time_t check_time - ) -{ - ldns_pkt * keypkt; - ldns_rr * cur_key; - uint16_t key_i; uint16_t key_j; uint16_t key_k; - uint16_t sig_i; ldns_rr * cur_sig; - - ldns_rr_list * domain_keys = NULL; - ldns_rr_list * domain_sigs = NULL; - ldns_rr_list * trusted_keys = NULL; - - /* Fetch keys for the domain */ - keypkt = ldns_resolver_query(res, domain, - LDNS_RR_TYPE_DNSKEY, LDNS_RR_CLASS_IN, LDNS_RD); - if (keypkt) { - domain_keys = ldns_pkt_rr_list_by_type(keypkt, - LDNS_RR_TYPE_DNSKEY, - LDNS_SECTION_ANSWER); - domain_sigs = ldns_pkt_rr_list_by_type(keypkt, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANSWER); - - /* Try to validate the record using our keys */ - for (key_i=0; key_i< ldns_rr_list_rr_count(domain_keys); key_i++) { - - cur_key = ldns_rr_list_rr(domain_keys, key_i); - for (key_j=0; key_j<ldns_rr_list_rr_count(keys); key_j++) { - if (ldns_rr_compare_ds(ldns_rr_list_rr(keys, key_j), - cur_key)) { - - /* Current key is trusted -- validate */ - trusted_keys = ldns_rr_list_new(); - - for (sig_i=0; - sig_i<ldns_rr_list_rr_count(domain_sigs); - sig_i++) { - cur_sig = ldns_rr_list_rr(domain_sigs, sig_i); - /* Avoid non-matching sigs */ - if (ldns_rdf2native_int16( - ldns_rr_rrsig_keytag(cur_sig)) - == ldns_calc_keytag(cur_key)) { - if (ldns_verify_rrsig_time( - domain_keys, - cur_sig, - cur_key, - check_time) - == LDNS_STATUS_OK) { - - /* Push the whole rrset - -- we can't do much more */ - for (key_k=0; - key_k<ldns_rr_list_rr_count( - domain_keys); - key_k++) { - ldns_rr_list_push_rr( - trusted_keys, - ldns_rr_clone( - ldns_rr_list_rr( - domain_keys, - key_k))); - } - - ldns_rr_list_deep_free(domain_keys); - ldns_rr_list_deep_free(domain_sigs); - ldns_pkt_free(keypkt); - return trusted_keys; - } - } - } - - /* Only push our trusted key */ - ldns_rr_list_push_rr(trusted_keys, - ldns_rr_clone(cur_key)); - } - } - } - - ldns_rr_list_deep_free(domain_keys); - ldns_rr_list_deep_free(domain_sigs); - ldns_pkt_free(keypkt); - - } else { - /* LDNS_STATUS_CRYPTO_NO_DNSKEY */ - } - - return trusted_keys; -} - -ldns_rr_list * -ldns_validate_domain_dnskey(const ldns_resolver * res, - const ldns_rdf * domain, - const ldns_rr_list * keys) -{ - return ldns_validate_domain_dnskey_time( - res, domain, keys, ldns_time(NULL)); -} - -ldns_rr_list * -ldns_validate_domain_ds_time( - const ldns_resolver *res, - const ldns_rdf * domain, - const ldns_rr_list * keys, - time_t check_time) -{ - ldns_pkt * dspkt; - uint16_t key_i; - ldns_rr_list * rrset = NULL; - ldns_rr_list * sigs = NULL; - ldns_rr_list * trusted_keys = NULL; - - /* Fetch DS for the domain */ - dspkt = ldns_resolver_query(res, domain, - LDNS_RR_TYPE_DS, LDNS_RR_CLASS_IN, LDNS_RD); - if (dspkt) { - rrset = ldns_pkt_rr_list_by_type(dspkt, - LDNS_RR_TYPE_DS, - LDNS_SECTION_ANSWER); - sigs = ldns_pkt_rr_list_by_type(dspkt, - LDNS_RR_TYPE_RRSIG, - LDNS_SECTION_ANSWER); - - /* Validate sigs */ - if (ldns_verify_time(rrset, sigs, keys, check_time, NULL) - == LDNS_STATUS_OK) { - trusted_keys = ldns_rr_list_new(); - for (key_i=0; key_i<ldns_rr_list_rr_count(rrset); key_i++) { - ldns_rr_list_push_rr(trusted_keys, - ldns_rr_clone(ldns_rr_list_rr(rrset, - key_i) - ) - ); - } - } - - ldns_rr_list_deep_free(rrset); - ldns_rr_list_deep_free(sigs); - ldns_pkt_free(dspkt); - - } else { - /* LDNS_STATUS_CRYPTO_NO_DS */ - } - - return trusted_keys; -} - -ldns_rr_list * -ldns_validate_domain_ds(const ldns_resolver *res, - const ldns_rdf * domain, - const ldns_rr_list * keys) -{ - return ldns_validate_domain_ds_time(res, domain, keys, ldns_time(NULL)); -} - -ldns_status -ldns_verify_trusted_time( - ldns_resolver *res, - ldns_rr_list *rrset, - ldns_rr_list * rrsigs, - time_t check_time, - ldns_rr_list * validating_keys - ) -{ - uint16_t sig_i; uint16_t key_i; - ldns_rr * cur_sig; ldns_rr * cur_key; - ldns_rr_list * trusted_keys = NULL; - ldns_status result = LDNS_STATUS_ERR; - - if (!res || !rrset || !rrsigs) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrset) < 1) { - return LDNS_STATUS_ERR; - } - - if (ldns_rr_list_rr_count(rrsigs) < 1) { - return LDNS_STATUS_CRYPTO_NO_RRSIG; - } - - /* Look at each sig */ - for (sig_i=0; sig_i < ldns_rr_list_rr_count(rrsigs); sig_i++) { - - cur_sig = ldns_rr_list_rr(rrsigs, sig_i); - /* Get a valid signer key and validate the sig */ - if ((trusted_keys = ldns_fetch_valid_domain_keys_time( - res, - ldns_rr_rrsig_signame(cur_sig), - ldns_resolver_dnssec_anchors(res), - check_time, - &result))) { - - for (key_i = 0; - key_i < ldns_rr_list_rr_count(trusted_keys); - key_i++) { - cur_key = ldns_rr_list_rr(trusted_keys, key_i); - - if ((result = ldns_verify_rrsig_time(rrset, - cur_sig, - cur_key, - check_time)) - == LDNS_STATUS_OK) { - if (validating_keys) { - ldns_rr_list_push_rr(validating_keys, - ldns_rr_clone(cur_key)); - } - ldns_rr_list_deep_free(trusted_keys); - return LDNS_STATUS_OK; - } - } - } - } - - ldns_rr_list_deep_free(trusted_keys); - return result; -} - -ldns_status -ldns_verify_trusted( - ldns_resolver *res, - ldns_rr_list *rrset, - ldns_rr_list * rrsigs, - ldns_rr_list * validating_keys) -{ - return ldns_verify_trusted_time( - res, rrset, rrsigs, ldns_time(NULL), validating_keys); -} - - -ldns_status -ldns_dnssec_verify_denial(ldns_rr *rr, - ldns_rr_list *nsecs, - ldns_rr_list *rrsigs) -{ - ldns_rdf *rr_name; - ldns_rdf *wildcard_name; - ldns_rdf *chopped_dname; - ldns_rr *cur_nsec; - size_t i; - ldns_status result; - /* needed for wildcard check on exact match */ - ldns_rr *rrsig; - bool name_covered = false; - bool type_covered = false; - bool wildcard_covered = false; - bool wildcard_type_covered = false; - - wildcard_name = ldns_dname_new_frm_str("*"); - rr_name = ldns_rr_owner(rr); - chopped_dname = ldns_dname_left_chop(rr_name); - result = ldns_dname_cat(wildcard_name, chopped_dname); - ldns_rdf_deep_free(chopped_dname); - if (result != LDNS_STATUS_OK) { - return result; - } - - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - cur_nsec = ldns_rr_list_rr(nsecs, i); - if (ldns_dname_compare(rr_name, ldns_rr_owner(cur_nsec)) == 0) { - /* see section 5.4 of RFC4035, if the label count of the NSEC's - RRSIG is equal, then it is proven that wildcard expansion - could not have been used to match the request */ - rrsig = ldns_dnssec_get_rrsig_for_name_and_type( - ldns_rr_owner(cur_nsec), - ldns_rr_get_type(cur_nsec), - rrsigs); - if (rrsig && ldns_rdf2native_int8(ldns_rr_rrsig_labels(rrsig)) - == ldns_dname_label_count(rr_name)) { - wildcard_covered = true; - } - - if (ldns_nsec_bitmap_covers_type(ldns_nsec_get_bitmap(cur_nsec), - ldns_rr_get_type(rr))) { - type_covered = true; - } - } - if (ldns_nsec_covers_name(cur_nsec, rr_name)) { - name_covered = true; - } - - if (ldns_dname_compare(wildcard_name, - ldns_rr_owner(cur_nsec)) == 0) { - if (ldns_nsec_bitmap_covers_type(ldns_nsec_get_bitmap(cur_nsec), - ldns_rr_get_type(rr))) { - wildcard_type_covered = true; - } - } - - if (ldns_nsec_covers_name(cur_nsec, wildcard_name)) { - wildcard_covered = true; - } - - } - - ldns_rdf_deep_free(wildcard_name); - - if (type_covered || !name_covered) { - return LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - } - - if (wildcard_type_covered || !wildcard_covered) { - return LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED; - } - - return LDNS_STATUS_OK; -} - -ldns_status -ldns_dnssec_verify_denial_nsec3_match( ldns_rr *rr - , ldns_rr_list *nsecs - , ATTR_UNUSED(ldns_rr_list *rrsigs) - , ldns_pkt_rcode packet_rcode - , ldns_rr_type packet_qtype - , bool packet_nodata - , ldns_rr **match - ) -{ - ldns_rdf *closest_encloser; - ldns_rdf *wildcard; - ldns_rdf *hashed_wildcard_name; - bool wildcard_covered = false; - ldns_rdf *zone_name; - ldns_rdf *hashed_name; - ldns_rdf *hashed_next_closer; - size_t i; - ldns_status result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - - if (match) { - *match = NULL; - } - - zone_name = ldns_dname_left_chop(ldns_rr_owner(ldns_rr_list_rr(nsecs,0))); - - /* section 8.4 */ - if (packet_rcode == LDNS_RCODE_NXDOMAIN) { - closest_encloser = ldns_dnssec_nsec3_closest_encloser( - ldns_rr_owner(rr), - ldns_rr_get_type(rr), - nsecs); - if(!closest_encloser) { - result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - goto done; - } - - wildcard = ldns_dname_new_frm_str("*"); - (void) ldns_dname_cat(wildcard, closest_encloser); - - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - hashed_wildcard_name = - ldns_nsec3_hash_name_frm_nsec3(ldns_rr_list_rr(nsecs, 0), - wildcard - ); - (void) ldns_dname_cat(hashed_wildcard_name, zone_name); - - if (ldns_nsec_covers_name(ldns_rr_list_rr(nsecs, i), - hashed_wildcard_name)) { - wildcard_covered = true; - if (match) { - *match = ldns_rr_list_rr(nsecs, i); - } - } - ldns_rdf_deep_free(hashed_wildcard_name); - } - - if (! wildcard_covered) { - result = LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED; - } else { - result = LDNS_STATUS_OK; - } - ldns_rdf_deep_free(closest_encloser); - ldns_rdf_deep_free(wildcard); - - } else if (packet_nodata && packet_qtype != LDNS_RR_TYPE_DS) { - /* section 8.5 */ - hashed_name = ldns_nsec3_hash_name_frm_nsec3( - ldns_rr_list_rr(nsecs, 0), - ldns_rr_owner(rr)); - (void) ldns_dname_cat(hashed_name, zone_name); - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - if (ldns_dname_compare(hashed_name, - ldns_rr_owner(ldns_rr_list_rr(nsecs, i))) - == 0) { - if (!ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - packet_qtype) - && - !ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - LDNS_RR_TYPE_CNAME)) { - result = LDNS_STATUS_OK; - if (match) { - *match = ldns_rr_list_rr(nsecs, i); - } - goto done; - } - } - } - ldns_rdf_deep_free(hashed_name); - result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - /* wildcard no data? section 8.7 */ - closest_encloser = ldns_dnssec_nsec3_closest_encloser( - ldns_rr_owner(rr), - ldns_rr_get_type(rr), - nsecs); - if(!closest_encloser) { - result = LDNS_STATUS_NSEC3_ERR; - goto done; - } - wildcard = ldns_dname_new_frm_str("*"); - (void) ldns_dname_cat(wildcard, closest_encloser); - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - hashed_wildcard_name = - ldns_nsec3_hash_name_frm_nsec3(ldns_rr_list_rr(nsecs, 0), - wildcard); - (void) ldns_dname_cat(hashed_wildcard_name, zone_name); - - if (ldns_dname_compare(hashed_wildcard_name, - ldns_rr_owner(ldns_rr_list_rr(nsecs, i))) - == 0) { - if (!ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - packet_qtype) - && - !ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - LDNS_RR_TYPE_CNAME)) { - result = LDNS_STATUS_OK; - if (match) { - *match = ldns_rr_list_rr(nsecs, i); - } - } - } - ldns_rdf_deep_free(hashed_wildcard_name); - if (result == LDNS_STATUS_OK) { - break; - } - } - ldns_rdf_deep_free(closest_encloser); - ldns_rdf_deep_free(wildcard); - } else if (packet_nodata && packet_qtype == LDNS_RR_TYPE_DS) { - /* section 8.6 */ - /* note: up to XXX this is the same as for 8.5 */ - hashed_name = ldns_nsec3_hash_name_frm_nsec3(ldns_rr_list_rr(nsecs, - 0), - ldns_rr_owner(rr) - ); - (void) ldns_dname_cat(hashed_name, zone_name); - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - if (ldns_dname_compare(hashed_name, - ldns_rr_owner(ldns_rr_list_rr(nsecs, - i))) - == 0) { - if (!ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - LDNS_RR_TYPE_DS) - && - !ldns_nsec_bitmap_covers_type( - ldns_nsec3_bitmap(ldns_rr_list_rr(nsecs, i)), - LDNS_RR_TYPE_CNAME)) { - result = LDNS_STATUS_OK; - if (match) { - *match = ldns_rr_list_rr(nsecs, i); - } - goto done; - } - } - } - - /* XXX see note above */ - result = LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED; - - closest_encloser = ldns_dnssec_nsec3_closest_encloser( - ldns_rr_owner(rr), - ldns_rr_get_type(rr), - nsecs); - if(!closest_encloser) { - result = LDNS_STATUS_NSEC3_ERR; - goto done; - } - /* Now check if we have a Opt-Out NSEC3 that covers the "next closer"*/ - - if (ldns_dname_label_count(closest_encloser) + 1 - >= ldns_dname_label_count(ldns_rr_owner(rr))) { - - /* Query name *is* the "next closer". */ - hashed_next_closer = hashed_name; - } else { - ldns_rdf *next_closer; - - ldns_rdf_deep_free(hashed_name); - /* "next closer" has less labels than the query name. - * Create the name and hash it. - */ - next_closer = ldns_dname_clone_from( - ldns_rr_owner(rr), - ldns_dname_label_count(ldns_rr_owner(rr)) - - (ldns_dname_label_count(closest_encloser) + 1) - ); - hashed_next_closer = ldns_nsec3_hash_name_frm_nsec3( - ldns_rr_list_rr(nsecs, 0), - next_closer - ); - (void) ldns_dname_cat(hashed_next_closer, zone_name); - ldns_rdf_deep_free(next_closer); - } - /* Find the NSEC3 that covers the "next closer" */ - for (i = 0; i < ldns_rr_list_rr_count(nsecs); i++) { - if (ldns_nsec_covers_name(ldns_rr_list_rr(nsecs, i), - hashed_next_closer) && - ldns_nsec3_optout(ldns_rr_list_rr(nsecs, i))) { - - result = LDNS_STATUS_OK; - if (match) { - *match = ldns_rr_list_rr(nsecs, i); - } - break; - } - } - ldns_rdf_deep_free(hashed_next_closer); - ldns_rdf_deep_free(closest_encloser); - } - - done: - ldns_rdf_deep_free(zone_name); - return result; -} - -ldns_status -ldns_dnssec_verify_denial_nsec3(ldns_rr *rr, - ldns_rr_list *nsecs, - ldns_rr_list *rrsigs, - ldns_pkt_rcode packet_rcode, - ldns_rr_type packet_qtype, - bool packet_nodata) -{ - return ldns_dnssec_verify_denial_nsec3_match( - rr, nsecs, rrsigs, packet_rcode, - packet_qtype, packet_nodata, NULL - ); -} - -#ifdef USE_GOST -EVP_PKEY* -ldns_gost2pkey_raw(const unsigned char* key, size_t keylen) -{ - /* prefix header for X509 encoding */ - uint8_t asn[37] = { 0x30, 0x63, 0x30, 0x1c, 0x06, 0x06, 0x2a, 0x85, - 0x03, 0x02, 0x02, 0x13, 0x30, 0x12, 0x06, 0x07, 0x2a, 0x85, - 0x03, 0x02, 0x02, 0x23, 0x01, 0x06, 0x07, 0x2a, 0x85, 0x03, - 0x02, 0x02, 0x1e, 0x01, 0x03, 0x43, 0x00, 0x04, 0x40}; - unsigned char encoded[37+64]; - const unsigned char* pp; - if(keylen != 64) { - /* key wrong size */ - return NULL; - } - - /* create evp_key */ - memmove(encoded, asn, 37); - memmove(encoded+37, key, 64); - pp = (unsigned char*)&encoded[0]; - - return d2i_PUBKEY(NULL, &pp, (int)sizeof(encoded)); -} - -static ldns_status -ldns_verify_rrsig_gost_raw(const unsigned char* sig, size_t siglen, - const ldns_buffer* rrset, const unsigned char* key, size_t keylen) -{ - EVP_PKEY *evp_key; - ldns_status result; - - (void) ldns_key_EVP_load_gost_id(); - evp_key = ldns_gost2pkey_raw(key, keylen); - if(!evp_key) { - /* could not convert key */ - return LDNS_STATUS_CRYPTO_BOGUS; - } - - /* verify signature */ - result = ldns_verify_rrsig_evp_raw(sig, siglen, rrset, - evp_key, EVP_get_digestbyname("md_gost94")); - EVP_PKEY_free(evp_key); - - return result; -} -#endif - -#ifdef USE_ED25519 -EVP_PKEY* -ldns_ed255192pkey_raw(const unsigned char* key, size_t keylen) -{ - /* ASN1 for ED25519 is 302a300506032b6570032100 <32byteskey> */ - uint8_t pre[] = {0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, - 0x70, 0x03, 0x21, 0x00}; - int pre_len = 12; - uint8_t buf[256]; - EVP_PKEY *evp_key; - /* pp gets modified by d2i() */ - const unsigned char* pp = (unsigned char*)buf; - if(keylen != 32 || keylen + pre_len > sizeof(buf)) - return NULL; /* wrong length */ - memmove(buf, pre, pre_len); - memmove(buf+pre_len, key, keylen); - evp_key = d2i_PUBKEY(NULL, &pp, (int)(pre_len+keylen)); - return evp_key; -} - -static ldns_status -ldns_verify_rrsig_ed25519_raw(unsigned char* sig, size_t siglen, - ldns_buffer* rrset, unsigned char* key, size_t keylen) -{ - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = ldns_ed255192pkey_raw(key, keylen); - if(!evp_key) { - /* could not convert key */ - return LDNS_STATUS_CRYPTO_BOGUS; - } - result = ldns_verify_rrsig_evp_raw(sig, siglen, rrset, evp_key, NULL); - EVP_PKEY_free(evp_key); - return result; -} -#endif /* USE_ED25519 */ - -#ifdef USE_ED448 -EVP_PKEY* -ldns_ed4482pkey_raw(const unsigned char* key, size_t keylen) -{ - /* ASN1 for ED448 is 3043300506032b6571033a00 <57byteskey> */ - uint8_t pre[] = {0x30, 0x43, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, - 0x71, 0x03, 0x3a, 0x00}; - int pre_len = 12; - uint8_t buf[256]; - EVP_PKEY *evp_key; - /* pp gets modified by d2i() */ - const unsigned char* pp = (unsigned char*)buf; - if(keylen != 57 || keylen + pre_len > sizeof(buf)) - return NULL; /* wrong length */ - memmove(buf, pre, pre_len); - memmove(buf+pre_len, key, keylen); - evp_key = d2i_PUBKEY(NULL, &pp, (int)(pre_len+keylen)); - return evp_key; -} - -static ldns_status -ldns_verify_rrsig_ed448_raw(unsigned char* sig, size_t siglen, - ldns_buffer* rrset, unsigned char* key, size_t keylen) -{ - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = ldns_ed4482pkey_raw(key, keylen); - if(!evp_key) { - /* could not convert key */ - return LDNS_STATUS_CRYPTO_BOGUS; - } - result = ldns_verify_rrsig_evp_raw(sig, siglen, rrset, evp_key, NULL); - EVP_PKEY_free(evp_key); - return result; -} -#endif /* USE_ED448 */ - -#ifdef USE_ECDSA -EVP_PKEY* -ldns_ecdsa2pkey_raw(const unsigned char* key, size_t keylen, uint8_t algo) -{ - unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */ - const unsigned char* pp = buf; - EVP_PKEY *evp_key; - EC_KEY *ec; - /* check length, which uncompressed must be 2 bignums */ - if(algo == LDNS_ECDSAP256SHA256) { - if(keylen != 2*256/8) return NULL; - ec = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - } else if(algo == LDNS_ECDSAP384SHA384) { - if(keylen != 2*384/8) return NULL; - ec = EC_KEY_new_by_curve_name(NID_secp384r1); - } else ec = NULL; - if(!ec) return NULL; - if(keylen+1 > sizeof(buf)) - return NULL; /* sanity check */ - /* prepend the 0x02 (from docs) (or actually 0x04 from implementation - * of openssl) for uncompressed data */ - buf[0] = POINT_CONVERSION_UNCOMPRESSED; - memmove(buf+1, key, keylen); - if(!o2i_ECPublicKey(&ec, &pp, (int)keylen+1)) { - EC_KEY_free(ec); - return NULL; - } - evp_key = EVP_PKEY_new(); - if(!evp_key) { - EC_KEY_free(ec); - return NULL; - } - if (!EVP_PKEY_assign_EC_KEY(evp_key, ec)) { - EVP_PKEY_free(evp_key); - EC_KEY_free(ec); - return NULL; - } - return evp_key; -} - -static ldns_status -ldns_verify_rrsig_ecdsa_raw(unsigned char* sig, size_t siglen, - ldns_buffer* rrset, unsigned char* key, size_t keylen, uint8_t algo) -{ - EVP_PKEY *evp_key; - ldns_status result; - const EVP_MD *d; - - evp_key = ldns_ecdsa2pkey_raw(key, keylen, algo); - if(!evp_key) { - /* could not convert key */ - return LDNS_STATUS_CRYPTO_BOGUS; - } - if(algo == LDNS_ECDSAP256SHA256) - d = EVP_sha256(); - else d = EVP_sha384(); /* LDNS_ECDSAP384SHA384 */ - result = ldns_verify_rrsig_evp_raw(sig, siglen, rrset, evp_key, d); - EVP_PKEY_free(evp_key); - return result; -} -#endif - -ldns_status -ldns_verify_rrsig_buffers(ldns_buffer *rawsig_buf, ldns_buffer *verify_buf, - ldns_buffer *key_buf, uint8_t algo) -{ - return ldns_verify_rrsig_buffers_raw( - (unsigned char*)ldns_buffer_begin(rawsig_buf), - ldns_buffer_position(rawsig_buf), - verify_buf, - (unsigned char*)ldns_buffer_begin(key_buf), - ldns_buffer_position(key_buf), algo); -} - -ldns_status -ldns_verify_rrsig_buffers_raw(unsigned char* sig, size_t siglen, - ldns_buffer *verify_buf, unsigned char* key, size_t keylen, - uint8_t algo) -{ - /* check for right key */ - switch(algo) { -#ifdef USE_DSA - case LDNS_DSA: - case LDNS_DSA_NSEC3: - return ldns_verify_rrsig_dsa_raw(sig, - siglen, - verify_buf, - key, - keylen); - break; -#endif - case LDNS_RSASHA1: - case LDNS_RSASHA1_NSEC3: - return ldns_verify_rrsig_rsasha1_raw(sig, - siglen, - verify_buf, - key, - keylen); - break; -#ifdef USE_SHA2 - case LDNS_RSASHA256: - return ldns_verify_rrsig_rsasha256_raw(sig, - siglen, - verify_buf, - key, - keylen); - break; - case LDNS_RSASHA512: - return ldns_verify_rrsig_rsasha512_raw(sig, - siglen, - verify_buf, - key, - keylen); - break; -#endif -#ifdef USE_GOST - case LDNS_ECC_GOST: - return ldns_verify_rrsig_gost_raw(sig, siglen, verify_buf, - key, keylen); - break; -#endif -#ifdef USE_ECDSA - case LDNS_ECDSAP256SHA256: - case LDNS_ECDSAP384SHA384: - return ldns_verify_rrsig_ecdsa_raw(sig, siglen, verify_buf, - key, keylen, algo); - break; -#endif -#ifdef USE_ED25519 - case LDNS_ED25519: - return ldns_verify_rrsig_ed25519_raw(sig, siglen, verify_buf, - key, keylen); - break; -#endif -#ifdef USE_ED448 - case LDNS_ED448: - return ldns_verify_rrsig_ed448_raw(sig, siglen, verify_buf, - key, keylen); - break; -#endif - case LDNS_RSAMD5: - return ldns_verify_rrsig_rsamd5_raw(sig, - siglen, - verify_buf, - key, - keylen); - break; - default: - /* do you know this alg?! */ - return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO; - } -} - - -/** - * Reset the ttl in the rrset with the orig_ttl from the sig - * and update owner name if it was wildcard - * Also canonicalizes the rrset. - * @param rrset: rrset to modify - * @param sig: signature to take TTL and wildcard values from - */ -static void -ldns_rrset_use_signature_ttl(ldns_rr_list* rrset_clone, const ldns_rr* rrsig) -{ - uint32_t orig_ttl; - uint16_t i; - uint8_t label_count; - ldns_rdf *wildcard_name; - ldns_rdf *wildcard_chopped; - ldns_rdf *wildcard_chopped_tmp; - - if ((rrsig == NULL) || ldns_rr_rd_count(rrsig) < 4) { - return; - } - - orig_ttl = ldns_rdf2native_int32( ldns_rr_rdf(rrsig, 3)); - label_count = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 2)); - - for(i = 0; i < ldns_rr_list_rr_count(rrset_clone); i++) { - if (label_count < - ldns_dname_label_count( - ldns_rr_owner(ldns_rr_list_rr(rrset_clone, i)))) { - (void) ldns_str2rdf_dname(&wildcard_name, "*"); - wildcard_chopped = ldns_rdf_clone(ldns_rr_owner( - ldns_rr_list_rr(rrset_clone, i))); - while (label_count < ldns_dname_label_count(wildcard_chopped)) { - wildcard_chopped_tmp = ldns_dname_left_chop( - wildcard_chopped); - ldns_rdf_deep_free(wildcard_chopped); - wildcard_chopped = wildcard_chopped_tmp; - } - (void) ldns_dname_cat(wildcard_name, wildcard_chopped); - ldns_rdf_deep_free(wildcard_chopped); - ldns_rdf_deep_free(ldns_rr_owner(ldns_rr_list_rr( - rrset_clone, i))); - ldns_rr_set_owner(ldns_rr_list_rr(rrset_clone, i), - wildcard_name); - } - ldns_rr_set_ttl(ldns_rr_list_rr(rrset_clone, i), orig_ttl); - /* convert to lowercase */ - ldns_rr2canonical(ldns_rr_list_rr(rrset_clone, i)); - } -} - -/** - * Make raw signature buffer out of rrsig - * @param rawsig_buf: raw signature buffer for result - * @param rrsig: signature to convert - * @return OK or more specific error. - */ -static ldns_status -ldns_rrsig2rawsig_buffer(ldns_buffer* rawsig_buf, const ldns_rr* rrsig) -{ - uint8_t sig_algo; - - if (rrsig == NULL) { - return LDNS_STATUS_CRYPTO_NO_RRSIG; - } - if (ldns_rr_rdf(rrsig, 1) == NULL) { - return LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG; - } - sig_algo = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 1)); - /* check for known and implemented algo's now (otherwise - * the function could return a wrong error - */ - /* create a buffer with signature rdata */ - /* for some algorithms we need other data than for others... */ - /* (the DSA API wants DER encoding for instance) */ - - switch(sig_algo) { - case LDNS_RSAMD5: - case LDNS_RSASHA1: - case LDNS_RSASHA1_NSEC3: -#ifdef USE_SHA2 - case LDNS_RSASHA256: - case LDNS_RSASHA512: -#endif -#ifdef USE_GOST - case LDNS_ECC_GOST: -#endif -#ifdef USE_ED25519 - case LDNS_ED25519: -#endif -#ifdef USE_ED448 - case LDNS_ED448: -#endif - if (ldns_rr_rdf(rrsig, 8) == NULL) { - return LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG; - } - if (ldns_rdf2buffer_wire(rawsig_buf, ldns_rr_rdf(rrsig, 8)) - != LDNS_STATUS_OK) { - return LDNS_STATUS_MEM_ERR; - } - break; -#ifdef USE_DSA - case LDNS_DSA: - case LDNS_DSA_NSEC3: - /* EVP takes rfc2459 format, which is a tad longer than dns format */ - if (ldns_rr_rdf(rrsig, 8) == NULL) { - return LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG; - } - if (ldns_convert_dsa_rrsig_rdf2asn1( - rawsig_buf, ldns_rr_rdf(rrsig, 8)) - != LDNS_STATUS_OK) { - /* - if (ldns_rdf2buffer_wire(rawsig_buf, - ldns_rr_rdf(rrsig, 8)) != LDNS_STATUS_OK) { - */ - return LDNS_STATUS_MEM_ERR; - } - break; -#endif -#ifdef USE_ECDSA - case LDNS_ECDSAP256SHA256: - case LDNS_ECDSAP384SHA384: - /* EVP produces an ASN prefix on the signature, which is - * not used in the DNS */ - if (ldns_rr_rdf(rrsig, 8) == NULL) { - return LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG; - } - if (ldns_convert_ecdsa_rrsig_rdf2asn1( - rawsig_buf, ldns_rr_rdf(rrsig, 8)) - != LDNS_STATUS_OK) { - return LDNS_STATUS_MEM_ERR; - } - break; -#endif - case LDNS_DH: - case LDNS_ECC: - case LDNS_INDIRECT: - return LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL; - default: - return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO; - } - return LDNS_STATUS_OK; -} - -/** - * Check RRSIG timestamps against the given 'now' time. - * @param rrsig: signature to check. - * @param now: the current time in seconds epoch. - * @return status code LDNS_STATUS_OK if all is fine. - */ -static ldns_status -ldns_rrsig_check_timestamps(const ldns_rr* rrsig, time_t now) -{ - int32_t inception, expiration; - - /* check the signature time stamps */ - inception = (int32_t)ldns_rdf2native_time_t( - ldns_rr_rrsig_inception(rrsig)); - expiration = (int32_t)ldns_rdf2native_time_t( - ldns_rr_rrsig_expiration(rrsig)); - - if (expiration - inception < 0) { - /* bad sig, expiration before inception?? Tsssg */ - return LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION; - } - if (((int32_t) now) - inception < 0) { - /* bad sig, inception date has not yet come to pass */ - return LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED; - } - if (expiration - ((int32_t) now) < 0) { - /* bad sig, expiration date has passed */ - return LDNS_STATUS_CRYPTO_SIG_EXPIRED; - } - return LDNS_STATUS_OK; -} - -/** - * Prepare for verification. - * @param rawsig_buf: raw signature buffer made ready. - * @param verify_buf: data for verification buffer made ready. - * @param rrset_clone: made ready. - * @param rrsig: signature to prepare for. - * @return LDNS_STATUS_OK is all went well. Otherwise specific error. - */ -static ldns_status -ldns_prepare_for_verify(ldns_buffer* rawsig_buf, ldns_buffer* verify_buf, - ldns_rr_list* rrset_clone, const ldns_rr* rrsig) -{ - ldns_status result; - - /* canonicalize the sig */ - ldns_dname2canonical(ldns_rr_owner(rrsig)); - - /* check if the typecovered is equal to the type checked */ - if (ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rrsig)) != - ldns_rr_get_type(ldns_rr_list_rr(rrset_clone, 0))) - return LDNS_STATUS_CRYPTO_TYPE_COVERED_ERR; - - /* create a buffer with b64 signature rdata */ - result = ldns_rrsig2rawsig_buffer(rawsig_buf, rrsig); - if(result != LDNS_STATUS_OK) - return result; - - /* use TTL from signature. Use wildcard names for wildcards */ - /* also canonicalizes rrset_clone */ - ldns_rrset_use_signature_ttl(rrset_clone, rrsig); - - /* sort the rrset in canonical order */ - ldns_rr_list_sort(rrset_clone); - - /* put the signature rr (without the b64) to the verify_buf */ - if (ldns_rrsig2buffer_wire(verify_buf, rrsig) != LDNS_STATUS_OK) - return LDNS_STATUS_MEM_ERR; - - /* add the rrset in verify_buf */ - if(ldns_rr_list2buffer_wire(verify_buf, rrset_clone) - != LDNS_STATUS_OK) - return LDNS_STATUS_MEM_ERR; - - return LDNS_STATUS_OK; -} - -/** - * Check if a key matches a signature. - * Checks keytag, sigalgo and signature. - * @param rawsig_buf: raw signature buffer for verify - * @param verify_buf: raw data buffer for verify - * @param rrsig: the rrsig - * @param key: key to attempt. - * @return LDNS_STATUS_OK if OK, else some specific error. - */ -static ldns_status -ldns_verify_test_sig_key(ldns_buffer* rawsig_buf, ldns_buffer* verify_buf, - const ldns_rr* rrsig, ldns_rr* key) -{ - uint8_t sig_algo; - - if (rrsig == NULL) { - return LDNS_STATUS_CRYPTO_NO_RRSIG; - } - if (ldns_rr_rdf(rrsig, 1) == NULL) { - return LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG; - } - sig_algo = ldns_rdf2native_int8(ldns_rr_rdf(rrsig, 1)); - - /* before anything, check if the keytags match */ - if (ldns_calc_keytag(key) - == - ldns_rdf2native_int16(ldns_rr_rrsig_keytag(rrsig)) - ) { - ldns_buffer* key_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - ldns_status result = LDNS_STATUS_ERR; - - /* put the key-data in a buffer, that's the third rdf, with - * the base64 encoded key data */ - if (ldns_rr_rdf(key, 3) == NULL) { - ldns_buffer_free(key_buf); - return LDNS_STATUS_MISSING_RDATA_FIELDS_KEY; - } - if (ldns_rdf2buffer_wire(key_buf, ldns_rr_rdf(key, 3)) - != LDNS_STATUS_OK) { - ldns_buffer_free(key_buf); - /* returning is bad might screw up - good keys later in the list - what to do? */ - return LDNS_STATUS_ERR; - } - - if (ldns_rr_rdf(key, 2) == NULL) { - result = LDNS_STATUS_MISSING_RDATA_FIELDS_KEY; - } - else if (sig_algo == ldns_rdf2native_int8( - ldns_rr_rdf(key, 2))) { - result = ldns_verify_rrsig_buffers(rawsig_buf, - verify_buf, key_buf, sig_algo); - } else { - /* No keys with the corresponding algorithm are found */ - result = LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY; - } - - ldns_buffer_free(key_buf); - return result; - } - else { - /* No keys with the corresponding keytag are found */ - return LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY; - } -} - -/* - * to verify: - * - create the wire fmt of the b64 key rdata - * - create the wire fmt of the sorted rrset - * - create the wire fmt of the b64 sig rdata - * - create the wire fmt of the sig without the b64 rdata - * - cat the sig data (without b64 rdata) to the rrset - * - verify the rrset+sig, with the b64 data and the b64 key data - */ -ldns_status -ldns_verify_rrsig_keylist_time( - const ldns_rr_list *rrset, - const ldns_rr *rrsig, - const ldns_rr_list *keys, - time_t check_time, - ldns_rr_list *good_keys) -{ - ldns_status result; - ldns_rr_list *valid = ldns_rr_list_new(); - if (!valid) - return LDNS_STATUS_MEM_ERR; - - result = ldns_verify_rrsig_keylist_notime(rrset, rrsig, keys, valid); - if(result != LDNS_STATUS_OK) { - ldns_rr_list_free(valid); - return result; - } - - /* check timestamps last; its OK except time */ - result = ldns_rrsig_check_timestamps(rrsig, check_time); - if(result != LDNS_STATUS_OK) { - ldns_rr_list_free(valid); - return result; - } - - ldns_rr_list_cat(good_keys, valid); - ldns_rr_list_free(valid); - return LDNS_STATUS_OK; -} - -/* - * to verify: - * - create the wire fmt of the b64 key rdata - * - create the wire fmt of the sorted rrset - * - create the wire fmt of the b64 sig rdata - * - create the wire fmt of the sig without the b64 rdata - * - cat the sig data (without b64 rdata) to the rrset - * - verify the rrset+sig, with the b64 data and the b64 key data - */ -ldns_status -ldns_verify_rrsig_keylist(ldns_rr_list *rrset, - ldns_rr *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys) -{ - return ldns_verify_rrsig_keylist_time( - rrset, rrsig, keys, ldns_time(NULL), good_keys); -} - -ldns_status -ldns_verify_rrsig_keylist_notime(const ldns_rr_list *rrset, - const ldns_rr *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys) -{ - ldns_buffer *rawsig_buf; - ldns_buffer *verify_buf; - uint16_t i; - ldns_status result, status; - ldns_rr_list *rrset_clone; - ldns_rr_list *validkeys; - - if (!rrset) { - return LDNS_STATUS_ERR; - } - - validkeys = ldns_rr_list_new(); - if (!validkeys) { - return LDNS_STATUS_MEM_ERR; - } - - /* clone the rrset so that we can fiddle with it */ - rrset_clone = ldns_rr_list_clone(rrset); - - /* create the buffers which will certainly hold the raw data */ - rawsig_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - verify_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - result = ldns_prepare_for_verify(rawsig_buf, verify_buf, - rrset_clone, rrsig); - if(result != LDNS_STATUS_OK) { - ldns_buffer_free(verify_buf); - ldns_buffer_free(rawsig_buf); - ldns_rr_list_deep_free(rrset_clone); - ldns_rr_list_free(validkeys); - return result; - } - - result = LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY; - for(i = 0; i < ldns_rr_list_rr_count(keys); i++) { - status = ldns_verify_test_sig_key(rawsig_buf, verify_buf, - rrsig, ldns_rr_list_rr(keys, i)); - if (status == LDNS_STATUS_OK) { - /* one of the keys has matched, don't break - * here, instead put the 'winning' key in - * the validkey list and return the list - * later */ - if (!ldns_rr_list_push_rr(validkeys, - ldns_rr_list_rr(keys,i))) { - /* couldn't push the key?? */ - ldns_buffer_free(rawsig_buf); - ldns_buffer_free(verify_buf); - ldns_rr_list_deep_free(rrset_clone); - ldns_rr_list_free(validkeys); - return LDNS_STATUS_MEM_ERR; - } - - result = status; - } - - if (result == LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY) { - result = status; - } - } - - /* no longer needed */ - ldns_rr_list_deep_free(rrset_clone); - ldns_buffer_free(rawsig_buf); - ldns_buffer_free(verify_buf); - - if (ldns_rr_list_rr_count(validkeys) == 0) { - /* no keys were added, return last error */ - ldns_rr_list_free(validkeys); - return result; - } - - /* do not check timestamps */ - - ldns_rr_list_cat(good_keys, validkeys); - ldns_rr_list_free(validkeys); - return LDNS_STATUS_OK; -} - -ldns_status -ldns_verify_rrsig_time( - ldns_rr_list *rrset, - ldns_rr *rrsig, - ldns_rr *key, - time_t check_time) -{ - ldns_buffer *rawsig_buf; - ldns_buffer *verify_buf; - ldns_status result; - ldns_rr_list *rrset_clone; - - if (!rrset) { - return LDNS_STATUS_NO_DATA; - } - /* clone the rrset so that we can fiddle with it */ - rrset_clone = ldns_rr_list_clone(rrset); - /* create the buffers which will certainly hold the raw data */ - rawsig_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - verify_buf = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - result = ldns_prepare_for_verify(rawsig_buf, verify_buf, - rrset_clone, rrsig); - if(result != LDNS_STATUS_OK) { - ldns_rr_list_deep_free(rrset_clone); - ldns_buffer_free(rawsig_buf); - ldns_buffer_free(verify_buf); - return result; - } - result = ldns_verify_test_sig_key(rawsig_buf, verify_buf, - rrsig, key); - /* no longer needed */ - ldns_rr_list_deep_free(rrset_clone); - ldns_buffer_free(rawsig_buf); - ldns_buffer_free(verify_buf); - - /* check timestamp last, apart from time its OK */ - if(result == LDNS_STATUS_OK) - result = ldns_rrsig_check_timestamps(rrsig, check_time); - - return result; -} - -ldns_status -ldns_verify_rrsig(ldns_rr_list *rrset, ldns_rr *rrsig, ldns_rr *key) -{ - return ldns_verify_rrsig_time(rrset, rrsig, key, ldns_time(NULL)); -} - - -ldns_status -ldns_verify_rrsig_evp(ldns_buffer *sig, - ldns_buffer *rrset, - EVP_PKEY *key, - const EVP_MD *digest_type) -{ - return ldns_verify_rrsig_evp_raw( - (unsigned char*)ldns_buffer_begin(sig), - ldns_buffer_position(sig), - rrset, - key, - digest_type); -} - -ldns_status -ldns_verify_rrsig_evp_raw(const unsigned char *sig, size_t siglen, - const ldns_buffer *rrset, EVP_PKEY *key, const EVP_MD *digest_type) -{ - EVP_MD_CTX *ctx; - int res; - -#ifdef HAVE_EVP_MD_CTX_NEW - ctx = EVP_MD_CTX_new(); -#else - ctx = (EVP_MD_CTX*)malloc(sizeof(*ctx)); - if(ctx) EVP_MD_CTX_init(ctx); -#endif - if(!ctx) - return LDNS_STATUS_MEM_ERR; - -#if defined(USE_ED25519) || defined(USE_ED448) - if(!digest_type) { - res = EVP_DigestVerifyInit(ctx, NULL, digest_type, NULL, key); - if(res == 1) { - res = EVP_DigestVerify(ctx, sig, siglen, - ldns_buffer_begin(rrset), - ldns_buffer_position(rrset)); - } - } else { -#else - res = 0; - if(digest_type) { -#endif - EVP_VerifyInit(ctx, digest_type); - EVP_VerifyUpdate(ctx, - ldns_buffer_begin(rrset), - ldns_buffer_position(rrset)); - res = EVP_VerifyFinal(ctx, sig, (unsigned int) siglen, key); - } - - EVP_MD_CTX_destroy(ctx); - - if (res == 1) { - return LDNS_STATUS_OK; - - } else if (res == 0) { - return LDNS_STATUS_CRYPTO_BOGUS; - } - /* TODO how to communicate internal SSL error? - let caller use ssl's get_error() */ - return LDNS_STATUS_SSL_ERR; -} - -ldns_status -ldns_verify_rrsig_dsa(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key) -{ - return ldns_verify_rrsig_dsa_raw( - (unsigned char*) ldns_buffer_begin(sig), - ldns_buffer_position(sig), - rrset, - (unsigned char*) ldns_buffer_begin(key), - ldns_buffer_position(key)); -} - -ldns_status -ldns_verify_rrsig_rsasha1(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key) -{ - return ldns_verify_rrsig_rsasha1_raw( - (unsigned char*)ldns_buffer_begin(sig), - ldns_buffer_position(sig), - rrset, - (unsigned char*) ldns_buffer_begin(key), - ldns_buffer_position(key)); -} - -ldns_status -ldns_verify_rrsig_rsamd5(ldns_buffer *sig, ldns_buffer *rrset, ldns_buffer *key) -{ - return ldns_verify_rrsig_rsamd5_raw( - (unsigned char*)ldns_buffer_begin(sig), - ldns_buffer_position(sig), - rrset, - (unsigned char*) ldns_buffer_begin(key), - ldns_buffer_position(key)); -} - -ldns_status -ldns_verify_rrsig_dsa_raw(unsigned char* sig, size_t siglen, - ldns_buffer* rrset, unsigned char* key, size_t keylen) -{ -#ifdef USE_DSA - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = EVP_PKEY_new(); - if (EVP_PKEY_assign_DSA(evp_key, ldns_key_buf2dsa_raw(key, keylen))) { - result = ldns_verify_rrsig_evp_raw(sig, - siglen, - rrset, - evp_key, -# ifdef HAVE_EVP_DSS1 - EVP_dss1() -# else - EVP_sha1() -# endif - ); - } else { - result = LDNS_STATUS_SSL_ERR; - } - EVP_PKEY_free(evp_key); - return result; -#else - (void)sig; (void)siglen; (void)rrset; (void)key; (void)keylen; - return LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL; -#endif -} - -ldns_status -ldns_verify_rrsig_rsasha1_raw(unsigned char* sig, size_t siglen, - ldns_buffer* rrset, unsigned char* key, size_t keylen) -{ - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = EVP_PKEY_new(); - if (EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen))) { - result = ldns_verify_rrsig_evp_raw(sig, - siglen, - rrset, - evp_key, - EVP_sha1()); - } else { - result = LDNS_STATUS_SSL_ERR; - } - EVP_PKEY_free(evp_key); - - return result; -} - -ldns_status -ldns_verify_rrsig_rsasha256_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen) -{ -#ifdef USE_SHA2 - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = EVP_PKEY_new(); - if (EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen))) { - result = ldns_verify_rrsig_evp_raw(sig, - siglen, - rrset, - evp_key, - EVP_sha256()); - } else { - result = LDNS_STATUS_SSL_ERR; - } - EVP_PKEY_free(evp_key); - - return result; -#else - /* touch these to prevent compiler warnings */ - (void) sig; - (void) siglen; - (void) rrset; - (void) key; - (void) keylen; - return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO; -#endif -} - -ldns_status -ldns_verify_rrsig_rsasha512_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen) -{ -#ifdef USE_SHA2 - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = EVP_PKEY_new(); - if (EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen))) { - result = ldns_verify_rrsig_evp_raw(sig, - siglen, - rrset, - evp_key, - EVP_sha512()); - } else { - result = LDNS_STATUS_SSL_ERR; - } - EVP_PKEY_free(evp_key); - - return result; -#else - /* touch these to prevent compiler warnings */ - (void) sig; - (void) siglen; - (void) rrset; - (void) key; - (void) keylen; - return LDNS_STATUS_CRYPTO_UNKNOWN_ALGO; -#endif -} - - -ldns_status -ldns_verify_rrsig_rsamd5_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen) -{ - EVP_PKEY *evp_key; - ldns_status result; - - evp_key = EVP_PKEY_new(); - if (EVP_PKEY_assign_RSA(evp_key, ldns_key_buf2rsa_raw(key, keylen))) { - result = ldns_verify_rrsig_evp_raw(sig, - siglen, - rrset, - evp_key, - EVP_md5()); - } else { - result = LDNS_STATUS_SSL_ERR; - } - EVP_PKEY_free(evp_key); - - return result; -} - -#endif diff --git a/ldns/dnssec_zone.c b/ldns/dnssec_zone.c deleted file mode 100644 index e089754..0000000 --- a/ldns/dnssec_zone.c +++ /dev/null @@ -1,1203 +0,0 @@ -/* - * special zone file structures and functions for better dnssec handling - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -ldns_dnssec_rrs * -ldns_dnssec_rrs_new(void) -{ - ldns_dnssec_rrs *new_rrs; - new_rrs = LDNS_MALLOC(ldns_dnssec_rrs); - if(!new_rrs) return NULL; - new_rrs->rr = NULL; - new_rrs->next = NULL; - return new_rrs; -} - -INLINE void -ldns_dnssec_rrs_free_internal(ldns_dnssec_rrs *rrs, int deep) -{ - ldns_dnssec_rrs *next; - while (rrs) { - next = rrs->next; - if (deep) { - ldns_rr_free(rrs->rr); - } - LDNS_FREE(rrs); - rrs = next; - } -} - -void -ldns_dnssec_rrs_free(ldns_dnssec_rrs *rrs) -{ - ldns_dnssec_rrs_free_internal(rrs, 0); -} - -void -ldns_dnssec_rrs_deep_free(ldns_dnssec_rrs *rrs) -{ - ldns_dnssec_rrs_free_internal(rrs, 1); -} - -ldns_status -ldns_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr) -{ - int cmp; - ldns_dnssec_rrs *new_rrs; - if (!rrs || !rr) { - return LDNS_STATUS_ERR; - } - - /* this could be done more efficiently; name and type should already - be equal */ - cmp = ldns_rr_compare(rrs->rr, rr); - if (cmp < 0) { - if (rrs->next) { - return ldns_dnssec_rrs_add_rr(rrs->next, rr); - } else { - new_rrs = ldns_dnssec_rrs_new(); - new_rrs->rr = rr; - rrs->next = new_rrs; - } - } else if (cmp > 0) { - /* put the current old rr in the new next, put the new - rr in the current container */ - new_rrs = ldns_dnssec_rrs_new(); - new_rrs->rr = rrs->rr; - new_rrs->next = rrs->next; - rrs->rr = rr; - rrs->next = new_rrs; - } - /* Silently ignore equal rr's */ - return LDNS_STATUS_OK; -} - -void -ldns_dnssec_rrs_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_rrs *rrs) -{ - if (!rrs) { - if ((fmt->flags & LDNS_COMMENT_LAYOUT)) - fprintf(out, "; <void>"); - } else { - if (rrs->rr) { - ldns_rr_print_fmt(out, fmt, rrs->rr); - } - if (rrs->next) { - ldns_dnssec_rrs_print_fmt(out, fmt, rrs->next); - } - } -} - -void -ldns_dnssec_rrs_print(FILE *out, const ldns_dnssec_rrs *rrs) -{ - ldns_dnssec_rrs_print_fmt(out, ldns_output_format_default, rrs); -} - - -ldns_dnssec_rrsets * -ldns_dnssec_rrsets_new(void) -{ - ldns_dnssec_rrsets *new_rrsets; - new_rrsets = LDNS_MALLOC(ldns_dnssec_rrsets); - if(!new_rrsets) return NULL; - new_rrsets->rrs = NULL; - new_rrsets->type = 0; - new_rrsets->signatures = NULL; - new_rrsets->next = NULL; - return new_rrsets; -} - -INLINE void -ldns_dnssec_rrsets_free_internal(ldns_dnssec_rrsets *rrsets, int deep) -{ - if (rrsets) { - if (rrsets->rrs) { - ldns_dnssec_rrs_free_internal(rrsets->rrs, deep); - } - if (rrsets->next) { - ldns_dnssec_rrsets_free_internal(rrsets->next, deep); - } - if (rrsets->signatures) { - ldns_dnssec_rrs_free_internal(rrsets->signatures, deep); - } - LDNS_FREE(rrsets); - } -} - -void -ldns_dnssec_rrsets_free(ldns_dnssec_rrsets *rrsets) -{ - ldns_dnssec_rrsets_free_internal(rrsets, 0); -} - -void -ldns_dnssec_rrsets_deep_free(ldns_dnssec_rrsets *rrsets) -{ - ldns_dnssec_rrsets_free_internal(rrsets, 1); -} - -ldns_rr_type -ldns_dnssec_rrsets_type(const ldns_dnssec_rrsets *rrsets) -{ - if (rrsets) { - return rrsets->type; - } else { - return 0; - } -} - -ldns_status -ldns_dnssec_rrsets_set_type(ldns_dnssec_rrsets *rrsets, - ldns_rr_type type) -{ - if (rrsets) { - rrsets->type = type; - return LDNS_STATUS_OK; - } - return LDNS_STATUS_ERR; -} - -static ldns_dnssec_rrsets * -ldns_dnssec_rrsets_new_frm_rr(ldns_rr *rr) -{ - ldns_dnssec_rrsets *new_rrsets; - ldns_rr_type rr_type; - bool rrsig; - - new_rrsets = ldns_dnssec_rrsets_new(); - rr_type = ldns_rr_get_type(rr); - if (rr_type == LDNS_RR_TYPE_RRSIG) { - rrsig = true; - rr_type = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr)); - } else { - rrsig = false; - } - if (!rrsig) { - new_rrsets->rrs = ldns_dnssec_rrs_new(); - new_rrsets->rrs->rr = rr; - } else { - new_rrsets->signatures = ldns_dnssec_rrs_new(); - new_rrsets->signatures->rr = rr; - } - new_rrsets->type = rr_type; - return new_rrsets; -} - -ldns_status -ldns_dnssec_rrsets_add_rr(ldns_dnssec_rrsets *rrsets, ldns_rr *rr) -{ - ldns_dnssec_rrsets *new_rrsets; - ldns_rr_type rr_type; - bool rrsig = false; - ldns_status result = LDNS_STATUS_OK; - - if (!rrsets || !rr) { - return LDNS_STATUS_ERR; - } - - rr_type = ldns_rr_get_type(rr); - - if (rr_type == LDNS_RR_TYPE_RRSIG) { - rrsig = true; - rr_type = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr)); - } - - if (!rrsets->rrs && rrsets->type == 0 && !rrsets->signatures) { - if (!rrsig) { - rrsets->rrs = ldns_dnssec_rrs_new(); - rrsets->rrs->rr = rr; - rrsets->type = rr_type; - } else { - rrsets->signatures = ldns_dnssec_rrs_new(); - rrsets->signatures->rr = rr; - rrsets->type = rr_type; - } - return LDNS_STATUS_OK; - } - - if (rr_type > ldns_dnssec_rrsets_type(rrsets)) { - if (rrsets->next) { - result = ldns_dnssec_rrsets_add_rr(rrsets->next, rr); - } else { - new_rrsets = ldns_dnssec_rrsets_new_frm_rr(rr); - rrsets->next = new_rrsets; - } - } else if (rr_type < ldns_dnssec_rrsets_type(rrsets)) { - /* move the current one into the new next, - replace field of current with data from new rr */ - new_rrsets = ldns_dnssec_rrsets_new(); - new_rrsets->rrs = rrsets->rrs; - new_rrsets->type = rrsets->type; - new_rrsets->signatures = rrsets->signatures; - new_rrsets->next = rrsets->next; - if (!rrsig) { - rrsets->rrs = ldns_dnssec_rrs_new(); - rrsets->rrs->rr = rr; - rrsets->signatures = NULL; - } else { - rrsets->rrs = NULL; - rrsets->signatures = ldns_dnssec_rrs_new(); - rrsets->signatures->rr = rr; - } - rrsets->type = rr_type; - rrsets->next = new_rrsets; - } else { - /* equal, add to current rrsets */ - if (rrsig) { - if (rrsets->signatures) { - result = ldns_dnssec_rrs_add_rr(rrsets->signatures, rr); - } else { - rrsets->signatures = ldns_dnssec_rrs_new(); - rrsets->signatures->rr = rr; - } - } else { - if (rrsets->rrs) { - result = ldns_dnssec_rrs_add_rr(rrsets->rrs, rr); - } else { - rrsets->rrs = ldns_dnssec_rrs_new(); - rrsets->rrs->rr = rr; - } - } - } - - return result; -} - -static void -ldns_dnssec_rrsets_print_soa_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_rrsets *rrsets, - bool follow, - bool show_soa) -{ - if (!rrsets) { - if ((fmt->flags & LDNS_COMMENT_LAYOUT)) - fprintf(out, "; <void>\n"); - } else { - if (rrsets->rrs && - (show_soa || - ldns_rr_get_type(rrsets->rrs->rr) != LDNS_RR_TYPE_SOA - ) - ) { - ldns_dnssec_rrs_print_fmt(out, fmt, rrsets->rrs); - if (rrsets->signatures) { - ldns_dnssec_rrs_print_fmt(out, fmt, - rrsets->signatures); - } - } - if (follow && rrsets->next) { - ldns_dnssec_rrsets_print_soa_fmt(out, fmt, - rrsets->next, follow, show_soa); - } - } -} - - -void -ldns_dnssec_rrsets_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_rrsets *rrsets, - bool follow) -{ - ldns_dnssec_rrsets_print_soa_fmt(out, fmt, rrsets, follow, true); -} - -void -ldns_dnssec_rrsets_print(FILE *out, const ldns_dnssec_rrsets *rrsets, bool follow) -{ - ldns_dnssec_rrsets_print_fmt(out, ldns_output_format_default, - rrsets, follow); -} - -ldns_dnssec_name * -ldns_dnssec_name_new(void) -{ - ldns_dnssec_name *new_name; - - new_name = LDNS_CALLOC(ldns_dnssec_name, 1); - if (!new_name) { - return NULL; - } - /* - * not needed anymore because CALLOC initalizes everything to zero. - - new_name->name = NULL; - new_name->rrsets = NULL; - new_name->name_alloced = false; - new_name->nsec = NULL; - new_name->nsec_signatures = NULL; - - new_name->is_glue = false; - new_name->hashed_name = NULL; - - */ - return new_name; -} - -ldns_dnssec_name * -ldns_dnssec_name_new_frm_rr(ldns_rr *rr) -{ - ldns_dnssec_name *new_name = ldns_dnssec_name_new(); - - new_name->name = ldns_rr_owner(rr); - if(ldns_dnssec_name_add_rr(new_name, rr) != LDNS_STATUS_OK) { - ldns_dnssec_name_free(new_name); - return NULL; - } - - return new_name; -} - -INLINE void -ldns_dnssec_name_free_internal(ldns_dnssec_name *name, - int deep) -{ - if (name) { - if (name->name_alloced) { - ldns_rdf_deep_free(name->name); - } - if (name->rrsets) { - ldns_dnssec_rrsets_free_internal(name->rrsets, deep); - } - if (name->nsec && deep) { - ldns_rr_free(name->nsec); - } - if (name->nsec_signatures) { - ldns_dnssec_rrs_free_internal(name->nsec_signatures, deep); - } - if (name->hashed_name) { - if (deep) { - ldns_rdf_deep_free(name->hashed_name); - } - } - LDNS_FREE(name); - } -} - -void -ldns_dnssec_name_free(ldns_dnssec_name *name) -{ - ldns_dnssec_name_free_internal(name, 0); -} - -void -ldns_dnssec_name_deep_free(ldns_dnssec_name *name) -{ - ldns_dnssec_name_free_internal(name, 1); -} - -ldns_rdf * -ldns_dnssec_name_name(const ldns_dnssec_name *name) -{ - if (name) { - return name->name; - } - return NULL; -} - -bool -ldns_dnssec_name_is_glue(const ldns_dnssec_name *name) -{ - if (name) { - return name->is_glue; - } - return false; -} - -void -ldns_dnssec_name_set_name(ldns_dnssec_name *rrset, - ldns_rdf *dname) -{ - if (rrset && dname) { - rrset->name = dname; - } -} - - -void -ldns_dnssec_name_set_nsec(ldns_dnssec_name *rrset, ldns_rr *nsec) -{ - if (rrset && nsec) { - rrset->nsec = nsec; - } -} - -int -ldns_dnssec_name_cmp(const void *a, const void *b) -{ - ldns_dnssec_name *na = (ldns_dnssec_name *) a; - ldns_dnssec_name *nb = (ldns_dnssec_name *) b; - - if (na && nb) { - return ldns_dname_compare(ldns_dnssec_name_name(na), - ldns_dnssec_name_name(nb)); - } else if (na) { - return 1; - } else if (nb) { - return -1; - } else { - return 0; - } -} - -ldns_status -ldns_dnssec_name_add_rr(ldns_dnssec_name *name, - ldns_rr *rr) -{ - ldns_status result = LDNS_STATUS_OK; - ldns_rr_type rr_type; - ldns_rr_type typecovered = 0; - - /* special handling for NSEC3 and NSECX covering RRSIGS */ - - if (!name || !rr) { - return LDNS_STATUS_ERR; - } - - rr_type = ldns_rr_get_type(rr); - - if (rr_type == LDNS_RR_TYPE_RRSIG) { - typecovered = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr)); - } - - if (rr_type == LDNS_RR_TYPE_NSEC || - rr_type == LDNS_RR_TYPE_NSEC3) { - /* XX check if is already set (and error?) */ - name->nsec = rr; - } else if (typecovered == LDNS_RR_TYPE_NSEC || - typecovered == LDNS_RR_TYPE_NSEC3) { - if (name->nsec_signatures) { - result = ldns_dnssec_rrs_add_rr(name->nsec_signatures, rr); - } else { - name->nsec_signatures = ldns_dnssec_rrs_new(); - name->nsec_signatures->rr = rr; - } - } else { - /* it's a 'normal' RR, add it to the right rrset */ - if (name->rrsets) { - result = ldns_dnssec_rrsets_add_rr(name->rrsets, rr); - } else { - name->rrsets = ldns_dnssec_rrsets_new(); - result = ldns_dnssec_rrsets_add_rr(name->rrsets, rr); - } - } - return result; -} - -ldns_dnssec_rrsets * -ldns_dnssec_name_find_rrset(const ldns_dnssec_name *name, - ldns_rr_type type) { - ldns_dnssec_rrsets *result; - - result = name->rrsets; - while (result) { - if (result->type == type) { - return result; - } else { - result = result->next; - } - } - return NULL; -} - -ldns_dnssec_rrsets * -ldns_dnssec_zone_find_rrset(const ldns_dnssec_zone *zone, - const ldns_rdf *dname, - ldns_rr_type type) -{ - ldns_rbnode_t *node; - - if (!zone || !dname || !zone->names) { - return NULL; - } - - node = ldns_rbtree_search(zone->names, dname); - if (node) { - return ldns_dnssec_name_find_rrset((ldns_dnssec_name *)node->data, - type); - } else { - return NULL; - } -} - -static void -ldns_dnssec_name_print_soa_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_name *name, - bool show_soa) -{ - if (name) { - if(name->rrsets) { - ldns_dnssec_rrsets_print_soa_fmt(out, fmt, - name->rrsets, true, show_soa); - } else if ((fmt->flags & LDNS_COMMENT_LAYOUT)) { - fprintf(out, ";; Empty nonterminal: "); - ldns_rdf_print(out, name->name); - fprintf(out, "\n"); - } - if(name->nsec) { - ldns_rr_print_fmt(out, fmt, name->nsec); - } - if (name->nsec_signatures) { - ldns_dnssec_rrs_print_fmt(out, fmt, - name->nsec_signatures); - } - } else if ((fmt->flags & LDNS_COMMENT_LAYOUT)) { - fprintf(out, "; <void>\n"); - } -} - - -void -ldns_dnssec_name_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_name *name) -{ - ldns_dnssec_name_print_soa_fmt(out, fmt, name, true); -} - -void -ldns_dnssec_name_print(FILE *out, const ldns_dnssec_name *name) -{ - ldns_dnssec_name_print_fmt(out, ldns_output_format_default, name); -} - - -ldns_dnssec_zone * -ldns_dnssec_zone_new(void) -{ - ldns_dnssec_zone *zone = LDNS_MALLOC(ldns_dnssec_zone); - if(!zone) return NULL; - zone->soa = NULL; - zone->names = NULL; - zone->hashed_names = NULL; - zone->_nsec3params = NULL; - - return zone; -} - -static bool -rr_is_rrsig_covering(ldns_rr* rr, ldns_rr_type t) -{ - return ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG - && ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr)) == t; -} - -/* When the zone is first read into an list and then inserted into an - * ldns_dnssec_zone (rbtree) the nodes of the rbtree are allocated close (next) - * to each other. Because ldns-verify-zone (the only program that uses this - * function) uses the rbtree mostly for sequentual walking, this results - * in a speed increase (of 15% on linux) because we have less CPU-cache misses. - */ -#define FASTER_DNSSEC_ZONE_NEW_FRM_FP 1 /* Because of L2 cache efficiency */ - -static ldns_status -ldns_dnssec_zone_add_empty_nonterminals_nsec3( - ldns_dnssec_zone *zone, ldns_rbtree_t *nsec3s); - -static void -ldns_todo_nsec3_ents_node_free(ldns_rbnode_t *node, void *arg) { - (void) arg; - ldns_rdf_deep_free((ldns_rdf *)node->key); - LDNS_FREE(node); -} - -ldns_status -ldns_dnssec_zone_new_frm_fp_l(ldns_dnssec_zone** z, FILE* fp, const ldns_rdf* origin, - uint32_t ttl, ldns_rr_class ATTR_UNUSED(c), int* line_nr) -{ - ldns_rr* cur_rr; - size_t i; - - ldns_rdf *my_origin = NULL; - ldns_rdf *my_prev = NULL; - - ldns_dnssec_zone *newzone = ldns_dnssec_zone_new(); - /* NSEC3s may occur before the names they refer to. We must remember - them and add them to the name later on, after the name is read. - We track not yet matching NSEC3s*n the todo_nsec3s list */ - ldns_rr_list* todo_nsec3s = ldns_rr_list_new(); - /* when reading NSEC3s, there is a chance that we encounter nsecs - for empty nonterminals, whose nonterminals we cannot derive yet - because the needed information is to be read later. - - nsec3_ents (where ent is e.n.t.; i.e. empty non terminal) will - hold the NSEC3s that still didn't have a matching name in the - zone tree, even after all names were read. They can only match - after the zone is equiped with all the empty non terminals. */ - ldns_rbtree_t todo_nsec3_ents; - ldns_rbnode_t *new_node; - ldns_rr_list* todo_nsec3_rrsigs = ldns_rr_list_new(); - - ldns_status status; - -#ifdef FASTER_DNSSEC_ZONE_NEW_FRM_FP - ldns_zone* zone = NULL; -#else - uint32_t my_ttl = ttl; -#endif - - ldns_rbtree_init(&todo_nsec3_ents, ldns_dname_compare_v); - -#ifdef FASTER_DNSSEC_ZONE_NEW_FRM_FP - status = ldns_zone_new_frm_fp_l(&zone, fp, origin,ttl, c, line_nr); - if (status != LDNS_STATUS_OK) - goto error; -#endif - if (!newzone || !todo_nsec3s || !todo_nsec3_rrsigs ) { - status = LDNS_STATUS_MEM_ERR; - goto error; - } - if (origin) { - if (!(my_origin = ldns_rdf_clone(origin))) { - status = LDNS_STATUS_MEM_ERR; - goto error; - } - if (!(my_prev = ldns_rdf_clone(origin))) { - status = LDNS_STATUS_MEM_ERR; - goto error; - } - } - -#ifdef FASTER_DNSSEC_ZONE_NEW_FRM_FP - if (ldns_zone_soa(zone)) { - status = ldns_dnssec_zone_add_rr(newzone, ldns_zone_soa(zone)); - if (status != LDNS_STATUS_OK) - goto error; - } - for (i = 0; i < ldns_rr_list_rr_count(ldns_zone_rrs(zone)); i++) { - cur_rr = ldns_rr_list_rr(ldns_zone_rrs(zone), i); - status = LDNS_STATUS_OK; -#else - while (!feof(fp)) { - status = ldns_rr_new_frm_fp_l(&cur_rr, fp, &my_ttl, &my_origin, - &my_prev, line_nr); - -#endif - switch (status) { - case LDNS_STATUS_OK: - - status = ldns_dnssec_zone_add_rr(newzone, cur_rr); - if (status == - LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND) { - - if (rr_is_rrsig_covering(cur_rr, - LDNS_RR_TYPE_NSEC3)){ - ldns_rr_list_push_rr(todo_nsec3_rrsigs, - cur_rr); - } else { - ldns_rr_list_push_rr(todo_nsec3s, - cur_rr); - } - status = LDNS_STATUS_OK; - - } else if (status != LDNS_STATUS_OK) - goto error; - - break; - - - case LDNS_STATUS_SYNTAX_EMPTY: /* empty line was seen */ - case LDNS_STATUS_SYNTAX_TTL: /* the ttl was set*/ - case LDNS_STATUS_SYNTAX_ORIGIN: /* the origin was set*/ - status = LDNS_STATUS_OK; - break; - - case LDNS_STATUS_SYNTAX_INCLUDE:/* $include not implemented */ - status = LDNS_STATUS_SYNTAX_INCLUDE_ERR_NOTIMPL; - break; - - default: - goto error; - } - } - - for (i = 0; status == LDNS_STATUS_OK && - i < ldns_rr_list_rr_count(todo_nsec3s); i++) { - cur_rr = ldns_rr_list_rr(todo_nsec3s, i); - status = ldns_dnssec_zone_add_rr(newzone, cur_rr); - if (status == LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND) { - if (!(new_node = LDNS_MALLOC(ldns_rbnode_t))) { - status = LDNS_STATUS_MEM_ERR; - break; - } - new_node->key = ldns_dname_label(ldns_rr_owner(cur_rr), 0); - new_node->data = cur_rr; - if (!ldns_rbtree_insert(&todo_nsec3_ents, new_node)) { - LDNS_FREE(new_node); - status = LDNS_STATUS_MEM_ERR; - break; - } - status = LDNS_STATUS_OK; - } - } - if (todo_nsec3_ents.count > 0) - (void) ldns_dnssec_zone_add_empty_nonterminals_nsec3( - newzone, &todo_nsec3_ents); - for (i = 0; status == LDNS_STATUS_OK && - i < ldns_rr_list_rr_count(todo_nsec3_rrsigs); i++) { - cur_rr = ldns_rr_list_rr(todo_nsec3_rrsigs, i); - status = ldns_dnssec_zone_add_rr(newzone, cur_rr); - } - if (z) { - *z = newzone; - newzone = NULL; - } else { - ldns_dnssec_zone_free(newzone); - newzone = NULL; - } - -error: -#ifdef FASTER_DNSSEC_ZONE_NEW_FRM_FP - if (zone) { - ldns_zone_free(zone); - } -#endif - ldns_rr_list_free(todo_nsec3_rrsigs); - ldns_traverse_postorder(&todo_nsec3_ents, - ldns_todo_nsec3_ents_node_free, NULL); - ldns_rr_list_free(todo_nsec3s); - - if (my_origin) { - ldns_rdf_deep_free(my_origin); - } - if (my_prev) { - ldns_rdf_deep_free(my_prev); - } - if (newzone) { - ldns_dnssec_zone_free(newzone); - } - return status; -} - -ldns_status -ldns_dnssec_zone_new_frm_fp(ldns_dnssec_zone** z, FILE* fp, const ldns_rdf* origin, - uint32_t ttl, ldns_rr_class ATTR_UNUSED(c)) -{ - return ldns_dnssec_zone_new_frm_fp_l(z, fp, origin, ttl, c, NULL); -} - -static void -ldns_dnssec_name_node_free(ldns_rbnode_t *node, void *arg) { - (void) arg; - ldns_dnssec_name_free((ldns_dnssec_name *)node->data); - LDNS_FREE(node); -} - -static void -ldns_dnssec_name_node_deep_free(ldns_rbnode_t *node, void *arg) { - (void) arg; - ldns_dnssec_name_deep_free((ldns_dnssec_name *)node->data); - LDNS_FREE(node); -} - -void -ldns_dnssec_zone_free(ldns_dnssec_zone *zone) -{ - if (zone) { - if (zone->names) { - /* destroy all name structures within the tree */ - ldns_traverse_postorder(zone->names, - ldns_dnssec_name_node_free, - NULL); - LDNS_FREE(zone->names); - } - LDNS_FREE(zone); - } -} - -void -ldns_dnssec_zone_deep_free(ldns_dnssec_zone *zone) -{ - if (zone) { - if (zone->names) { - /* destroy all name structures within the tree */ - ldns_traverse_postorder(zone->names, - ldns_dnssec_name_node_deep_free, - NULL); - LDNS_FREE(zone->names); - } - LDNS_FREE(zone); - } -} - -/* use for dname comparison in tree */ -int -ldns_dname_compare_v(const void *a, const void *b) { - return ldns_dname_compare((ldns_rdf *)a, (ldns_rdf *)b); -} - -static void -ldns_dnssec_name_make_hashed_name(ldns_dnssec_zone *zone, - ldns_dnssec_name* name, ldns_rr* nsec3rr); - -static void -ldns_hashed_names_node_free(ldns_rbnode_t *node, void *arg) { - (void) arg; - LDNS_FREE(node); -} - -static void -ldns_dnssec_zone_hashed_names_from_nsec3( - ldns_dnssec_zone* zone, ldns_rr* nsec3rr) -{ - ldns_rbnode_t* current_node; - ldns_dnssec_name* current_name; - - assert(zone != NULL); - assert(nsec3rr != NULL); - - if (zone->hashed_names) { - ldns_traverse_postorder(zone->hashed_names, - ldns_hashed_names_node_free, NULL); - LDNS_FREE(zone->hashed_names); - } - zone->_nsec3params = nsec3rr; - - /* So this is a NSEC3 zone. - * Calculate hashes for all names already in the zone - */ - zone->hashed_names = ldns_rbtree_create(ldns_dname_compare_v); - if (zone->hashed_names == NULL) { - return; - } - for ( current_node = ldns_rbtree_first(zone->names) - ; current_node != LDNS_RBTREE_NULL - ; current_node = ldns_rbtree_next(current_node) - ) { - current_name = (ldns_dnssec_name *) current_node->data; - ldns_dnssec_name_make_hashed_name(zone, current_name, nsec3rr); - - } -} - -static void -ldns_dnssec_name_make_hashed_name(ldns_dnssec_zone *zone, - ldns_dnssec_name* name, ldns_rr* nsec3rr) -{ - ldns_rbnode_t* new_node; - - assert(name != NULL); - if (! zone->_nsec3params) { - if (! nsec3rr) { - return; - } - ldns_dnssec_zone_hashed_names_from_nsec3(zone, nsec3rr); - - } else if (! nsec3rr) { - nsec3rr = zone->_nsec3params; - } - name->hashed_name = ldns_nsec3_hash_name_frm_nsec3(nsec3rr, name->name); - - /* Also store in zone->hashed_names */ - if ((new_node = LDNS_MALLOC(ldns_rbnode_t))) { - - new_node->key = name->hashed_name; - new_node->data = name; - - if (ldns_rbtree_insert(zone->hashed_names, new_node) == NULL) { - - LDNS_FREE(new_node); - } - } -} - - -static ldns_rbnode_t * -ldns_dnssec_zone_find_nsec3_original(ldns_dnssec_zone *zone, ldns_rr *rr) { - ldns_rdf *hashed_name; - - hashed_name = ldns_dname_label(ldns_rr_owner(rr), 0); - if (hashed_name == NULL) { - return NULL; - } - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_NSEC3 && ! zone->_nsec3params){ - - ldns_dnssec_zone_hashed_names_from_nsec3(zone, rr); - } - if (zone->hashed_names == NULL) { - ldns_rdf_deep_free(hashed_name); - return NULL; - } - return ldns_rbtree_search(zone->hashed_names, hashed_name); -} - -ldns_status -ldns_dnssec_zone_add_rr(ldns_dnssec_zone *zone, ldns_rr *rr) -{ - ldns_status result = LDNS_STATUS_OK; - ldns_dnssec_name *cur_name; - ldns_rbnode_t *cur_node; - ldns_rr_type type_covered = 0; - - if (!zone || !rr) { - return LDNS_STATUS_ERR; - } - - if (!zone->names) { - zone->names = ldns_rbtree_create(ldns_dname_compare_v); - if(!zone->names) return LDNS_STATUS_MEM_ERR; - } - - /* we need the original of the hashed name if this is - an NSEC3, or an RRSIG that covers an NSEC3 */ - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG) { - type_covered = ldns_rdf2rr_type(ldns_rr_rrsig_typecovered(rr)); - } - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_NSEC3 || - type_covered == LDNS_RR_TYPE_NSEC3) { - cur_node = ldns_dnssec_zone_find_nsec3_original(zone, rr); - if (!cur_node) { - return LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND; - } - } else { - cur_node = ldns_rbtree_search(zone->names, ldns_rr_owner(rr)); - } - if (!cur_node) { - /* add */ - cur_name = ldns_dnssec_name_new_frm_rr(rr); - if(!cur_name) return LDNS_STATUS_MEM_ERR; - cur_node = LDNS_MALLOC(ldns_rbnode_t); - if(!cur_node) { - ldns_dnssec_name_free(cur_name); - return LDNS_STATUS_MEM_ERR; - } - cur_node->key = ldns_rr_owner(rr); - cur_node->data = cur_name; - (void)ldns_rbtree_insert(zone->names, cur_node); - ldns_dnssec_name_make_hashed_name(zone, cur_name, NULL); - } else { - cur_name = (ldns_dnssec_name *) cur_node->data; - result = ldns_dnssec_name_add_rr(cur_name, rr); - } - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) { - zone->soa = cur_name; - } - return result; -} - -void -ldns_dnssec_zone_names_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_rbtree_t *tree, - bool print_soa) -{ - ldns_rbnode_t *node; - ldns_dnssec_name *name; - - node = ldns_rbtree_first(tree); - while (node != LDNS_RBTREE_NULL) { - name = (ldns_dnssec_name *) node->data; - ldns_dnssec_name_print_soa_fmt(out, fmt, name, print_soa); - if ((fmt->flags & LDNS_COMMENT_LAYOUT)) - fprintf(out, ";\n"); - node = ldns_rbtree_next(node); - } -} - -void -ldns_dnssec_zone_names_print(FILE *out, const ldns_rbtree_t *tree, bool print_soa) -{ - ldns_dnssec_zone_names_print_fmt(out, ldns_output_format_default, - tree, print_soa); -} - -void -ldns_dnssec_zone_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_dnssec_zone *zone) -{ - if (zone) { - if (zone->soa) { - if ((fmt->flags & LDNS_COMMENT_LAYOUT)) { - fprintf(out, ";; Zone: "); - ldns_rdf_print(out, ldns_dnssec_name_name( - zone->soa)); - fprintf(out, "\n;\n"); - } - ldns_dnssec_rrsets_print_fmt(out, fmt, - ldns_dnssec_name_find_rrset( - zone->soa, - LDNS_RR_TYPE_SOA), - false); - if ((fmt->flags & LDNS_COMMENT_LAYOUT)) - fprintf(out, ";\n"); - } - - if (zone->names) { - ldns_dnssec_zone_names_print_fmt(out, fmt, - zone->names, false); - } - } -} - -void -ldns_dnssec_zone_print(FILE *out, const ldns_dnssec_zone *zone) -{ - ldns_dnssec_zone_print_fmt(out, ldns_output_format_default, zone); -} - -static ldns_status -ldns_dnssec_zone_add_empty_nonterminals_nsec3( - ldns_dnssec_zone *zone, ldns_rbtree_t *nsec3s) -{ - ldns_dnssec_name *new_name; - ldns_rdf *cur_name; - ldns_rdf *next_name; - ldns_rbnode_t *cur_node, *next_node, *new_node; - - /* for the detection */ - uint16_t i, cur_label_count, next_label_count; - uint16_t soa_label_count = 0; - ldns_rdf *l1, *l2; - int lpos; - - if (!zone) { - return LDNS_STATUS_ERR; - } - if (zone->soa && zone->soa->name) { - soa_label_count = ldns_dname_label_count(zone->soa->name); - } - - cur_node = ldns_rbtree_first(zone->names); - while (cur_node != LDNS_RBTREE_NULL) { - next_node = ldns_rbtree_next(cur_node); - - /* skip glue */ - while (next_node != LDNS_RBTREE_NULL && - next_node->data && - ((ldns_dnssec_name *)next_node->data)->is_glue - ) { - next_node = ldns_rbtree_next(next_node); - } - - if (next_node == LDNS_RBTREE_NULL) { - next_node = ldns_rbtree_first(zone->names); - } - if (! cur_node->data || ! next_node->data) { - return LDNS_STATUS_ERR; - } - cur_name = ((ldns_dnssec_name *)cur_node->data)->name; - next_name = ((ldns_dnssec_name *)next_node->data)->name; - cur_label_count = ldns_dname_label_count(cur_name); - next_label_count = ldns_dname_label_count(next_name); - - /* Since the names are in canonical order, we can - * recognize empty non-terminals by their labels; - * every label after the first one on the next owner - * name is a non-terminal if it either does not exist - * in the current name or is different from the same - * label in the current name (counting from the end) - */ - for (i = 1; i < next_label_count - soa_label_count; i++) { - lpos = (int)cur_label_count - (int)next_label_count + (int)i; - if (lpos >= 0) { - l1 = ldns_dname_clone_from(cur_name, (uint8_t)lpos); - } else { - l1 = NULL; - } - l2 = ldns_dname_clone_from(next_name, i); - - if (!l1 || ldns_dname_compare(l1, l2) != 0) { - /* We have an empty nonterminal, add it to the - * tree - */ - ldns_rbnode_t *node = NULL; - ldns_rdf *ent_name; - - if (!(ent_name = ldns_dname_clone_from( - next_name, i))) { - - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - return LDNS_STATUS_MEM_ERR; - } - - if (nsec3s && zone->_nsec3params) { - ldns_rdf *ent_hashed_name; - - if (!(ent_hashed_name = - ldns_nsec3_hash_name_frm_nsec3( - zone->_nsec3params, - ent_name))) { - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - ldns_rdf_deep_free(ent_name); - return LDNS_STATUS_MEM_ERR; - } - node = ldns_rbtree_search(nsec3s, - ent_hashed_name); - if (!node) { - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - ldns_rdf_deep_free(ent_name); - continue; - } - } - new_name = ldns_dnssec_name_new(); - if (!new_name) { - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - ldns_rdf_deep_free(ent_name); - return LDNS_STATUS_MEM_ERR; - } - new_name->name = ent_name; - new_name->name_alloced = true; - new_node = LDNS_MALLOC(ldns_rbnode_t); - if (!new_node) { - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - ldns_dnssec_name_free(new_name); - return LDNS_STATUS_MEM_ERR; - } - new_node->key = new_name->name; - new_node->data = new_name; - (void)ldns_rbtree_insert(zone->names, new_node); - ldns_dnssec_name_make_hashed_name( - zone, new_name, NULL); - if (node) - (void) ldns_dnssec_zone_add_rr(zone, - (ldns_rr *)node->data); - } - ldns_rdf_deep_free(l1); - ldns_rdf_deep_free(l2); - } - - /* we might have inserted a new node after - * the current one so we can't just use next() - */ - if (next_node != ldns_rbtree_first(zone->names)) { - cur_node = next_node; - } else { - cur_node = LDNS_RBTREE_NULL; - } - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_dnssec_zone_add_empty_nonterminals(ldns_dnssec_zone *zone) -{ - return ldns_dnssec_zone_add_empty_nonterminals_nsec3(zone, NULL); -} - -bool -ldns_dnssec_zone_is_nsec3_optout(const ldns_dnssec_zone* zone) -{ - ldns_rr* nsec3; - ldns_rbnode_t* node; - - if (ldns_dnssec_name_find_rrset(zone->soa, LDNS_RR_TYPE_NSEC3PARAM)) { - node = ldns_rbtree_first(zone->names); - while (node != LDNS_RBTREE_NULL) { - nsec3 = ((ldns_dnssec_name*)node->data)->nsec; - if (nsec3 &&ldns_rr_get_type(nsec3) - == LDNS_RR_TYPE_NSEC3 && - ldns_nsec3_optout(nsec3)) { - return true; - } - node = ldns_rbtree_next(node); - } - } - return false; -} diff --git a/ldns/duration.c b/ldns/duration.c deleted file mode 100644 index 0a8d79b..0000000 --- a/ldns/duration.c +++ /dev/null @@ -1,351 +0,0 @@ -/* - * $Id: duration.c 4518 2011-02-24 15:39:09Z matthijs $ - * - * Copyright (c) 2009 NLNet Labs. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * - * This file is copied from the OpenDNSSEC source repository - * and only slightly adapted to make it fit. - */ - -/** - * - * Durations. - */ - -#include <ldns/config.h> -#include <ldns/duration.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - - -/** - * Create a new 'instant' duration. - * - */ -ldns_duration_type* -ldns_duration_create(void) -{ - ldns_duration_type* duration; - - duration = malloc(sizeof(ldns_duration_type)); - if (!duration) { - return NULL; - } - duration->years = 0; - duration->months = 0; - duration->weeks = 0; - duration->days = 0; - duration->hours = 0; - duration->minutes = 0; - duration->seconds = 0; - return duration; -} - - -/** - * Compare durations. - * - */ -int -ldns_duration_compare(const ldns_duration_type* d1, const ldns_duration_type* d2) -{ - if (!d1 && !d2) { - return 0; - } - if (!d1 || !d2) { - return d1?-1:1; - } - - if (d1->years != d2->years) { - return (int) (d1->years - d2->years); - } - if (d1->months != d2->months) { - return (int) (d1->months - d2->months); - } - if (d1->weeks != d2->weeks) { - return (int) (d1->weeks - d2->weeks); - } - if (d1->days != d2->days) { - return (int) (d1->days - d2->days); - } - if (d1->hours != d2->hours) { - return (int) (d1->hours - d2->hours); - } - if (d1->minutes != d2->minutes) { - return (int) (d1->minutes - d2->minutes); - } - if (d1->seconds != d2->seconds) { - return (int) (d1->seconds - d2->seconds); - } - - return 0; -} - - -/** - * Create a duration from string. - * - */ -ldns_duration_type* -ldns_duration_create_from_string(const char* str) -{ - ldns_duration_type* duration = ldns_duration_create(); - char* P, *X, *T, *W; - int not_weeks = 0; - - if (!duration) { - return NULL; - } - if (!str) { - return duration; - } - - P = strchr(str, 'P'); - if (!P) { - ldns_duration_cleanup(duration); - return NULL; - } - - T = strchr(str, 'T'); - X = strchr(str, 'Y'); - if (X) { - duration->years = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - X = strchr(str, 'M'); - if (X && (!T || (size_t) (X-P) < (size_t) (T-P))) { - duration->months = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - X = strchr(str, 'D'); - if (X) { - duration->days = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - if (T) { - str = T; - not_weeks = 1; - } - X = strchr(str, 'H'); - if (X && T) { - duration->hours = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - X = strrchr(str, 'M'); - if (X && T && (size_t) (X-P) > (size_t) (T-P)) { - duration->minutes = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - X = strchr(str, 'S'); - if (X && T) { - duration->seconds = (time_t) atoi(str+1); - str = X; - not_weeks = 1; - } - - W = strchr(str, 'W'); - if (W) { - if (not_weeks) { - ldns_duration_cleanup(duration); - return NULL; - } else { - duration->weeks = (time_t) atoi(str+1); - } - } - return duration; -} - - -/** - * Get the number of digits in a number. - * - */ -static size_t -digits_in_number(time_t duration) -{ - unsigned int i = (unsigned int) duration; - size_t n = 1; - - while (i >= 100000000) { - n += 8; - i /= 100000000; - } - if (i >= 10000) { n += 4; i /= 10000; } - if (i >= 100 ) { n += 2; i /= 100; } - if (i >= 10 ) { n += 1; } - return n; -} - - -/** - * Convert a duration to a string. - * - */ -char* -ldns_duration2string(const ldns_duration_type* duration) -{ - char* str = NULL; - size_t count = 2; - int T = 0; - char num[sizeof(unsigned int) + 2]; - - if (!duration) { - return NULL; - } - - if (duration->years > 0) { - count = count + 1 + digits_in_number(duration->years); - } - if (duration->months > 0) { - count = count + 1 + digits_in_number(duration->months); - } - if (duration->weeks > 0) { - count = count + 1 + digits_in_number(duration->weeks); - } - if (duration->days > 0) { - count = count + 1 + digits_in_number(duration->days); - } - if (duration->hours > 0) { - count = count + 1 + digits_in_number(duration->hours); - T = 1; - } - if (duration->minutes > 0) { - count = count + 1 + digits_in_number(duration->minutes); - T = 1; - } - if (duration->seconds > 0) { - count = count + 1 + digits_in_number(duration->seconds); - T = 1; - } - if (T) { - count++; - } - - if (!(str = (char*) calloc(count, sizeof(char)))) - return NULL; - str[0] = 'P'; - str[1] = '\0'; - - if (duration->years > 0) { - count = digits_in_number(duration->years); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uY", (unsigned int) duration->years); - str = strncat(str, num, count+2); - } - if (duration->months > 0) { - count = digits_in_number(duration->months); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uM", (unsigned int) duration->months); - str = strncat(str, num, count+2); - } - if (duration->weeks > 0) { - count = digits_in_number(duration->weeks); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uW", (unsigned int) duration->weeks); - str = strncat(str, num, count+2); - } - if (duration->days > 0) { - count = digits_in_number(duration->days); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uD", (unsigned int) duration->days); - str = strncat(str, num, count+2); - } - if (T) { - str = strcat(str, "T"); - } - if (duration->hours > 0) { - count = digits_in_number(duration->hours); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uH", (unsigned int) duration->hours); - str = strncat(str, num, count+2); - } - if (duration->minutes > 0) { - count = digits_in_number(duration->minutes); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uM", (unsigned int) duration->minutes); - str = strncat(str, num, count+2); - } - if (duration->seconds > 0) { - count = digits_in_number(duration->seconds); - assert(count <= sizeof(num) - 2); - snprintf(num, count+2, "%uS", (unsigned int) duration->seconds); - str = strncat(str, num, count+2); - } - return str; -} - - -/** - * Convert a duration to a time. - * - */ -time_t -ldns_duration2time(const ldns_duration_type* duration) -{ - time_t period = 0; - - if (duration) { - period += (duration->seconds); - period += (duration->minutes)*60; - period += (duration->hours)*3600; - period += (duration->days)*86400; - period += (duration->weeks)*86400*7; - period += (duration->months)*86400*31; - period += (duration->years)*86400*365; - - /* [TODO] calculate correct number of days in this month/year */ - /* - if (duration->months || duration->years) { - } - */ - } - return period; -} - - -/** - * Clean up duration. - * - */ -void -ldns_duration_cleanup(ldns_duration_type* duration) -{ - if (!duration) { - return; - } - free(duration); - return; -} diff --git a/ldns/error.c b/ldns/error.c deleted file mode 100644 index 7943017..0000000 --- a/ldns/error.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * a error2str function to make sense of all the - * error codes we have laying ardoun - * - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -ldns_lookup_table ldns_error_str[] = { - { LDNS_STATUS_OK, "All OK" }, - { LDNS_STATUS_EMPTY_LABEL, "Empty label" }, - { LDNS_STATUS_LABEL_OVERFLOW, "Label length overflow" }, - { LDNS_STATUS_DOMAINNAME_OVERFLOW, "Domainname length overflow" }, - { LDNS_STATUS_DOMAINNAME_UNDERFLOW, "Domainname length underflow (zero length)" }, - { LDNS_STATUS_DDD_OVERFLOW, "\\DDD sequence overflow (>255)" }, - { LDNS_STATUS_PACKET_OVERFLOW, "Packet size overflow" }, - { LDNS_STATUS_INVALID_POINTER, "Invalid compression pointer" }, - { LDNS_STATUS_MEM_ERR, "General memory error" }, - { LDNS_STATUS_INTERNAL_ERR, "Internal error, this should not happen" }, - { LDNS_STATUS_SSL_ERR, "Error in SSL library" }, - { LDNS_STATUS_ERR, "General LDNS error" }, - { LDNS_STATUS_INVALID_INT, "Conversion error, integer expected" }, - { LDNS_STATUS_INVALID_IP4, "Conversion error, ip4 addr expected" }, - { LDNS_STATUS_INVALID_IP6, "Conversion error, ip6 addr expected" }, - { LDNS_STATUS_INVALID_STR, "Conversion error, string expected" }, - { LDNS_STATUS_INVALID_B32_EXT, "Conversion error, b32 ext encoding expected" }, - { LDNS_STATUS_INVALID_B64, "Conversion error, b64 encoding expected" }, - { LDNS_STATUS_INVALID_HEX, "Conversion error, hex encoding expected" }, - { LDNS_STATUS_INVALID_TIME, "Conversion error, time encoding expected" }, - { LDNS_STATUS_NETWORK_ERR, "Could not send or receive, because of network error" }, - { LDNS_STATUS_ADDRESS_ERR, "Could not start AXFR, because of address error" }, - { LDNS_STATUS_FILE_ERR, "Could not open the files" }, - { LDNS_STATUS_UNKNOWN_INET, "Unknown address family" }, - { LDNS_STATUS_NOT_IMPL, "This function is not implemented (yet), please notify the developers - or not..." }, - { LDNS_STATUS_NULL, "Supplied value pointer null" }, - { LDNS_STATUS_CRYPTO_UNKNOWN_ALGO, "Unknown cryptographic algorithm" }, - { LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL, "Cryptographic algorithm not implemented" }, - { LDNS_STATUS_CRYPTO_NO_RRSIG, "No DNSSEC signature(s)" }, - { LDNS_STATUS_CRYPTO_NO_DNSKEY, "No DNSSEC public key(s)" }, - { LDNS_STATUS_CRYPTO_TYPE_COVERED_ERR, "The signature does not cover this RRset" }, - { LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY, "No signatures found for trusted DNSSEC public key(s)" }, - { LDNS_STATUS_CRYPTO_NO_DS, "No DS record(s)" }, - { LDNS_STATUS_CRYPTO_NO_TRUSTED_DS, "Could not validate DS record(s)" }, - { LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY, "No keys with the keytag and algorithm from the RRSIG found" }, - { LDNS_STATUS_CRYPTO_VALIDATED, "Valid DNSSEC signature" }, - { LDNS_STATUS_CRYPTO_BOGUS, "Bogus DNSSEC signature" }, - { LDNS_STATUS_CRYPTO_SIG_EXPIRED, "DNSSEC signature has expired" }, - { LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED, "DNSSEC signature not incepted yet" }, - { LDNS_STATUS_CRYPTO_TSIG_BOGUS, "Bogus TSIG signature" }, - { LDNS_STATUS_CRYPTO_TSIG_ERR, "Could not create TSIG signature" }, - { LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION, "DNSSEC signature has expiration date earlier than inception date" }, - { LDNS_STATUS_ENGINE_KEY_NOT_LOADED, "Unable to load private key from engine" }, - { LDNS_STATUS_NSEC3_ERR, "Error in NSEC3 denial of existence proof" }, - { LDNS_STATUS_RES_NO_NS, "No (valid) nameservers defined in the resolver" }, - { LDNS_STATUS_RES_QUERY, "No correct query given to resolver" }, - { LDNS_STATUS_WIRE_INCOMPLETE_HEADER, "header section incomplete" }, - { LDNS_STATUS_WIRE_INCOMPLETE_QUESTION, "question section incomplete" }, - { LDNS_STATUS_WIRE_INCOMPLETE_ANSWER, "answer section incomplete" }, - { LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY, "authority section incomplete" }, - { LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL, "additional section incomplete" }, - { LDNS_STATUS_NO_DATA, "No data" }, - { LDNS_STATUS_EXISTS_ERR, "Element already exists" }, - { LDNS_STATUS_CERT_BAD_ALGORITHM, "Bad algorithm type for CERT record" }, - { LDNS_STATUS_SYNTAX_TYPE_ERR, "Syntax error, could not parse the RR's type" }, - { LDNS_STATUS_SYNTAX_CLASS_ERR, "Syntax error, could not parse the RR's class" }, - { LDNS_STATUS_SYNTAX_TTL_ERR, "Syntax error, could not parse the RR's TTL" }, - { LDNS_STATUS_SYNTAX_INCLUDE_ERR_NOTIMPL, "Syntax error, $INCLUDE not implemented" }, - { LDNS_STATUS_SYNTAX_RDATA_ERR, "Syntax error, could not parse the RR's rdata" }, - { LDNS_STATUS_SYNTAX_DNAME_ERR, "Syntax error, could not parse the RR's dname(s)" }, - { LDNS_STATUS_SYNTAX_VERSION_ERR, "Syntax error, version mismatch" }, - { LDNS_STATUS_SYNTAX_ALG_ERR, "Syntax error, algorithm unknown or non parseable" }, - { LDNS_STATUS_SYNTAX_KEYWORD_ERR, "Syntax error, unknown keyword in input" }, - { LDNS_STATUS_SYNTAX_ERR, "Syntax error, could not parse the RR" }, - { LDNS_STATUS_SYNTAX_EMPTY, "Empty line was returned" }, - { LDNS_STATUS_SYNTAX_TTL, "$TTL directive was seen in the zone" }, - { LDNS_STATUS_SYNTAX_ORIGIN, "$ORIGIN directive was seen in the zone" }, - { LDNS_STATUS_SYNTAX_INCLUDE, "$INCLUDE directive was seen in the zone" }, - { LDNS_STATUS_SYNTAX_ITERATIONS_OVERFLOW, "Iterations count for NSEC3 record higher than maximum" }, - { LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR, "Syntax error, value expected" }, - { LDNS_STATUS_SYNTAX_INTEGER_OVERFLOW, "Syntax error, integer value too large" }, - { LDNS_STATUS_SYNTAX_BAD_ESCAPE, "Syntax error, bad escape sequence" }, - { LDNS_STATUS_SOCKET_ERROR, "Error creating socket" }, - { LDNS_STATUS_DNSSEC_EXISTENCE_DENIED, "Existence denied by NSEC" }, - { LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED, "RR not covered by the given NSEC RRs" }, - { LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED, "wildcard not covered by the given NSEC RRs" }, - { LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND, "original of NSEC3 hashed name could not be found" }, - { LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG, "The RRSIG has to few rdata fields" }, - { LDNS_STATUS_MISSING_RDATA_FIELDS_KEY, "The DNSKEY has to few rdata fields" }, - { LDNS_STATUS_CRYPTO_SIG_EXPIRED_WITHIN_MARGIN, - "DNSSEC signature will expire too soon" }, - { LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED_WITHIN_MARGIN, - "DNSSEC signature not incepted long enough" }, - { LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE, - "Unknown TLSA Certificate Usage" }, - { LDNS_STATUS_DANE_UNKNOWN_SELECTOR, "Unknown TLSA Selector" }, - { LDNS_STATUS_DANE_UNKNOWN_MATCHING_TYPE, - "Unknown TLSA Matching Type" }, - { LDNS_STATUS_DANE_UNKNOWN_PROTOCOL, - "Unknown protocol. Only IPv4 and IPv6 are understood" }, - { LDNS_STATUS_DANE_UNKNOWN_TRANSPORT, - "Unknown transport. Should be one of {tcp, udp, sctp}" }, - { LDNS_STATUS_DANE_MISSING_EXTRA_CERTS, /* Trust anchor assertion */ - "More than one certificate should be provided" }, - { LDNS_STATUS_DANE_EXTRA_CERTS_NOT_USED, /* Trust anchor assertion */ - "Non of the extra certificates is used to sign the first" }, - { LDNS_STATUS_DANE_OFFSET_OUT_OF_RANGE, /* Trust anchor assertion */ - "The offset was out of range" }, - { LDNS_STATUS_DANE_INSECURE, /* Unused by library */ - "The queried resource records were insecure" }, - { LDNS_STATUS_DANE_BOGUS, /* Unused by library */ - "The queried resource records were bogus" }, - { LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH, - "The TLSA record(s) " - "did not match with the server certificate (chain)" }, - { LDNS_STATUS_DANE_NON_CA_CERTIFICATE, - "The certificate was not a CA certificate" }, - { LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE, - "Could not PKIX validate" }, - { LDNS_STATUS_DANE_PKIX_NO_SELF_SIGNED_TRUST_ANCHOR, - "The validation path " - "did not end in a self-signed certificate" }, - { LDNS_STATUS_INVALID_ILNP64, - "Conversion error, 4 colon separated hex numbers expected" }, - { LDNS_STATUS_INVALID_EUI48, - "Conversion error, 6 two character hex numbers " - "separated by dashes expected (i.e. xx-xx-xx-xx-xx-xx" }, - { LDNS_STATUS_INVALID_EUI64, - "Conversion error, 8 two character hex numbers " - "separated by dashes expected (i.e. xx-xx-xx-xx-xx-xx-xx-xx" }, - { LDNS_STATUS_WIRE_RDATA_ERR, "invalid rdata in wire format" }, - { LDNS_STATUS_INVALID_TAG, - "Conversion error, a non-zero sequence of US-ASCII letters " - "and numbers in lower case expected" }, - { LDNS_STATUS_TYPE_NOT_IN_BITMAP, - "The RR type bitmap rdata field did not have " - "a bit reserved for the specific RR type" }, - { LDNS_STATUS_INVALID_RDF_TYPE, - "The rdata field was not of the expected type" }, - { LDNS_STATUS_RDATA_OVERFLOW, "Rdata size overflow" }, - { LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR, - "Syntax error, superfluous text present" }, - { LDNS_STATUS_NSEC3_DOMAINNAME_OVERFLOW, - "The NSEC3 domainname length overflow" }, -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) - { LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA, - "ldns needs to be linked with OpenSSL >= 1.1.0 to be able " - "to verify the DANE-TA usage type." }, -#else - { LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA, - "ldns depends on the availability of the SSL_get0_dane() and " - "X509_STORE_CTX_set0_dane() functions within OpenSSL >= 1.1.0 " - "to be able to verify the DANE-TA usage type." }, -#endif - { 0, NULL } -}; - -const char * -ldns_get_errorstr_by_id(ldns_status err) -{ - ldns_lookup_table *lt; - - lt = ldns_lookup_by_id(ldns_error_str, err); - - if (lt) { - return lt->name; - } - return NULL; -} diff --git a/ldns/higher.c b/ldns/higher.c deleted file mode 100644 index 4ca347b..0000000 --- a/ldns/higher.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * higher.c - * - * Specify some higher level functions that would - * be useful to would be developers - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#ifdef HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/sha.h> -#endif /* HAVE_SSL */ - -ldns_rr_list * -ldns_get_rr_list_addr_by_name(ldns_resolver *res, const ldns_rdf *name, - ldns_rr_class c, uint16_t flags) -{ - ldns_pkt *pkt; - ldns_rr_list *aaaa; - ldns_rr_list *a; - ldns_rr_list *result = NULL; - ldns_rr_list *hostsfilenames; - size_t i; - uint8_t ip6; - - a = NULL; - aaaa = NULL; - result = NULL; - - if (!res) { - return NULL; - } - if (ldns_rdf_get_type(name) != LDNS_RDF_TYPE_DNAME) { - return NULL; - } - - ip6 = ldns_resolver_ip6(res); /* we use INET_ANY here, save - what was there */ - - ldns_resolver_set_ip6(res, LDNS_RESOLV_INETANY); - - hostsfilenames = ldns_get_rr_list_hosts_frm_file(NULL); - for (i = 0; i < ldns_rr_list_rr_count(hostsfilenames); i++) { - if (ldns_rdf_compare(name, - ldns_rr_owner(ldns_rr_list_rr(hostsfilenames, - i))) == 0) { - if (!result) { - result = ldns_rr_list_new(); - } - ldns_rr_list_push_rr(result, - ldns_rr_clone(ldns_rr_list_rr(hostsfilenames, i))); - } - } - ldns_rr_list_deep_free(hostsfilenames); - - if (result) { - return result; - } - - /* add the RD flags, because we want an answer */ - pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_AAAA, c, flags | LDNS_RD); - if (pkt) { - /* extract the data we need */ - aaaa = ldns_pkt_rr_list_by_type(pkt, LDNS_RR_TYPE_AAAA, - LDNS_SECTION_ANSWER); - ldns_pkt_free(pkt); - } - - pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_A, c, flags | LDNS_RD); - if (pkt) { - /* extract the data we need */ - a = ldns_pkt_rr_list_by_type(pkt, LDNS_RR_TYPE_A, LDNS_SECTION_ANSWER); - ldns_pkt_free(pkt); - } - ldns_resolver_set_ip6(res, ip6); - - if (aaaa && a) { - result = ldns_rr_list_cat_clone(aaaa, a); - ldns_rr_list_deep_free(aaaa); - ldns_rr_list_deep_free(a); - return result; - } - - if (aaaa) { - result = ldns_rr_list_clone(aaaa); - } - - if (a) { - result = ldns_rr_list_clone(a); - } - - ldns_rr_list_deep_free(aaaa); - ldns_rr_list_deep_free(a); - return result; -} - -ldns_rr_list * -ldns_get_rr_list_name_by_addr(ldns_resolver *res, const ldns_rdf *addr, - ldns_rr_class c, uint16_t flags) -{ - ldns_pkt *pkt; - ldns_rr_list *names; - ldns_rdf *name; - - names = NULL; - - if (!res || !addr) { - return NULL; - } - - if (ldns_rdf_get_type(addr) != LDNS_RDF_TYPE_A && - ldns_rdf_get_type(addr) != LDNS_RDF_TYPE_AAAA) { - return NULL; - } - - name = ldns_rdf_address_reverse(addr); - - /* add the RD flags, because we want an answer */ - pkt = ldns_resolver_query(res, name, LDNS_RR_TYPE_PTR, c, flags | LDNS_RD); - ldns_rdf_deep_free(name); - if (pkt) { - /* extract the data we need */ - names = ldns_pkt_rr_list_by_type(pkt, - LDNS_RR_TYPE_PTR, LDNS_SECTION_ANSWER); - ldns_pkt_free(pkt); - } - return names; -} - -/* read a line, put it in a buffer, parse the buffer */ -ldns_rr_list * -ldns_get_rr_list_hosts_frm_fp(FILE *fp) -{ - return ldns_get_rr_list_hosts_frm_fp_l(fp, NULL); -} - -ldns_rr_list * -ldns_get_rr_list_hosts_frm_fp_l(FILE *fp, int *line_nr) -{ - ssize_t i, j; - size_t cnt; - char *line; - char *word; - char *addr; - char *rr_str; - ldns_buffer *linebuf; - ldns_rr *rr; - ldns_rr_list *list; - ldns_rdf *tmp; - bool ip6; - ldns_status parse_result; - - line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - word = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - addr = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - rr_str = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - ip6 = false; - list = ldns_rr_list_new(); - rr = NULL; - if(!line || !word || !addr || !rr_str || !list) { - LDNS_FREE(line); - LDNS_FREE(word); - LDNS_FREE(addr); - LDNS_FREE(rr_str); - ldns_rr_list_free(list); - return NULL; - } - - for(i = ldns_fget_token_l(fp, line, "\n", LDNS_MAX_LINELEN, line_nr); - i > 0; i = ldns_fget_token_l(fp, line, "\n", LDNS_MAX_LINELEN, line_nr)) { - /* # is comment */ - if (line[0] == '#') { - continue; - } - /* put it in a buffer for further processing */ - linebuf = LDNS_MALLOC(ldns_buffer); - if(!linebuf) { - LDNS_FREE(line); - LDNS_FREE(word); - LDNS_FREE(addr); - LDNS_FREE(rr_str); - ldns_rr_list_deep_free(list); - return NULL; - } - - ldns_buffer_new_frm_data(linebuf, line, (size_t) i); - for(cnt = 0, j = ldns_bget_token(linebuf, word, LDNS_PARSE_NO_NL, LDNS_MAX_LINELEN); - j > 0; - j = ldns_bget_token(linebuf, word, LDNS_PARSE_NO_NL, LDNS_MAX_LINELEN), cnt++) { - if (cnt == 0) { - /* the address */ - if ((tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_AAAA, - word))) { - /* ip6 */ - ldns_rdf_deep_free(tmp); - ip6 = true; - } else { - if ((tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, - word))) { - /* ip4 */ - ldns_rdf_deep_free(tmp); - ip6 = false; - } else { - /* kaput */ - break; - } - } - (void)strlcpy(addr, word, LDNS_MAX_LINELEN+1); - } else { - /* Stop parsing line when a comment begins. */ - if (word[0] == '#') - break; - /* la al la la */ - if (ip6) { - snprintf(rr_str, LDNS_MAX_LINELEN, - "%s IN AAAA %s", word, addr); - } else { - snprintf(rr_str, LDNS_MAX_LINELEN, - "%s IN A %s", word, addr); - } - parse_result = ldns_rr_new_frm_str(&rr, rr_str, 0, NULL, NULL); - if (parse_result == LDNS_STATUS_OK && ldns_rr_owner(rr) && ldns_rr_rd_count(rr) > 0) { - ldns_rr_list_push_rr(list, ldns_rr_clone(rr)); - ldns_rr_free(rr); - } - } - } - ldns_buffer_free(linebuf); - } - LDNS_FREE(line); - LDNS_FREE(word); - LDNS_FREE(addr); - LDNS_FREE(rr_str); - return list; -} - -ldns_rr_list * -ldns_get_rr_list_hosts_frm_file(char *filename) -{ - ldns_rr_list *names; - FILE *fp; - - if (!filename) { - fp = fopen(LDNS_RESOLV_HOSTS, "r"); - - } else { - fp = fopen(filename, "r"); - } - if (!fp) { - return NULL; - } - - names = ldns_get_rr_list_hosts_frm_fp(fp); - fclose(fp); - return names; -} - -uint16_t -ldns_getaddrinfo(ldns_resolver *res, const ldns_rdf *node, - ldns_rr_class c, ldns_rr_list **ret) -{ - ldns_rdf_type t; - uint16_t names_found; - ldns_resolver *r; - ldns_status s; - - t = ldns_rdf_get_type(node); - names_found = 0; - r = res; - - if (res == NULL) { - /* prepare a new resolver, using /etc/resolv.conf as a guide */ - s = ldns_resolver_new_frm_file(&r, NULL); - if (s != LDNS_STATUS_OK) { - return 0; - } - } - - if (t == LDNS_RDF_TYPE_DNAME) { - /* we're asked to query for a name */ - *ret = ldns_get_rr_list_addr_by_name(r, node, c, 0); - names_found = ldns_rr_list_rr_count(*ret); - } - - if (t == LDNS_RDF_TYPE_A || t == LDNS_RDF_TYPE_AAAA) { - /* an address */ - *ret = ldns_get_rr_list_name_by_addr(r, node, c, 0); - names_found = ldns_rr_list_rr_count(*ret); - } - - if (res == NULL) { - ldns_resolver_deep_free(r); - } - - return names_found; -} - -bool -ldns_nsec_type_check(const ldns_rr *nsec, ldns_rr_type t) -{ - switch (ldns_rr_get_type(nsec)) { - case LDNS_RR_TYPE_NSEC : if (ldns_rr_rd_count(nsec) < 2) { - return false; - } - return ldns_nsec_bitmap_covers_type( - ldns_rr_rdf(nsec, 1), t); - - case LDNS_RR_TYPE_NSEC3 : if (ldns_rr_rd_count(nsec) < 6) { - return false; - } - return ldns_nsec_bitmap_covers_type( - ldns_rr_rdf(nsec, 5), t); - - default : return false; - } -} - -void -ldns_print_rr_rdf(FILE *fp, ldns_rr *r, int rdfnum, ...) -{ - int16_t rdf; - ldns_rdf *rd; - va_list va_rdf; - va_start(va_rdf, rdfnum); - - for (rdf = (int16_t)rdfnum; rdf != -1; rdf = (int16_t)va_arg(va_rdf, int)) - { - rd = ldns_rr_rdf(r, rdf); - if (!rd) { - continue; - } else { - ldns_rdf_print(fp, rd); - fprintf(fp, " "); /* not sure if we want to do this */ - } - } - va_end(va_rdf); -} - diff --git a/ldns/host2str.c b/ldns/host2str.c deleted file mode 100644 index 3ca23c2..0000000 --- a/ldns/host2str.c +++ /dev/null @@ -1,2709 +0,0 @@ -/* - * host2str.c - * - * conversion routines from the host format - * to the presentation format (strings) - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <limits.h> - -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#include <time.h> -#include <sys/time.h> - -#ifdef HAVE_SSL -#include <openssl/bn.h> -#include <openssl/rsa.h> -#ifdef USE_DSA -#include <openssl/dsa.h> -#endif -#endif - -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN 16 -#endif -#ifndef INET6_ADDRSTRLEN -#define INET6_ADDRSTRLEN 46 -#endif - -/* lookup tables for standard DNS stuff */ - -/* Taken from RFC 2535, section 7. */ -ldns_lookup_table ldns_algorithms[] = { - { LDNS_RSAMD5, "RSAMD5" }, - { LDNS_DH, "DH" }, - { LDNS_DSA, "DSA" }, - { LDNS_ECC, "ECC" }, - { LDNS_RSASHA1, "RSASHA1" }, - { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" }, - { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" }, -#ifdef USE_SHA2 - { LDNS_RSASHA256, "RSASHA256"}, - { LDNS_RSASHA512, "RSASHA512"}, -#endif -#ifdef USE_GOST - { LDNS_ECC_GOST, "ECC-GOST"}, -#endif -#ifdef USE_ECDSA - { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"}, - { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"}, -#endif -#ifdef USE_ED25519 - { LDNS_ED25519, "ED25519"}, -#endif -#ifdef USE_ED448 - { LDNS_ED448, "ED448"}, -#endif - { LDNS_INDIRECT, "INDIRECT" }, - { LDNS_PRIVATEDNS, "PRIVATEDNS" }, - { LDNS_PRIVATEOID, "PRIVATEOID" }, - { 0, NULL } -}; - -/* Taken from RFC 4398 */ -ldns_lookup_table ldns_cert_algorithms[] = { - { LDNS_CERT_PKIX, "PKIX" }, - { LDNS_CERT_SPKI, "SPKI" }, - { LDNS_CERT_PGP, "PGP" }, - { LDNS_CERT_IPKIX, "IPKIX" }, - { LDNS_CERT_ISPKI, "ISPKI" }, - { LDNS_CERT_IPGP, "IPGP" }, - { LDNS_CERT_ACPKIX, "ACPKIX" }, - { LDNS_CERT_IACPKIX, "IACPKIX" }, - { LDNS_CERT_URI, "URI" }, - { LDNS_CERT_OID, "OID" }, - { 0, NULL } -}; - -/* classes */ -ldns_lookup_table ldns_rr_classes[] = { - { LDNS_RR_CLASS_IN, "IN" }, - { LDNS_RR_CLASS_CH, "CH" }, - { LDNS_RR_CLASS_HS, "HS" }, - { LDNS_RR_CLASS_NONE, "NONE" }, - { LDNS_RR_CLASS_ANY, "ANY" }, - { 0, NULL } -}; - -/* if these are used elsewhere */ -ldns_lookup_table ldns_rcodes[] = { - { LDNS_RCODE_NOERROR, "NOERROR" }, - { LDNS_RCODE_FORMERR, "FORMERR" }, - { LDNS_RCODE_SERVFAIL, "SERVFAIL" }, - { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" }, - { LDNS_RCODE_NOTIMPL, "NOTIMPL" }, - { LDNS_RCODE_REFUSED, "REFUSED" }, - { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" }, - { LDNS_RCODE_YXRRSET, "YXRRSET" }, - { LDNS_RCODE_NXRRSET, "NXRRSET" }, - { LDNS_RCODE_NOTAUTH, "NOTAUTH" }, - { LDNS_RCODE_NOTZONE, "NOTZONE" }, - { 0, NULL } -}; - -ldns_lookup_table ldns_opcodes[] = { - { LDNS_PACKET_QUERY, "QUERY" }, - { LDNS_PACKET_IQUERY, "IQUERY" }, - { LDNS_PACKET_STATUS, "STATUS" }, - { LDNS_PACKET_NOTIFY, "NOTIFY" }, - { LDNS_PACKET_UPDATE, "UPDATE" }, - { 0, NULL } -}; - -const ldns_output_format ldns_output_format_nocomments_record = { 0, NULL }; -const ldns_output_format *ldns_output_format_nocomments - = &ldns_output_format_nocomments_record; -const ldns_output_format ldns_output_format_onlykeyids_record = { - LDNS_COMMENT_KEY, NULL -}; -const ldns_output_format *ldns_output_format_onlykeyids - = &ldns_output_format_onlykeyids_record; -const ldns_output_format *ldns_output_format_default - = &ldns_output_format_onlykeyids_record; - -const ldns_output_format ldns_output_format_bubblebabble_record = { - LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL -}; -const ldns_output_format *ldns_output_format_bubblebabble - = &ldns_output_format_bubblebabble_record; - -static bool -ldns_output_format_covers_type(const ldns_output_format* fmt, ldns_rr_type t) -{ - return fmt && (fmt->flags & LDNS_FMT_RFC3597) && - ((ldns_output_format_storage*)fmt)->bitmap && - ldns_nsec_bitmap_covers_type( - ((ldns_output_format_storage*)fmt)->bitmap, t); -} - -ldns_status -ldns_output_format_set_type(ldns_output_format* fmt, ldns_rr_type t) -{ - ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt; - ldns_status s; - - assert(fmt != NULL); - - if (!(fmt_st->flags & LDNS_FMT_RFC3597)) { - ldns_output_format_set(fmt, LDNS_FMT_RFC3597); - } - if (! fmt_st->bitmap) { - s = ldns_rdf_bitmap_known_rr_types_space(&fmt_st->bitmap); - if (s != LDNS_STATUS_OK) { - return s; - } - } - return ldns_nsec_bitmap_set_type(fmt_st->bitmap, t); -} - -ldns_status -ldns_output_format_clear_type(ldns_output_format* fmt, ldns_rr_type t) -{ - ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt; - ldns_status s; - - assert(fmt != NULL); - - if (!(fmt_st->flags & LDNS_FMT_RFC3597)) { - ldns_output_format_set(fmt, LDNS_FMT_RFC3597); - } - if (! fmt_st->bitmap) { - s = ldns_rdf_bitmap_known_rr_types(&fmt_st->bitmap); - if (s != LDNS_STATUS_OK) { - return s; - } - } - return ldns_nsec_bitmap_clear_type(fmt_st->bitmap, t); -} - -ldns_status -ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode) -{ - ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode); - if (lt && lt->name) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "OPCODE%u", opcode); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode) -{ - ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode); - if (lt && lt->name) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "RCODE%u", rcode); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_algorithm2buffer_str(ldns_buffer *output, - ldns_algorithm algorithm) -{ - ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms, - algorithm); - if (lt && lt->name) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "ALG%u", algorithm); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_cert_algorithm2buffer_str(ldns_buffer *output, - ldns_cert_algorithm cert_algorithm) -{ - ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms, - cert_algorithm); - if (lt && lt->name) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "CERT_ALG%u", - cert_algorithm); - } - return ldns_buffer_status(output); -} - -char * -ldns_pkt_opcode2str(ldns_pkt_opcode opcode) -{ - char *str; - ldns_buffer *buf; - - buf = ldns_buffer_new(12); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - - ldns_buffer_free(buf); - return str; -} - -char * -ldns_pkt_rcode2str(ldns_pkt_rcode rcode) -{ - char *str; - ldns_buffer *buf; - - buf = ldns_buffer_new(10); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - - ldns_buffer_free(buf); - return str; -} - -char * -ldns_pkt_algorithm2str(ldns_algorithm algorithm) -{ - char *str; - ldns_buffer *buf; - - buf = ldns_buffer_new(10); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_algorithm2buffer_str(buf, algorithm) - == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - - ldns_buffer_free(buf); - return str; -} - -char * -ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm) -{ - char *str; - ldns_buffer *buf; - - buf = ldns_buffer_new(10); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm) - == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - - ldns_buffer_free(buf); - return str; -} - - -/* do NOT pass compressed data here :p */ -ldns_status -ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname) -{ - /* can we do with 1 pos var? or without at all? */ - uint8_t src_pos = 0; - uint8_t len; - uint8_t *data; - uint8_t i; - unsigned char c; - - data = (uint8_t*)ldns_rdf_data(dname); - len = data[src_pos]; - - if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) { - /* too large, return */ - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - - /* special case: root label */ - if (1 == ldns_rdf_size(dname)) { - ldns_buffer_printf(output, "."); - } else { - while ((len > 0) && src_pos < ldns_rdf_size(dname)) { - src_pos++; - for(i = 0; i < len; i++) { - /* paranoia check for various 'strange' - characters in dnames - */ - c = (unsigned char) data[src_pos]; - if(c == '.' || c == ';' || - c == '(' || c == ')' || - c == '\\') { - ldns_buffer_printf(output, "\\%c", - data[src_pos]); - } else if (!(isascii(c) && isgraph(c))) { - ldns_buffer_printf(output, "\\%03u", - data[src_pos]); - } else { - ldns_buffer_printf(output, "%c", data[src_pos]); - } - src_pos++; - } - - if (src_pos < ldns_rdf_size(dname)) { - ldns_buffer_printf(output, "."); - } - len = data[src_pos]; - } - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint8_t data = ldns_rdf_data(rdf)[0]; - ldns_buffer_printf(output, "%lu", (unsigned long) data); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); - ldns_buffer_printf(output, "%lu", (unsigned long) data); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf)); - ldns_buffer_printf(output, "%lu", (unsigned long) data); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* create a YYYYMMDDHHMMSS string if possible */ - struct tm tm; - char date_buf[16]; - - memset(&tm, 0, sizeof(tm)); - if (ldns_serial_arithmitics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm) - && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) { - ldns_buffer_printf(output, "%s", date_buf); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf) -{ - char str[INET_ADDRSTRLEN]; - - if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) { - ldns_buffer_printf(output, "%s", str); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf) -{ - char str[INET6_ADDRSTRLEN]; - - if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) { - ldns_buffer_printf(output, "%s", str); - } - - return ldns_buffer_status(output); -} - -static void -ldns_characters2buffer_str(ldns_buffer* output, - size_t amount, const uint8_t* characters) -{ - uint8_t ch; - while (amount > 0) { - ch = *characters++; - if (isprint((int)ch) || ch == '\t') { - if (ch == '\"' || ch == '\\') - ldns_buffer_printf(output, "\\%c", ch); - else - ldns_buffer_printf(output, "%c", ch); - } else { - ldns_buffer_printf(output, "\\%03u", - (unsigned)(uint8_t) ch); - } - amount--; - } -} - -ldns_status -ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf) -{ - if(ldns_rdf_size(rdf) < 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - if((int)ldns_rdf_size(rdf) < (int)ldns_rdf_data(rdf)[0] + 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output, "\""); - ldns_characters2buffer_str(output, - ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf) + 1); - ldns_buffer_printf(output, "\""); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf) -{ - size_t size; - char *b64; - - if (ldns_rdf_size(rdf) == 0) { - ldns_buffer_printf(output, "0"); - return ldns_buffer_status(output); - } else - size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf)); - - if (!(b64 = LDNS_XMALLOC(char, size))) - return LDNS_STATUS_MEM_ERR; - - if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) { - ldns_buffer_printf(output, "%s", b64); - } - LDNS_FREE(b64); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf) -{ - size_t size; - char *b32; - if(ldns_rdf_size(rdf) == 0) - return LDNS_STATUS_OK; - /* remove -1 for the b32-hash-len octet */ - size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1); - /* add one for the end nul for the string */ - b32 = LDNS_XMALLOC(char, size + 1); - if(!b32) return LDNS_STATUS_MEM_ERR; - size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1, - ldns_rdf_size(rdf) - 1, b32, size+1); - if (size > 0) { - ldns_buffer_printf(output, "%s", b32); - } - LDNS_FREE(b32); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf) -{ - size_t i; - for (i = 0; i < ldns_rdf_size(rdf); i++) { - ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]); - } - - return ldns_buffer_status(output); -} - -static ldns_status -ldns_rdf2buffer_str_type_fmt(ldns_buffer *output, - const ldns_output_format* fmt, const ldns_rdf *rdf) -{ - uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); - - if (! ldns_output_format_covers_type(fmt, data) && - ldns_rr_descript(data) && - ldns_rr_descript(data)->_name) { - - ldns_buffer_printf(output, "%s",ldns_rr_descript(data)->_name); - } else { - ldns_buffer_printf(output, "TYPE%u", data); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_str_type_fmt(output, - ldns_output_format_default, rdf); -} - -ldns_status -ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); - ldns_lookup_table *lt; - - lt = ldns_lookup_by_id(ldns_rr_classes, (int) data); - if (lt) { - ldns_buffer_printf(output, "\t%s", lt->name); - } else { - ldns_buffer_printf(output, "\tCLASS%d", data); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); - ldns_lookup_table *lt; - lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data); - if (lt) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "%d", data); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_str_int8(output, rdf); -} - -static void -loc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent) -{ - uint8_t i; - /* is it 0.<two digits> ? */ - if(exponent < 2) { - if(exponent == 1) - mantissa *= 10; - ldns_buffer_printf(output, "0.%02ld", (long)mantissa); - return; - } - /* always <digit><string of zeros> */ - ldns_buffer_printf(output, "%d", (int)mantissa); - for(i=0; i<exponent-2; i++) - ldns_buffer_printf(output, "0"); -} - -ldns_status -ldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type) -{ - const ldns_rr_descriptor *descriptor; - - descriptor = ldns_rr_descript(type); - - switch (type) { - case LDNS_RR_TYPE_IXFR: - ldns_buffer_printf(output, "IXFR"); - break; - case LDNS_RR_TYPE_AXFR: - ldns_buffer_printf(output, "AXFR"); - break; - case LDNS_RR_TYPE_MAILA: - ldns_buffer_printf(output, "MAILA"); - break; - case LDNS_RR_TYPE_MAILB: - ldns_buffer_printf(output, "MAILB"); - break; - case LDNS_RR_TYPE_ANY: - ldns_buffer_printf(output, "ANY"); - break; - default: - if (descriptor && descriptor->_name) { - ldns_buffer_printf(output, "%s", descriptor->_name); - } else { - ldns_buffer_printf(output, "TYPE%u", type); - } - } - return ldns_buffer_status(output); -} - -char * -ldns_rr_type2str(const ldns_rr_type type) -{ - char *str; - ldns_buffer *buf; - - buf = ldns_buffer_new(10); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - - ldns_buffer_free(buf); - return str; -} - - -ldns_status -ldns_rr_class2buffer_str(ldns_buffer *output, - const ldns_rr_class klass) -{ - ldns_lookup_table *lt; - - lt = ldns_lookup_by_id(ldns_rr_classes, klass); - if (lt) { - ldns_buffer_printf(output, "%s", lt->name); - } else { - ldns_buffer_printf(output, "CLASS%d", klass); - } - return ldns_buffer_status(output); -} - -char * -ldns_rr_class2str(const ldns_rr_class klass) -{ - ldns_buffer *buf; - char *str; - - buf = ldns_buffer_new(10); - if (!buf) { - return NULL; - } - - str = NULL; - if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) { - str = ldns_buffer_export2str(buf); - } - ldns_buffer_free(buf); - return str; -} - -ldns_status -ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* we could do checking (ie degrees < 90 etc)? */ - uint8_t version; - uint8_t size; - uint8_t horizontal_precision; - uint8_t vertical_precision; - uint32_t longitude; - uint32_t latitude; - uint32_t altitude; - char northerness; - char easterness; - uint32_t h; - uint32_t m; - double s; - - uint32_t equator = (uint32_t) ldns_power(2, 31); - - if(ldns_rdf_size(rdf) < 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - version = ldns_rdf_data(rdf)[0]; - if (version == 0) { - if(ldns_rdf_size(rdf) < 16) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - size = ldns_rdf_data(rdf)[1]; - horizontal_precision = ldns_rdf_data(rdf)[2]; - vertical_precision = ldns_rdf_data(rdf)[3]; - - latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]); - longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]); - altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]); - - if (latitude > equator) { - northerness = 'N'; - latitude = latitude - equator; - } else { - northerness = 'S'; - latitude = equator - latitude; - } - h = latitude / (1000 * 60 * 60); - latitude = latitude % (1000 * 60 * 60); - m = latitude / (1000 * 60); - latitude = latitude % (1000 * 60); - s = (double) latitude / 1000.0; - ldns_buffer_printf(output, "%02u %02u %0.3f %c ", - h, m, s, northerness); - - if (longitude > equator) { - easterness = 'E'; - longitude = longitude - equator; - } else { - easterness = 'W'; - longitude = equator - longitude; - } - h = longitude / (1000 * 60 * 60); - longitude = longitude % (1000 * 60 * 60); - m = longitude / (1000 * 60); - longitude = longitude % (1000 * 60); - s = (double) longitude / (1000.0); - ldns_buffer_printf(output, "%02u %02u %0.3f %c ", - h, m, s, easterness); - - - s = ((double) altitude) / 100; - s -= 100000; - - if(altitude%100 != 0) - ldns_buffer_printf(output, "%.2f", s); - else - ldns_buffer_printf(output, "%.0f", s); - - ldns_buffer_printf(output, "m "); - - loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f); - ldns_buffer_printf(output, "m "); - - loc_cm_print(output, (horizontal_precision & 0xf0) >> 4, - horizontal_precision & 0x0f); - ldns_buffer_printf(output, "m "); - - loc_cm_print(output, (vertical_precision & 0xf0) >> 4, - vertical_precision & 0x0f); - ldns_buffer_printf(output, "m"); - - return ldns_buffer_status(output); - } else { - return ldns_rdf2buffer_str_hex(output, rdf); - } -} - -ldns_status -ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf) -{ - ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf)); - return ldns_rdf2buffer_str_hex(output, rdf); -} - -ldns_status -ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf) -{ - ldns_buffer_printf(output, "0x"); - return ldns_rdf2buffer_str_hex(output, rdf); -} - -ldns_status -ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_str_hex(output, rdf); -} - -ldns_status -ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* protocol, followed by bitmap of services */ - struct protoent *protocol; - char *proto_name = NULL; - uint8_t protocol_nr; - struct servent *service; - uint16_t current_service; - - if(ldns_rdf_size(rdf) < 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - protocol_nr = ldns_rdf_data(rdf)[0]; - protocol = getprotobynumber((int) protocol_nr); - if (protocol && (protocol->p_name != NULL)) { - proto_name = protocol->p_name; - ldns_buffer_printf(output, "%s ", protocol->p_name); - } else { - ldns_buffer_printf(output, "%u ", protocol_nr); - } - -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - - for (current_service = 0; - current_service < (ldns_rdf_size(rdf)-1)*8; current_service++) { - if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) { - service = getservbyport((int) htons(current_service), - proto_name); - if (service && service->s_name) { - ldns_buffer_printf(output, "%s ", service->s_name); - } else { - ldns_buffer_printf(output, "%u ", current_service); - } -#ifdef HAVE_ENDSERVENT - endservent(); -#endif - } - } - return ldns_buffer_status(output); -} - -static ldns_status -ldns_rdf2buffer_str_nsec_fmt(ldns_buffer *output, - const ldns_output_format* fmt, const ldns_rdf *rdf) -{ - /* Note: this code is duplicated in higher.c in - * ldns_nsec_type_check() function - */ - uint8_t window_block_nr; - uint8_t bitmap_length; - uint16_t type; - uint16_t pos = 0; - uint16_t bit_pos; - uint8_t *data = ldns_rdf_data(rdf); - - while((size_t)(pos + 2) < ldns_rdf_size(rdf)) { - window_block_nr = data[pos]; - bitmap_length = data[pos + 1]; - pos += 2; - if (ldns_rdf_size(rdf) < pos + bitmap_length) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) { - if (! ldns_get_bit(&data[pos], bit_pos)) { - continue; - } - type = 256 * (uint16_t) window_block_nr + bit_pos; - - if (! ldns_output_format_covers_type(fmt, type) && - ldns_rr_descript(type) && - ldns_rr_descript(type)->_name){ - - ldns_buffer_printf(output, "%s ", - ldns_rr_descript(type)->_name); - } else { - ldns_buffer_printf(output, "TYPE%u ", type); - } - } - pos += (uint16_t) bitmap_length; - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_str_nsec_fmt(output, - ldns_output_format_default, rdf); -} - -ldns_status -ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint8_t salt_length; - uint8_t salt_pos; - - uint8_t *data = ldns_rdf_data(rdf); - - if(ldns_rdf_size(rdf) < 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - salt_length = data[0]; - /* from now there are variable length entries so remember pos */ - if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) { - ldns_buffer_printf(output, "- "); - } else { - for (salt_pos = 0; salt_pos < salt_length; salt_pos++) { - ldns_buffer_printf(output, "%02x", data[1 + salt_pos]); - } - ldns_buffer_printf(output, " "); - } - - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* period is the number of seconds */ - if (ldns_rdf_size(rdf) != 4) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output, "%u", ldns_read_uint32(ldns_rdf_data(rdf))); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const ldns_rdf *rdf) -{ - /* tsigtime is 48 bits network order unsigned integer */ - uint64_t tsigtime = 0; - uint8_t *data = ldns_rdf_data(rdf); - uint64_t d0, d1, d2, d3, d4, d5; - - if (ldns_rdf_size(rdf) < 6) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - d0 = data[0]; /* cast to uint64 for shift operations */ - d1 = data[1]; - d2 = data[2]; - d3 = data[3]; - d4 = data[4]; - d5 = data[5]; - tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5; - - ldns_buffer_printf(output, "%llu ", (long long)tsigtime); - - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint8_t *data = ldns_rdf_data(rdf); - uint16_t address_family; - uint8_t prefix; - bool negation; - uint8_t adf_length; - size_t i; - size_t pos = 0; - - while (pos < (unsigned int) ldns_rdf_size(rdf)) { - if(pos + 3 >= (unsigned)ldns_rdf_size(rdf)) - return LDNS_STATUS_WIRE_RDATA_ERR; - address_family = ldns_read_uint16(&data[pos]); - prefix = data[pos + 2]; - negation = data[pos + 3] & LDNS_APL_NEGATION; - adf_length = data[pos + 3] & LDNS_APL_MASK; - if (address_family == LDNS_APL_IP4) { - /* check if prefix < 32? */ - if (negation) { - ldns_buffer_printf(output, "!"); - } - ldns_buffer_printf(output, "%u:", address_family); - /* address is variable length 0 - 4 */ - for (i = 0; i < 4; i++) { - if (i > 0) { - ldns_buffer_printf(output, "."); - } - if (i < (unsigned short) adf_length) { - if(pos+i+4 >= ldns_rdf_size(rdf)) - return LDNS_STATUS_WIRE_RDATA_ERR; - ldns_buffer_printf(output, "%d", - data[pos + i + 4]); - } else { - ldns_buffer_printf(output, "0"); - } - } - ldns_buffer_printf(output, "/%u ", prefix); - } else if (address_family == LDNS_APL_IP6) { - /* check if prefix < 128? */ - if (negation) { - ldns_buffer_printf(output, "!"); - } - ldns_buffer_printf(output, "%u:", address_family); - /* address is variable length 0 - 16 */ - for (i = 0; i < 16; i++) { - if (i % 2 == 0 && i > 0) { - ldns_buffer_printf(output, ":"); - } - if (i < (unsigned short) adf_length) { - if(pos+i+4 >= ldns_rdf_size(rdf)) - return LDNS_STATUS_WIRE_RDATA_ERR; - ldns_buffer_printf(output, "%02x", - data[pos + i + 4]); - } else { - ldns_buffer_printf(output, "00"); - } - } - ldns_buffer_printf(output, "/%u ", prefix); - - } else { - /* unknown address family */ - ldns_buffer_printf(output, - "Unknown address family: %u data: ", - address_family); - for (i = 1; i < (unsigned short) (4 + adf_length); i++) { - if(pos+i >= ldns_rdf_size(rdf)) - return LDNS_STATUS_WIRE_RDATA_ERR; - ldns_buffer_printf(output, "%02x", data[i]); - } - } - pos += 4 + adf_length; - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf) -{ - size_t size; - char *b64; - if (ldns_rdf_size(rdf) < 2) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - /* Subtract the size (2) of the number that specifies the length */ - size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2); - ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2); - if (ldns_rdf_size(rdf) > 2) { - b64 = LDNS_XMALLOC(char, size); - if(!b64) - return LDNS_STATUS_MEM_ERR; - - if (ldns_rdf_size(rdf) > 2 && - ldns_b64_ntop(ldns_rdf_data(rdf) + 2, - ldns_rdf_size(rdf) - 2, - b64, size)) { - ldns_buffer_printf(output, "%s", b64); - } - LDNS_FREE(b64); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* wire format from - http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt - */ - uint8_t *data = ldns_rdf_data(rdf); - uint8_t precedence; - uint8_t gateway_type; - uint8_t algorithm; - - ldns_rdf *gateway = NULL; - uint8_t *gateway_data; - - size_t public_key_size; - uint8_t *public_key_data; - ldns_rdf *public_key; - - size_t offset = 0; - ldns_status status; - - if (ldns_rdf_size(rdf) < 3) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - precedence = data[0]; - gateway_type = data[1]; - algorithm = data[2]; - offset = 3; - - switch (gateway_type) { - case 0: - /* no gateway */ - break; - case 1: - if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) { - return LDNS_STATUS_ERR; - } - gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN); - if(!gateway_data) - return LDNS_STATUS_MEM_ERR; - memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN); - gateway = ldns_rdf_new(LDNS_RDF_TYPE_A, - LDNS_IP4ADDRLEN , gateway_data); - offset += LDNS_IP4ADDRLEN; - if(!gateway) { - LDNS_FREE(gateway_data); - return LDNS_STATUS_MEM_ERR; - } - break; - case 2: - if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) { - return LDNS_STATUS_ERR; - } - gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN); - if(!gateway_data) - return LDNS_STATUS_MEM_ERR; - memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN); - offset += LDNS_IP6ADDRLEN; - gateway = - ldns_rdf_new(LDNS_RDF_TYPE_AAAA, - LDNS_IP6ADDRLEN, gateway_data); - if(!gateway) { - LDNS_FREE(gateway_data); - return LDNS_STATUS_MEM_ERR; - } - break; - case 3: - status = ldns_wire2dname(&gateway, data, - ldns_rdf_size(rdf), &offset); - if(status != LDNS_STATUS_OK) - return status; - break; - default: - /* error? */ - break; - } - - if (ldns_rdf_size(rdf) <= offset) { - ldns_rdf_deep_free(gateway); - return LDNS_STATUS_ERR; - } - public_key_size = ldns_rdf_size(rdf) - offset; - public_key_data = LDNS_XMALLOC(uint8_t, public_key_size); - if(!public_key_data) { - ldns_rdf_deep_free(gateway); - return LDNS_STATUS_MEM_ERR; - } - memcpy(public_key_data, &data[offset], public_key_size); - public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64, - public_key_size, public_key_data); - if(!public_key) { - LDNS_FREE(public_key_data); - ldns_rdf_deep_free(gateway); - return LDNS_STATUS_MEM_ERR; - } - - ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm); - if (gateway) - (void) ldns_rdf2buffer_str(output, gateway); - else - ldns_buffer_printf(output, "."); - ldns_buffer_printf(output, " "); - (void) ldns_rdf2buffer_str(output, public_key); - - ldns_rdf_deep_free(gateway); - ldns_rdf_deep_free(public_key); - - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_ilnp64(ldns_buffer *output, const ldns_rdf *rdf) -{ - if (ldns_rdf_size(rdf) != 8) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output,"%.4x:%.4x:%.4x:%.4x", - ldns_read_uint16(ldns_rdf_data(rdf)), - ldns_read_uint16(ldns_rdf_data(rdf)+2), - ldns_read_uint16(ldns_rdf_data(rdf)+4), - ldns_read_uint16(ldns_rdf_data(rdf)+6)); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_eui48(ldns_buffer *output, const ldns_rdf *rdf) -{ - if (ldns_rdf_size(rdf) != 6) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", - ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1], - ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3], - ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5]); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_eui64(ldns_buffer *output, const ldns_rdf *rdf) -{ - if (ldns_rdf_size(rdf) != 8) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", - ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1], - ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3], - ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5], - ldns_rdf_data(rdf)[6], ldns_rdf_data(rdf)[7]); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_tag(ldns_buffer *output, const ldns_rdf *rdf) -{ - size_t nchars; - const uint8_t* chars; - char ch; - if (ldns_rdf_size(rdf) < 2) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - nchars = ldns_rdf_data(rdf)[0]; - if (nchars >= ldns_rdf_size(rdf) || /* should be rdf_size - 1 */ - nchars < 1) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - chars = ldns_rdf_data(rdf) + 1; - while (nchars > 0) { - ch = (char)*chars++; - if (! isalnum((unsigned char)ch)) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - ldns_buffer_printf(output, "%c", ch); - nchars--; - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_long_str(ldns_buffer *output, const ldns_rdf *rdf) -{ - - ldns_buffer_printf(output, "\""); - ldns_characters2buffer_str(output, - ldns_rdf_size(rdf), ldns_rdf_data(rdf)); - ldns_buffer_printf(output, "\""); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rdf2buffer_str_hip(ldns_buffer *output, const ldns_rdf *rdf) -{ - uint8_t *data = ldns_rdf_data(rdf); - size_t rdf_size = ldns_rdf_size(rdf); - uint8_t hit_size; - uint16_t pk_size; - int written; - - if (rdf_size < 6) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - if ((hit_size = data[0]) == 0 || - (pk_size = ldns_read_uint16(data + 2)) == 0 || - rdf_size < (size_t) hit_size + pk_size + 4) { - - return LDNS_STATUS_WIRE_RDATA_ERR; - } - - ldns_buffer_printf(output, "%d ", (int) data[1]); - - for (data += 4; hit_size > 0; hit_size--, data++) { - - ldns_buffer_printf(output, "%02x", (int) *data); - } - ldns_buffer_write_u8(output, (uint8_t) ' '); - - if (ldns_buffer_reserve(output, - ldns_b64_ntop_calculate_size(pk_size))) { - - written = ldns_b64_ntop(data, pk_size, - (char *) ldns_buffer_current(output), - ldns_buffer_remaining(output)); - - if (written > 0 && - written < (int) ldns_buffer_remaining(output)) { - - output->_position += written; - } - } - return ldns_buffer_status(output); -} - -/* implementation mimiced from ldns_rdf2buffer_str_ipseckey */ -ldns_status -ldns_rdf2buffer_str_amtrelay(ldns_buffer *output, const ldns_rdf *rdf) -{ - /* wire format from - * draft-ietf-mboned-driad-amt-discovery Section 4.2 - */ - uint8_t *data = ldns_rdf_data(rdf); - uint8_t precedence; - uint8_t discovery_optional; - uint8_t relay_type; - - ldns_rdf *relay = NULL; - uint8_t *relay_data; - - size_t offset = 0; - ldns_status status; - - if (ldns_rdf_size(rdf) < 2) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - precedence = data[0]; - discovery_optional = ((data[1] & 0x80) >> 7); - relay_type = data[1] & 0x7F; - offset = 2; - - switch (relay_type) { - case 0: - /* no relay */ - break; - case 1: - if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) { - return LDNS_STATUS_ERR; - } - relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN); - if(!relay_data) - return LDNS_STATUS_MEM_ERR; - memcpy(relay_data, &data[offset], LDNS_IP4ADDRLEN); - relay = ldns_rdf_new(LDNS_RDF_TYPE_A, - LDNS_IP4ADDRLEN , relay_data); - offset += LDNS_IP4ADDRLEN; - if(!relay) { - LDNS_FREE(relay_data); - return LDNS_STATUS_MEM_ERR; - } - break; - case 2: - if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) { - return LDNS_STATUS_ERR; - } - relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN); - if(!relay_data) - return LDNS_STATUS_MEM_ERR; - memcpy(relay_data, &data[offset], LDNS_IP6ADDRLEN); - offset += LDNS_IP6ADDRLEN; - relay = - ldns_rdf_new(LDNS_RDF_TYPE_AAAA, - LDNS_IP6ADDRLEN, relay_data); - if(!relay) { - LDNS_FREE(relay_data); - return LDNS_STATUS_MEM_ERR; - } - break; - case 3: - status = ldns_wire2dname(&relay, data, - ldns_rdf_size(rdf), &offset); - if(status != LDNS_STATUS_OK) - return status; - break; - default: - /* error? */ - break; - } - - if (ldns_rdf_size(rdf) != offset) { - ldns_rdf_deep_free(relay); - return LDNS_STATUS_ERR; - } - ldns_buffer_printf(output, "%u %u %u ", - precedence, discovery_optional, relay_type); - if (relay) - (void) ldns_rdf2buffer_str(output, relay); - - ldns_rdf_deep_free(relay); - return ldns_buffer_status(output); -} - - -static ldns_status -ldns_rdf2buffer_str_fmt(ldns_buffer *buffer, - const ldns_output_format* fmt, const ldns_rdf *rdf) -{ - ldns_status res = LDNS_STATUS_OK; - - /*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/ - if (rdf) { - switch(ldns_rdf_get_type(rdf)) { - case LDNS_RDF_TYPE_NONE: - break; - case LDNS_RDF_TYPE_DNAME: - res = ldns_rdf2buffer_str_dname(buffer, rdf); - break; - case LDNS_RDF_TYPE_INT8: /* Don't output mnemonics for these */ - case LDNS_RDF_TYPE_ALG: - case LDNS_RDF_TYPE_CERTIFICATE_USAGE: - case LDNS_RDF_TYPE_SELECTOR: - case LDNS_RDF_TYPE_MATCHING_TYPE: - res = ldns_rdf2buffer_str_int8(buffer, rdf); - break; - case LDNS_RDF_TYPE_INT16: - res = ldns_rdf2buffer_str_int16(buffer, rdf); - break; - case LDNS_RDF_TYPE_INT32: - res = ldns_rdf2buffer_str_int32(buffer, rdf); - break; - case LDNS_RDF_TYPE_PERIOD: - res = ldns_rdf2buffer_str_period(buffer, rdf); - break; - case LDNS_RDF_TYPE_TSIGTIME: - res = ldns_rdf2buffer_str_tsigtime(buffer, rdf); - break; - case LDNS_RDF_TYPE_A: - res = ldns_rdf2buffer_str_a(buffer, rdf); - break; - case LDNS_RDF_TYPE_AAAA: - res = ldns_rdf2buffer_str_aaaa(buffer, rdf); - break; - case LDNS_RDF_TYPE_STR: - res = ldns_rdf2buffer_str_str(buffer, rdf); - break; - case LDNS_RDF_TYPE_APL: - res = ldns_rdf2buffer_str_apl(buffer, rdf); - break; - case LDNS_RDF_TYPE_B32_EXT: - res = ldns_rdf2buffer_str_b32_ext(buffer, rdf); - break; - case LDNS_RDF_TYPE_B64: - res = ldns_rdf2buffer_str_b64(buffer, rdf); - break; - case LDNS_RDF_TYPE_HEX: - res = ldns_rdf2buffer_str_hex(buffer, rdf); - break; - case LDNS_RDF_TYPE_NSEC: - res = ldns_rdf2buffer_str_nsec_fmt(buffer, fmt, rdf); - break; - case LDNS_RDF_TYPE_NSEC3_SALT: - res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf); - break; - case LDNS_RDF_TYPE_TYPE: - res = ldns_rdf2buffer_str_type_fmt(buffer, fmt, rdf); - break; - case LDNS_RDF_TYPE_CLASS: - res = ldns_rdf2buffer_str_class(buffer, rdf); - break; - case LDNS_RDF_TYPE_CERT_ALG: - res = ldns_rdf2buffer_str_cert_alg(buffer, rdf); - break; - case LDNS_RDF_TYPE_UNKNOWN: - res = ldns_rdf2buffer_str_unknown(buffer, rdf); - break; - case LDNS_RDF_TYPE_TIME: - res = ldns_rdf2buffer_str_time(buffer, rdf); - break; - case LDNS_RDF_TYPE_HIP: - res = ldns_rdf2buffer_str_hip(buffer, rdf); - break; - case LDNS_RDF_TYPE_LOC: - res = ldns_rdf2buffer_str_loc(buffer, rdf); - break; - case LDNS_RDF_TYPE_WKS: - case LDNS_RDF_TYPE_SERVICE: - res = ldns_rdf2buffer_str_wks(buffer, rdf); - break; - case LDNS_RDF_TYPE_NSAP: - res = ldns_rdf2buffer_str_nsap(buffer, rdf); - break; - case LDNS_RDF_TYPE_ATMA: - res = ldns_rdf2buffer_str_atma(buffer, rdf); - break; - case LDNS_RDF_TYPE_IPSECKEY: - res = ldns_rdf2buffer_str_ipseckey(buffer, rdf); - break; - case LDNS_RDF_TYPE_INT16_DATA: - res = ldns_rdf2buffer_str_int16_data(buffer, rdf); - break; - case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: - res = ldns_rdf2buffer_str_b32_ext(buffer, rdf); - break; - case LDNS_RDF_TYPE_ILNP64: - res = ldns_rdf2buffer_str_ilnp64(buffer, rdf); - break; - case LDNS_RDF_TYPE_EUI48: - res = ldns_rdf2buffer_str_eui48(buffer, rdf); - break; - case LDNS_RDF_TYPE_EUI64: - res = ldns_rdf2buffer_str_eui64(buffer, rdf); - break; - case LDNS_RDF_TYPE_TAG: - res = ldns_rdf2buffer_str_tag(buffer, rdf); - break; - case LDNS_RDF_TYPE_LONG_STR: - res = ldns_rdf2buffer_str_long_str(buffer, rdf); - break; - case LDNS_RDF_TYPE_AMTRELAY: - res = ldns_rdf2buffer_str_amtrelay(buffer, rdf); - break; - } - } else { - /** This will write mangled RRs */ - ldns_buffer_printf(buffer, "(null) "); - res = LDNS_STATUS_ERR; - } - return res; -} - -ldns_status -ldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_str_fmt(buffer,ldns_output_format_default,rdf); -} - -static ldns_rdf * -ldns_b32_ext2dname(const ldns_rdf *rdf) -{ - size_t size; - char *b32; - ldns_rdf *out; - if(ldns_rdf_size(rdf) == 0) - return NULL; - /* remove -1 for the b32-hash-len octet */ - size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1); - /* add one for the end nul for the string */ - b32 = LDNS_XMALLOC(char, size + 2); - if (b32) { - if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1, - ldns_rdf_size(rdf) - 1, b32, size+1) > 0) { - b32[size] = '.'; - b32[size+1] = '\0'; - if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) { - LDNS_FREE(b32); - return out; - } - } - LDNS_FREE(b32); - } - return NULL; -} - -static ldns_status -ldns_rr2buffer_str_rfc3597(ldns_buffer *output, const ldns_rr *rr) -{ - size_t total_rdfsize = 0; - size_t i, j; - - ldns_buffer_printf(output, "TYPE%u\t", ldns_rr_get_type(rr)); - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - total_rdfsize += ldns_rdf_size(ldns_rr_rdf(rr, i)); - } - if (total_rdfsize == 0) { - ldns_buffer_printf(output, "\\# 0\n"); - return ldns_buffer_status(output); - } - ldns_buffer_printf(output, "\\# %d ", total_rdfsize); - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - for (j = 0; j < ldns_rdf_size(ldns_rr_rdf(rr, i)); j++) { - ldns_buffer_printf(output, "%.2x", - ldns_rdf_data(ldns_rr_rdf(rr, i))[j]); - } - } - ldns_buffer_printf(output, "\n"); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rr2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_rr *rr) -{ - uint16_t i, flags; - ldns_status status = LDNS_STATUS_OK; - ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt; - - if (fmt_st == NULL) { - fmt_st = (ldns_output_format_storage*) - ldns_output_format_default; - } - if (!rr) { - if (LDNS_COMMENT_NULLS & fmt_st->flags) { - ldns_buffer_printf(output, "; (null)\n"); - } - return ldns_buffer_status(output); - } - if (ldns_rr_owner(rr)) { - status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr)); - } - if (status != LDNS_STATUS_OK) { - return status; - } - - /* TTL should NOT be printed if it is a question */ - if (!ldns_rr_is_question(rr)) { - ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr)); - } - - ldns_buffer_printf(output, "\t"); - status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr)); - if (status != LDNS_STATUS_OK) { - return status; - } - ldns_buffer_printf(output, "\t"); - - if (ldns_output_format_covers_type(fmt, ldns_rr_get_type(rr))) { - return ldns_rr2buffer_str_rfc3597(output, rr); - } - status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr)); - if (status != LDNS_STATUS_OK) { - return status; - } - - if (ldns_rr_rd_count(rr) > 0) { - ldns_buffer_printf(output, "\t"); - } else if (!ldns_rr_is_question(rr)) { - ldns_buffer_printf(output, "\t\\# 0"); - } - - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - /* ldns_rdf2buffer_str handles NULL input fine! */ - if ((fmt_st->flags & LDNS_FMT_ZEROIZE_RRSIGS) && - (ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG) && - ((/* inception */ i == 4 && - ldns_rdf_get_type(ldns_rr_rdf(rr, 4)) == - LDNS_RDF_TYPE_TIME) || - (/* expiration */ i == 5 && - ldns_rdf_get_type(ldns_rr_rdf(rr, 5)) == - LDNS_RDF_TYPE_TIME) || - (/* signature */ i == 8 && - ldns_rdf_get_type(ldns_rr_rdf(rr, 8)) == - LDNS_RDF_TYPE_B64))) { - - ldns_buffer_printf(output, "(null)"); - status = ldns_buffer_status(output); - } else if ((fmt_st->flags & LDNS_FMT_PAD_SOA_SERIAL) && - (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) && - /* serial */ i == 2 && - ldns_rdf_get_type(ldns_rr_rdf(rr, 2)) == - LDNS_RDF_TYPE_INT32) { - ldns_buffer_printf(output, "%10lu", - (unsigned long) ldns_read_uint32( - ldns_rdf_data(ldns_rr_rdf(rr, 2)))); - status = ldns_buffer_status(output); - } else { - status = ldns_rdf2buffer_str_fmt(output, - fmt, ldns_rr_rdf(rr, i)); - } - if(status != LDNS_STATUS_OK) - return status; - if (i < ldns_rr_rd_count(rr) - 1) { - ldns_buffer_printf(output, " "); - } - } - /* per RR special comments - handy for DNSSEC types */ - /* check to prevent question sec. rr from - * getting here */ - if (ldns_rr_rd_count(rr) > 0) { - switch (ldns_rr_get_type(rr)) { - case LDNS_RR_TYPE_DNSKEY: - /* if ldns_rr_rd_count(rr) > 0 - then ldns_rr_rdf(rr, 0) exists! */ - if (! (fmt_st->flags & LDNS_COMMENT_KEY)) { - break; - } - flags = ldns_rdf2native_int16(ldns_rr_rdf(rr, 0)); - ldns_buffer_printf(output, " ;{"); - if (fmt_st->flags & LDNS_COMMENT_KEY_ID) { - ldns_buffer_printf(output, "id = %u", - (unsigned int) ldns_calc_keytag(rr)); - } - if ((fmt_st->flags & LDNS_COMMENT_KEY_TYPE) && - (flags & LDNS_KEY_ZONE_KEY)){ - - if (flags & LDNS_KEY_SEP_KEY) { - ldns_buffer_printf(output, " (ksk)"); - } else { - ldns_buffer_printf(output, " (zsk)"); - } - if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE){ - ldns_buffer_printf(output, ", "); - } - } else if (fmt_st->flags - & (LDNS_COMMENT_KEY_ID - |LDNS_COMMENT_KEY_SIZE)) { - ldns_buffer_printf( output, ", "); - } - if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE) { - ldns_buffer_printf(output, "size = %db", - ldns_rr_dnskey_key_size(rr)); - } - ldns_buffer_printf(output, "}"); - break; - case LDNS_RR_TYPE_RRSIG: - if ((fmt_st->flags & LDNS_COMMENT_KEY) - && (fmt_st->flags& LDNS_COMMENT_RRSIGS) - && ldns_rr_rdf(rr, 6) != NULL) { - ldns_buffer_printf(output, " ;{id = %d}", - ldns_rdf2native_int16( - ldns_rr_rdf(rr, 6))); - } - break; - case LDNS_RR_TYPE_DS: - if ((fmt_st->flags & LDNS_COMMENT_BUBBLEBABBLE) && - ldns_rr_rdf(rr, 3) != NULL) { - - uint8_t *data = ldns_rdf_data( - ldns_rr_rdf(rr, 3)); - size_t len = ldns_rdf_size(ldns_rr_rdf(rr, 3)); - char *babble = ldns_bubblebabble(data, len); - if(babble) { - ldns_buffer_printf(output, - " ;{%s}", babble); - } - LDNS_FREE(babble); - } - break; - case LDNS_RR_TYPE_NSEC3: - if (! (fmt_st->flags & LDNS_COMMENT_FLAGS) && - ! (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN)) { - break; - } - ldns_buffer_printf(output, " ;{"); - if ((fmt_st->flags & LDNS_COMMENT_FLAGS)) { - if (ldns_nsec3_optout(rr)) { - ldns_buffer_printf(output, - " flags: optout"); - } else { - ldns_buffer_printf(output," flags: -"); - } - if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN && - fmt_st->hashmap != NULL) { - ldns_buffer_printf(output, ", "); - } - } - if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN && - fmt_st->hashmap != NULL) { - ldns_rbnode_t *node; - ldns_rdf *key = ldns_dname_label( - ldns_rr_owner(rr), 0); - if (key) { - node = ldns_rbtree_search( - fmt_st->hashmap, - (void *) key); - if (node->data) { - ldns_buffer_printf(output, - "from: "); - (void) ldns_rdf2buffer_str( - output, - ldns_dnssec_name_name( - (ldns_dnssec_name*) - node->data - )); - } - ldns_rdf_free(key); - } - key = ldns_b32_ext2dname( - ldns_nsec3_next_owner(rr)); - if (key) { - node = ldns_rbtree_search( - fmt_st->hashmap, - (void *) key); - if (node->data) { - ldns_buffer_printf(output, - " to: "); - (void) ldns_rdf2buffer_str( - output, - ldns_dnssec_name_name( - (ldns_dnssec_name*) - node->data - )); - } - ldns_rdf_free(key); - } - } - ldns_buffer_printf(output, "}"); - break; - default: - break; - - } - } - /* last */ - ldns_buffer_printf(output, "\n"); - return ldns_buffer_status(output); -} - -ldns_status -ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr) -{ - return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr); -} - -ldns_status -ldns_rr_list2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_rr_list *list) -{ - uint16_t i; - - for(i = 0; i < ldns_rr_list_rr_count(list); i++) { - (void) ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr(list, i)); - } - return ldns_buffer_status(output); -} - -ldns_status -ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list) -{ - return ldns_rr_list2buffer_str_fmt( - output, ldns_output_format_default, list); -} - -ldns_status -ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt) -{ - ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes, - (int) ldns_pkt_get_opcode(pkt)); - ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes, - (int) ldns_pkt_get_rcode(pkt)); - - ldns_buffer_printf(output, ";; ->>HEADER<<- "); - if (opcode) { - ldns_buffer_printf(output, "opcode: %s, ", opcode->name); - } else { - ldns_buffer_printf(output, "opcode: ?? (%u), ", - ldns_pkt_get_opcode(pkt)); - } - if (rcode) { - ldns_buffer_printf(output, "rcode: %s, ", rcode->name); - } else { - ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt)); - } - ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt)); - ldns_buffer_printf(output, ";; flags: "); - - if (ldns_pkt_qr(pkt)) { - ldns_buffer_printf(output, "qr "); - } - if (ldns_pkt_aa(pkt)) { - ldns_buffer_printf(output, "aa "); - } - if (ldns_pkt_tc(pkt)) { - ldns_buffer_printf(output, "tc "); - } - if (ldns_pkt_rd(pkt)) { - ldns_buffer_printf(output, "rd "); - } - if (ldns_pkt_cd(pkt)) { - ldns_buffer_printf(output, "cd "); - } - if (ldns_pkt_ra(pkt)) { - ldns_buffer_printf(output, "ra "); - } - if (ldns_pkt_ad(pkt)) { - ldns_buffer_printf(output, "ad "); - } - ldns_buffer_printf(output, "; "); - ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt)); - ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt)); - ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt)); - ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt)); - return ldns_buffer_status(output); -} - -ldns_status -ldns_pkt2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_pkt *pkt) -{ - uint16_t i; - ldns_status status = LDNS_STATUS_OK; - char *tmp; - struct timeval time; - time_t time_tt; - - if (!pkt) { - ldns_buffer_printf(output, "null"); - return LDNS_STATUS_OK; - } - - if (ldns_buffer_status_ok(output)) { - status = ldns_pktheader2buffer_str(output, pkt); - if (status != LDNS_STATUS_OK) { - return status; - } - - ldns_buffer_printf(output, "\n"); - - ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; "); - - - for (i = 0; i < ldns_pkt_qdcount(pkt); i++) { - status = ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr( - ldns_pkt_question(pkt), i)); - if (status != LDNS_STATUS_OK) { - return status; - } - } - ldns_buffer_printf(output, "\n"); - - ldns_buffer_printf(output, ";; ANSWER SECTION:\n"); - for (i = 0; i < ldns_pkt_ancount(pkt); i++) { - status = ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr( - ldns_pkt_answer(pkt), i)); - if (status != LDNS_STATUS_OK) { - return status; - } - - } - ldns_buffer_printf(output, "\n"); - - ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n"); - - for (i = 0; i < ldns_pkt_nscount(pkt); i++) { - status = ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr( - ldns_pkt_authority(pkt), i)); - if (status != LDNS_STATUS_OK) { - return status; - } - } - ldns_buffer_printf(output, "\n"); - - ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n"); - for (i = 0; i < ldns_pkt_arcount(pkt); i++) { - status = ldns_rr2buffer_str_fmt(output, fmt, - ldns_rr_list_rr( - ldns_pkt_additional(pkt), i)); - if (status != LDNS_STATUS_OK) { - return status; - } - - } - ldns_buffer_printf(output, "\n"); - /* add some futher fields */ - ldns_buffer_printf(output, ";; Query time: %d msec\n", - ldns_pkt_querytime(pkt)); - if (ldns_pkt_edns(pkt)) { - ldns_buffer_printf(output, - ";; EDNS: version %u; flags:", - ldns_pkt_edns_version(pkt)); - if (ldns_pkt_edns_do(pkt)) { - ldns_buffer_printf(output, " do"); - } - /* the extended rcode is the value set, shifted four bits, - * and or'd with the original rcode */ - if (ldns_pkt_edns_extended_rcode(pkt)) { - ldns_buffer_printf(output, " ; ext-rcode: %d", - (ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt))); - } - ldns_buffer_printf(output, " ; udp: %u\n", - ldns_pkt_edns_udp_size(pkt)); - - if (ldns_pkt_edns_data(pkt)) { - ldns_buffer_printf(output, ";; Data: "); - (void)ldns_rdf2buffer_str(output, - ldns_pkt_edns_data(pkt)); - ldns_buffer_printf(output, "\n"); - } - } - if (ldns_pkt_tsig(pkt)) { - ldns_buffer_printf(output, ";; TSIG:\n;; "); - (void) ldns_rr2buffer_str_fmt( - output, fmt, ldns_pkt_tsig(pkt)); - ldns_buffer_printf(output, "\n"); - } - if (ldns_pkt_answerfrom(pkt)) { - tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt)); - ldns_buffer_printf(output, ";; SERVER: %s\n", tmp); - LDNS_FREE(tmp); - } - time = ldns_pkt_timestamp(pkt); - time_tt = (time_t)time.tv_sec; - ldns_buffer_printf(output, ";; WHEN: %s", - (char*)ctime(&time_tt)); - - ldns_buffer_printf(output, ";; MSG SIZE rcvd: %d\n", - (int)ldns_pkt_size(pkt)); - } else { - return ldns_buffer_status(output); - } - return status; -} - -ldns_status -ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt) -{ - return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt); -} - - -#ifdef HAVE_SSL -static ldns_status -ldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k) -{ - ldns_status status; - size_t i; - ldns_rdf *b64_bignum; - - ldns_buffer_printf(output, "Key: "); - - i = ldns_key_hmac_size(k); - b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k)); - status = ldns_rdf2buffer_str(output, b64_bignum); - ldns_rdf_deep_free(b64_bignum); - ldns_buffer_printf(output, "\n"); - return status; -} -#endif - -#if defined(HAVE_SSL) && defined(USE_GOST) -static ldns_status -ldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p) -{ - unsigned char* pp = NULL; - int ret; - ldns_rdf *b64_bignum; - ldns_status status; - - ldns_buffer_printf(output, "GostAsn1: "); - - ret = i2d_PrivateKey(p, &pp); - b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp); - status = ldns_rdf2buffer_str(output, b64_bignum); - - ldns_rdf_deep_free(b64_bignum); - OPENSSL_free(pp); - ldns_buffer_printf(output, "\n"); - return status; -} -#endif - -#if defined(HAVE_SSL) && defined(USE_ED25519) -static ldns_status -ldns_ed25519_key2buffer_str(ldns_buffer *output, EVP_PKEY *p) -{ - unsigned char* pp = NULL; - int ret; - ldns_rdf *b64_bignum; - ldns_status status; - - ldns_buffer_printf(output, "PrivateKey: "); - - ret = i2d_PrivateKey(p, &pp); - /* 16 byte asn (302e020100300506032b657004220420) + 32byte key */ - if(ret != 16 + 32) { - OPENSSL_free(pp); - return LDNS_STATUS_ERR; - } - b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, - (size_t)ret-16, pp+16); - status = ldns_rdf2buffer_str(output, b64_bignum); - - ldns_rdf_deep_free(b64_bignum); - OPENSSL_free(pp); - ldns_buffer_printf(output, "\n"); - return status; -} -#endif - -#if defined(HAVE_SSL) && defined(USE_ED448) -static ldns_status -ldns_ed448_key2buffer_str(ldns_buffer *output, EVP_PKEY *p) -{ - unsigned char* pp = NULL; - int ret; - ldns_rdf *b64_bignum; - ldns_status status; - - ldns_buffer_printf(output, "PrivateKey: "); - - ret = i2d_PrivateKey(p, &pp); - /* some-ASN + 57byte key */ - if(ret != 16 + 57) { - OPENSSL_free(pp); - return LDNS_STATUS_ERR; - } - b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, - (size_t)ret-16, pp+16); - status = ldns_rdf2buffer_str(output, b64_bignum); - - ldns_rdf_deep_free(b64_bignum); - OPENSSL_free(pp); - ldns_buffer_printf(output, "\n"); - return status; -} -#endif - -#if defined(HAVE_SSL) -/** print one b64 encoded bignum to a line in the keybuffer */ -static int -ldns_print_bignum_b64_line(ldns_buffer* output, const char* label, const BIGNUM* num) -{ - unsigned char *bignumbuf = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if(!bignumbuf) return 0; - - ldns_buffer_printf(output, "%s: ", label); - if(num) { - ldns_rdf *b64_bignum = NULL; - int i = BN_bn2bin(num, bignumbuf); - if (i > LDNS_MAX_KEYLEN) { - LDNS_FREE(bignumbuf); - return 0; - } - b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)i, bignumbuf); - if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { - ldns_rdf_deep_free(b64_bignum); - LDNS_FREE(bignumbuf); - return 0; - } - ldns_rdf_deep_free(b64_bignum); - ldns_buffer_printf(output, "\n"); - } else { - ldns_buffer_printf(output, "(Not available)\n"); - } - LDNS_FREE(bignumbuf); - return 1; -} -#endif - -ldns_status -ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k) -{ - ldns_status status = LDNS_STATUS_OK; - unsigned char *bignum; -#ifdef HAVE_SSL - RSA *rsa; - DSA *dsa; -#endif /* HAVE_SSL */ - - if (!k) { - return LDNS_STATUS_ERR; - } - - bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bignum) { - return LDNS_STATUS_ERR; - } - - if (ldns_buffer_status_ok(output)) { -#ifdef HAVE_SSL - switch(ldns_key_algorithm(k)) { - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: - case LDNS_SIGN_RSASHA256: - case LDNS_SIGN_RSASHA512: - case LDNS_SIGN_RSAMD5: - /* copied by looking at dnssec-keygen output */ - /* header */ - rsa = ldns_key_rsa_key(k); - - ldns_buffer_printf(output,"Private-key-format: v1.2\n"); - switch(ldns_key_algorithm(k)) { - case LDNS_SIGN_RSAMD5: - ldns_buffer_printf(output, - "Algorithm: %u (RSA)\n", - LDNS_RSAMD5); - break; - case LDNS_SIGN_RSASHA1: - ldns_buffer_printf(output, - "Algorithm: %u (RSASHA1)\n", - LDNS_RSASHA1); - break; - case LDNS_SIGN_RSASHA1_NSEC3: - ldns_buffer_printf(output, - "Algorithm: %u (RSASHA1_NSEC3)\n", - LDNS_RSASHA1_NSEC3); - break; -#ifdef USE_SHA2 - case LDNS_SIGN_RSASHA256: - ldns_buffer_printf(output, - "Algorithm: %u (RSASHA256)\n", - LDNS_RSASHA256); - break; - case LDNS_SIGN_RSASHA512: - ldns_buffer_printf(output, - "Algorithm: %u (RSASHA512)\n", - LDNS_RSASHA512); - break; -#endif - default: -#ifdef STDERR_MSGS - fprintf(stderr, "Warning: unknown signature "); - fprintf(stderr, - "algorithm type %u\n", - ldns_key_algorithm(k)); -#endif - ldns_buffer_printf(output, - "Algorithm: %u (Unknown)\n", - ldns_key_algorithm(k)); - break; - } - - /* print to buf, convert to bin, convert to b64, - * print to buf */ - -#ifndef S_SPLINT_S - if(1) { - const BIGNUM *n=NULL, *e=NULL, *d=NULL, - *p=NULL, *q=NULL, *dmp1=NULL, - *dmq1=NULL, *iqmp=NULL; -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) - n = rsa->n; - e = rsa->e; - d = rsa->d; - p = rsa->p; - q = rsa->q; - dmp1 = rsa->dmp1; - dmq1 = rsa->dmq1; - iqmp = rsa->iqmp; -#else - RSA_get0_key(rsa, &n, &e, &d); - RSA_get0_factors(rsa, &p, &q); - RSA_get0_crt_params(rsa, &dmp1, - &dmq1, &iqmp); -#endif - if(!ldns_print_bignum_b64_line(output, "Modulus", n)) - goto error; - if(!ldns_print_bignum_b64_line(output, "PublicExponent", e)) - goto error; - if(!ldns_print_bignum_b64_line(output, "PrivateExponent", d)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Prime1", p)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Prime2", q)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Exponent1", dmp1)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Exponent2", dmq1)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Coefficient", iqmp)) - goto error; - } -#endif /* splint */ - - RSA_free(rsa); - break; - case LDNS_SIGN_DSA: - case LDNS_SIGN_DSA_NSEC3: - dsa = ldns_key_dsa_key(k); - - ldns_buffer_printf(output,"Private-key-format: v1.2\n"); - if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) { - ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n"); - } else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) { - ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n"); - } - - /* print to buf, convert to bin, convert to b64, - * print to buf */ - if(1) { - const BIGNUM *p=NULL, *q=NULL, *g=NULL, - *priv_key=NULL, *pub_key=NULL; -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -#ifndef S_SPLINT_S - p = dsa->p; - q = dsa->q; - g = dsa->g; - priv_key = dsa->priv_key; - pub_key = dsa->pub_key; -#endif /* splint */ -#else - DSA_get0_pqg(dsa, &p, &q, &g); - DSA_get0_key(dsa, &pub_key, &priv_key); -#endif - if(!ldns_print_bignum_b64_line(output, "Prime(p)", p)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Subprime(q)", q)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Base(g)", g)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Private_value(x)", priv_key)) - goto error; - if(!ldns_print_bignum_b64_line(output, "Public_value(y)", pub_key)) - goto error; - } - break; - case LDNS_SIGN_ECC_GOST: - /* no format defined, use blob */ -#if defined(HAVE_SSL) && defined(USE_GOST) - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST); - status = ldns_gost_key2buffer_str(output, -#ifndef S_SPLINT_S - k->_key.key -#else - NULL -#endif - ); -#else - goto error; -#endif /* GOST */ - break; - case LDNS_SIGN_ECDSAP256SHA256: - case LDNS_SIGN_ECDSAP384SHA384: -#ifdef USE_ECDSA - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k)); - status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k)); -#ifndef S_SPLINT_S - ldns_buffer_printf(output, ")\n"); - if(k->_key.key) { - EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key); - const BIGNUM* b = EC_KEY_get0_private_key(ec); - if(!ldns_print_bignum_b64_line(output, "PrivateKey", b)) - goto error; - /* down reference count in EC_KEY - * its still assigned to the PKEY */ - EC_KEY_free(ec); - } -#endif /* splint */ -#else - goto error; -#endif /* ECDSA */ - break; -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k)); - status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k)); - ldns_buffer_printf(output, ")\n"); - if (status) break; - status = ldns_ed25519_key2buffer_str(output, - k->_key.key); - break; -#endif /* USE_ED25519 */ -#ifdef USE_ED448 - case LDNS_SIGN_ED448: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k)); - status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k)); - ldns_buffer_printf(output, ")\n"); - if (status) break; - status = ldns_ed448_key2buffer_str(output, - k->_key.key); - break; -#endif /* USE_ED448 */ - case LDNS_SIGN_HMACMD5: - /* there's not much of a format defined for TSIG */ - /* It's just a binary blob, Same for all algorithms */ - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - case LDNS_SIGN_HMACSHA1: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - case LDNS_SIGN_HMACSHA224: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 162 (HMAC_SHA224)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - case LDNS_SIGN_HMACSHA256: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - case LDNS_SIGN_HMACSHA384: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 164 (HMAC_SHA384)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - case LDNS_SIGN_HMACSHA512: - ldns_buffer_printf(output, "Private-key-format: v1.2\n"); - ldns_buffer_printf(output, "Algorithm: 165 (HMAC_SHA512)\n"); - status = ldns_hmac_key2buffer_str(output, k); - break; - } -#endif /* HAVE_SSL */ - } else { - LDNS_FREE(bignum); - return ldns_buffer_status(output); - } - LDNS_FREE(bignum); - return status; - -#ifdef HAVE_SSL - /* compiles warn the label isn't used */ -error: - LDNS_FREE(bignum); - return LDNS_STATUS_ERR; -#endif /* HAVE_SSL */ - -} - -/* - * Zero terminate the buffer and copy data. - */ -char * -ldns_buffer2str(ldns_buffer *buffer) -{ - char *str; - - /* check if buffer ends with \0, if not, and - if there is space, add it */ - if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) { - if (!ldns_buffer_reserve(buffer, 1)) { - return NULL; - } - ldns_buffer_write_u8(buffer, (uint8_t) '\0'); - if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) { - return NULL; - } - } - - str = strdup((const char *)ldns_buffer_begin(buffer)); - if(!str) { - return NULL; - } - return str; -} - -/* - * Zero terminate the buffer and export data. - */ -char * -ldns_buffer_export2str(ldns_buffer *buffer) -{ - /* Append '\0' as string terminator */ - if (! ldns_buffer_reserve(buffer, 1)) { - return NULL; - } - ldns_buffer_write_u8(buffer, 0); - - /* reallocate memory to the size of the string and export */ - ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer)); - return ldns_buffer_export(buffer); -} - -char * -ldns_rdf2str(const ldns_rdf *rdf) -{ - char *result = NULL; - ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - if (!tmp_buffer) { - return NULL; - } - if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) { - /* export and return string, destroy rest */ - result = ldns_buffer_export2str(tmp_buffer); - } - ldns_buffer_free(tmp_buffer); - return result; -} - -char * -ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr) -{ - char *result = NULL; - ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - if (!tmp_buffer) { - return NULL; - } - if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr) - == LDNS_STATUS_OK) { - /* export and return string, destroy rest */ - result = ldns_buffer_export2str(tmp_buffer); - } - ldns_buffer_free(tmp_buffer); - return result; -} - -char * -ldns_rr2str(const ldns_rr *rr) -{ - return ldns_rr2str_fmt(ldns_output_format_default, rr); -} - -char * -ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt) -{ - char *result = NULL; - ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - if (!tmp_buffer) { - return NULL; - } - if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt) - == LDNS_STATUS_OK) { - /* export and return string, destroy rest */ - result = ldns_buffer_export2str(tmp_buffer); - } - - ldns_buffer_free(tmp_buffer); - return result; -} - -char * -ldns_pkt2str(const ldns_pkt *pkt) -{ - return ldns_pkt2str_fmt(ldns_output_format_default, pkt); -} - -char * -ldns_key2str(const ldns_key *k) -{ - char *result = NULL; - ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - if (!tmp_buffer) { - return NULL; - } - if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) { - /* export and return string, destroy rest */ - result = ldns_buffer_export2str(tmp_buffer); - } - ldns_buffer_free(tmp_buffer); - return result; -} - -char * -ldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list) -{ - char *result = NULL; - ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - - if (!tmp_buffer) { - return NULL; - } - if (list) { - if (ldns_rr_list2buffer_str_fmt( - tmp_buffer, fmt, list) - == LDNS_STATUS_OK) { - } - } else { - if (fmt == NULL) { - fmt = ldns_output_format_default; - } - if (fmt->flags & LDNS_COMMENT_NULLS) { - ldns_buffer_printf(tmp_buffer, "; (null)\n"); - } - } - - /* export and return string, destroy rest */ - result = ldns_buffer_export2str(tmp_buffer); - ldns_buffer_free(tmp_buffer); - return result; -} - -char * -ldns_rr_list2str(const ldns_rr_list *list) -{ - return ldns_rr_list2str_fmt(ldns_output_format_default, list); -} - -void -ldns_rdf_print(FILE *output, const ldns_rdf *rdf) -{ - char *str = ldns_rdf2str(rdf); - if (str) { - fprintf(output, "%s", str); - } else { - fprintf(output, ";Unable to convert rdf to string\n"); - } - LDNS_FREE(str); -} - -void -ldns_rr_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_rr *rr) -{ - char *str = ldns_rr2str_fmt(fmt, rr); - if (str) { - fprintf(output, "%s", str); - } else { - fprintf(output, ";Unable to convert rr to string\n"); - } - LDNS_FREE(str); -} - -void -ldns_rr_print(FILE *output, const ldns_rr *rr) -{ - ldns_rr_print_fmt(output, ldns_output_format_default, rr); -} - -void -ldns_pkt_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_pkt *pkt) -{ - char *str = ldns_pkt2str_fmt(fmt, pkt); - if (str) { - fprintf(output, "%s", str); - } else { - fprintf(output, ";Unable to convert packet to string\n"); - } - LDNS_FREE(str); -} - -void -ldns_pkt_print(FILE *output, const ldns_pkt *pkt) -{ - ldns_pkt_print_fmt(output, ldns_output_format_default, pkt); -} - -void -ldns_rr_list_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_rr_list *lst) -{ - size_t i; - for (i = 0; i < ldns_rr_list_rr_count(lst); i++) { - ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i)); - } -} - -void -ldns_rr_list_print(FILE *output, const ldns_rr_list *lst) -{ - ldns_rr_list_print_fmt(output, ldns_output_format_default, lst); -} - -void -ldns_resolver_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_resolver *r) -{ - uint16_t i; - ldns_rdf **n; - ldns_rdf **s; - size_t *rtt; - if (!r) { - return; - } - n = ldns_resolver_nameservers(r); - s = ldns_resolver_searchlist(r); - rtt = ldns_resolver_rtt(r); - - fprintf(output, "port: %d\n", (int)ldns_resolver_port(r)); - fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r)); - fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r)); - - fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r)); - fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r)); - fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r)); - fprintf(output, "fail: %d\n", ldns_resolver_fail(r)); - fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r)); - fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r)); - fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r)); - fprintf(output, "random: %d\n", ldns_resolver_random(r)); - fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec); - fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r)); - fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r)); - fprintf(output, "trust anchors (%d listed):\n", - (int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r))); - ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r)); - fprintf(output, "tsig: %s %s\n", - ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-", - ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-"); - fprintf(output, "debug: %d\n", ldns_resolver_debug(r)); - - fprintf(output, "default domain: "); - ldns_rdf_print(output, ldns_resolver_domain(r)); - fprintf(output, "\n"); - fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r)); - - fprintf(output, "searchlist (%d listed):\n", (int)ldns_resolver_searchlist_count(r)); - for (i = 0; i < ldns_resolver_searchlist_count(r); i++) { - fprintf(output, "\t"); - ldns_rdf_print(output, s[i]); - fprintf(output, "\n"); - } - fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r)); - - fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r)); - for (i = 0; i < ldns_resolver_nameserver_count(r); i++) { - fprintf(output, "\t"); - ldns_rdf_print(output, n[i]); - - switch ((int)rtt[i]) { - case LDNS_RESOLV_RTT_MIN: - fprintf(output, " - reachable\n"); - break; - case LDNS_RESOLV_RTT_INF: - fprintf(output, " - unreachable\n"); - break; - } - } -} - -void -ldns_resolver_print(FILE *output, const ldns_resolver *r) -{ - ldns_resolver_print_fmt(output, ldns_output_format_default, r); -} - -void -ldns_zone_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_zone *z) -{ - if(ldns_zone_soa(z)) - ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z)); - ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z)); -} -void -ldns_zone_print(FILE *output, const ldns_zone *z) -{ - ldns_zone_print_fmt(output, ldns_output_format_default, z); -} diff --git a/ldns/host2wire.c b/ldns/host2wire.c deleted file mode 100644 index a12b6b0..0000000 --- a/ldns/host2wire.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - * host2wire.c - * - * conversion routines from the host to the wire format. - * This will usually just a re-ordering of the - * data (as we store it in network format) - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -ldns_status -ldns_dname2buffer_wire(ldns_buffer *buffer, const ldns_rdf *name) -{ - return ldns_dname2buffer_wire_compress(buffer, name, NULL); -} - -ldns_status -ldns_dname2buffer_wire_compress(ldns_buffer *buffer, const ldns_rdf *name, ldns_rbtree_t *compression_data) -{ - ldns_rbnode_t *node; - uint8_t *data; - size_t size; - ldns_rdf *label; - ldns_rdf *rest; - ldns_status s; - - /* If no tree, just add the data */ - if(!compression_data) - { - if (ldns_buffer_reserve(buffer, ldns_rdf_size(name))) - { - ldns_buffer_write(buffer, ldns_rdf_data(name), ldns_rdf_size(name)); - } - return ldns_buffer_status(buffer); - } - - /* No labels left, write final zero */ - if(ldns_dname_label_count(name)==0) - { - if(ldns_buffer_reserve(buffer,1)) - { - ldns_buffer_write_u8(buffer, 0); - } - return ldns_buffer_status(buffer); - } - - /* Can we find the name in the tree? */ - if((node = ldns_rbtree_search(compression_data, name)) != NULL) - { - /* Found */ - uint16_t position = (uint16_t) (intptr_t) node->data | 0xC000; - if (ldns_buffer_reserve(buffer, 2)) - { - ldns_buffer_write_u16(buffer, position); - } - return ldns_buffer_status(buffer); - } - else - { - /* Not found. Write cache entry, take off first label, write it, */ - /* try again with the rest of the name. */ - if (ldns_buffer_position(buffer) < 16384) { - ldns_rdf *key; - - node = LDNS_MALLOC(ldns_rbnode_t); - if(!node) - { - return LDNS_STATUS_MEM_ERR; - } - - key = ldns_rdf_clone(name); - if (!key) { - LDNS_FREE(node); - return LDNS_STATUS_MEM_ERR; - } - node->key = key; - node->data = (void *) (intptr_t) ldns_buffer_position(buffer); - if(!ldns_rbtree_insert(compression_data,node)) - { - /* fprintf(stderr,"Name not found but now it's there?\n"); */ - ldns_rdf_deep_free(key); - LDNS_FREE(node); - } - } - label = ldns_dname_label(name, 0); - rest = ldns_dname_left_chop(name); - size = ldns_rdf_size(label) - 1; /* Don't want the final zero */ - data = ldns_rdf_data(label); - if(ldns_buffer_reserve(buffer, size)) - { - ldns_buffer_write(buffer, data, size); - } - ldns_rdf_deep_free(label); - s = ldns_dname2buffer_wire_compress(buffer, rest, compression_data); - ldns_rdf_deep_free(rest); - return s; - } -} - -ldns_status -ldns_rdf2buffer_wire(ldns_buffer *buffer, const ldns_rdf *rdf) -{ - return ldns_rdf2buffer_wire_compress(buffer, rdf, NULL); -} - -ldns_status -ldns_rdf2buffer_wire_compress(ldns_buffer *buffer, const ldns_rdf *rdf, ldns_rbtree_t *compression_data) -{ - /* If it's a DNAME, call that function to get compression */ - if(compression_data && ldns_rdf_get_type(rdf) == LDNS_RDF_TYPE_DNAME) - { - return ldns_dname2buffer_wire_compress(buffer,rdf,compression_data); - } - - if (ldns_buffer_reserve(buffer, ldns_rdf_size(rdf))) { - ldns_buffer_write(buffer, ldns_rdf_data(rdf), ldns_rdf_size(rdf)); - } - return ldns_buffer_status(buffer); -} - -ldns_status -ldns_rdf2buffer_wire_canonical(ldns_buffer *buffer, const ldns_rdf *rdf) -{ - size_t i; - uint8_t *rdf_data; - - if (ldns_rdf_get_type(rdf) == LDNS_RDF_TYPE_DNAME) { - if (ldns_buffer_reserve(buffer, ldns_rdf_size(rdf))) { - rdf_data = ldns_rdf_data(rdf); - for (i = 0; i < ldns_rdf_size(rdf); i++) { - ldns_buffer_write_u8(buffer, - (uint8_t) LDNS_DNAME_NORMALIZE((int)rdf_data[i])); - } - } - } else { - /* direct copy for all other types */ - if (ldns_buffer_reserve(buffer, ldns_rdf_size(rdf))) { - ldns_buffer_write(buffer, - ldns_rdf_data(rdf), - ldns_rdf_size(rdf)); - } - } - return ldns_buffer_status(buffer); -} - -/* convert a rr list to wireformat */ -ldns_status -ldns_rr_list2buffer_wire(ldns_buffer *buffer,const ldns_rr_list *rr_list) -{ - uint16_t rr_count; - uint16_t i; - - rr_count = ldns_rr_list_rr_count(rr_list); - for(i = 0; i < rr_count; i++) { - (void)ldns_rr2buffer_wire(buffer, ldns_rr_list_rr(rr_list, i), - LDNS_SECTION_ANY); - } - return ldns_buffer_status(buffer); -} - - -ldns_status -ldns_rr2buffer_wire_canonical(ldns_buffer *buffer, - const ldns_rr *rr, - int section) -{ - uint16_t i; - uint16_t rdl_pos = 0; - bool pre_rfc3597 = false; - switch (ldns_rr_get_type(rr)) { - case LDNS_RR_TYPE_NS: - case LDNS_RR_TYPE_MD: - case LDNS_RR_TYPE_MF: - case LDNS_RR_TYPE_CNAME: - case LDNS_RR_TYPE_SOA: - case LDNS_RR_TYPE_MB: - case LDNS_RR_TYPE_MG: - case LDNS_RR_TYPE_MR: - case LDNS_RR_TYPE_PTR: - case LDNS_RR_TYPE_HINFO: - case LDNS_RR_TYPE_MINFO: - case LDNS_RR_TYPE_MX: - case LDNS_RR_TYPE_RP: - case LDNS_RR_TYPE_AFSDB: - case LDNS_RR_TYPE_RT: - case LDNS_RR_TYPE_SIG: - case LDNS_RR_TYPE_PX: - case LDNS_RR_TYPE_NXT: - case LDNS_RR_TYPE_NAPTR: - case LDNS_RR_TYPE_KX: - case LDNS_RR_TYPE_SRV: - case LDNS_RR_TYPE_DNAME: - case LDNS_RR_TYPE_A6: - case LDNS_RR_TYPE_RRSIG: - pre_rfc3597 = true; - break; - default: - break; - } - - if (ldns_rr_owner(rr)) { - (void) ldns_rdf2buffer_wire_canonical(buffer, ldns_rr_owner(rr)); - } - - if (ldns_buffer_reserve(buffer, 4)) { - (void) ldns_buffer_write_u16(buffer, ldns_rr_get_type(rr)); - (void) ldns_buffer_write_u16(buffer, ldns_rr_get_class(rr)); - } - - if (section != LDNS_SECTION_QUESTION) { - if (ldns_buffer_reserve(buffer, 6)) { - ldns_buffer_write_u32(buffer, ldns_rr_ttl(rr)); - /* remember pos for later */ - rdl_pos = ldns_buffer_position(buffer); - ldns_buffer_write_u16(buffer, 0); - } - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - if (pre_rfc3597) { - (void) ldns_rdf2buffer_wire_canonical( - buffer, ldns_rr_rdf(rr, i)); - } else { - (void) ldns_rdf2buffer_wire( - buffer, ldns_rr_rdf(rr, i)); - } - } - if (rdl_pos != 0) { - ldns_buffer_write_u16_at(buffer, rdl_pos, - ldns_buffer_position(buffer) - - rdl_pos - 2); - } - } - return ldns_buffer_status(buffer); -} - -ldns_status -ldns_rr2buffer_wire(ldns_buffer *buffer, const ldns_rr *rr, int section) -{ - return ldns_rr2buffer_wire_compress(buffer,rr,section,NULL); -} - -ldns_status -ldns_rr2buffer_wire_compress(ldns_buffer *buffer, const ldns_rr *rr, int section, ldns_rbtree_t *compression_data) -{ - uint16_t i; - uint16_t rdl_pos = 0; - - if (ldns_rr_owner(rr)) { - (void) ldns_dname2buffer_wire_compress(buffer, ldns_rr_owner(rr), compression_data); - } - - if (ldns_buffer_reserve(buffer, 4)) { - (void) ldns_buffer_write_u16(buffer, ldns_rr_get_type(rr)); - (void) ldns_buffer_write_u16(buffer, ldns_rr_get_class(rr)); - } - - if (section != LDNS_SECTION_QUESTION) { - if (ldns_buffer_reserve(buffer, 6)) { - ldns_buffer_write_u32(buffer, ldns_rr_ttl(rr)); - /* remember pos for later */ - rdl_pos = ldns_buffer_position(buffer); - ldns_buffer_write_u16(buffer, 0); - } - if (LDNS_RR_COMPRESS == - ldns_rr_descript(ldns_rr_get_type(rr))->_compress) { - - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - (void) ldns_rdf2buffer_wire_compress(buffer, - ldns_rr_rdf(rr, i), compression_data); - } - } else { - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - (void) ldns_rdf2buffer_wire( - buffer, ldns_rr_rdf(rr, i)); - } - } - if (rdl_pos != 0) { - ldns_buffer_write_u16_at(buffer, rdl_pos, - ldns_buffer_position(buffer) - - rdl_pos - 2); - } - } - return ldns_buffer_status(buffer); -} - -ldns_status -ldns_rrsig2buffer_wire(ldns_buffer *buffer, const ldns_rr *rr) -{ - uint16_t i; - - /* it must be a sig RR */ - if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) { - return LDNS_STATUS_ERR; - } - - /* Convert all the rdfs, except the actual signature data - * rdf number 8 - the last, hence: -1 */ - for (i = 0; i < ldns_rr_rd_count(rr) - 1; i++) { - (void) ldns_rdf2buffer_wire_canonical(buffer, - ldns_rr_rdf(rr, i)); - } - - return ldns_buffer_status(buffer); -} - -ldns_status -ldns_rr_rdata2buffer_wire(ldns_buffer *buffer, const ldns_rr *rr) -{ - uint16_t i; - - /* convert all the rdf's */ - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - (void) ldns_rdf2buffer_wire(buffer, ldns_rr_rdf(rr,i)); - } - return ldns_buffer_status(buffer); -} - -/* - * Copies the packet header data to the buffer in wire format - */ -static ldns_status -ldns_hdr2buffer_wire(ldns_buffer *buffer, const ldns_pkt *packet) -{ - uint8_t flags; - uint16_t arcount; - - if (ldns_buffer_reserve(buffer, 12)) { - ldns_buffer_write_u16(buffer, ldns_pkt_id(packet)); - - flags = ldns_pkt_qr(packet) << 7 - | ldns_pkt_get_opcode(packet) << 3 - | ldns_pkt_aa(packet) << 2 - | ldns_pkt_tc(packet) << 1 | ldns_pkt_rd(packet); - ldns_buffer_write_u8(buffer, flags); - - flags = ldns_pkt_ra(packet) << 7 - /*| ldns_pkt_z(packet) << 6*/ - | ldns_pkt_ad(packet) << 5 - | ldns_pkt_cd(packet) << 4 - | ldns_pkt_get_rcode(packet); - ldns_buffer_write_u8(buffer, flags); - - ldns_buffer_write_u16(buffer, ldns_pkt_qdcount(packet)); - ldns_buffer_write_u16(buffer, ldns_pkt_ancount(packet)); - ldns_buffer_write_u16(buffer, ldns_pkt_nscount(packet)); - /* add EDNS0 and TSIG to additional if they are there */ - arcount = ldns_pkt_arcount(packet); - if (ldns_pkt_tsig(packet)) { - arcount++; - } - if (ldns_pkt_edns(packet)) { - arcount++; - } - ldns_buffer_write_u16(buffer, arcount); - } - - return ldns_buffer_status(buffer); -} - -static void -compression_node_free(ldns_rbnode_t *node, void *arg) -{ - (void)arg; /* Yes, dear compiler, it is used */ - ldns_rdf_deep_free((ldns_rdf *)node->key); - LDNS_FREE(node); -} - -ldns_status -ldns_pkt2buffer_wire(ldns_buffer *buffer, const ldns_pkt *packet) -{ - ldns_rr_list *rr_list; - uint16_t i; - - /* edns tmp vars */ - ldns_rr *edns_rr; - uint8_t edata[4]; - - ldns_rbtree_t *compression_data = ldns_rbtree_create((int (*)(const void *, const void *))ldns_dname_compare); - - (void) ldns_hdr2buffer_wire(buffer, packet); - - rr_list = ldns_pkt_question(packet); - if (rr_list) { - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - (void) ldns_rr2buffer_wire_compress(buffer, - ldns_rr_list_rr(rr_list, i), LDNS_SECTION_QUESTION, compression_data); - } - } - rr_list = ldns_pkt_answer(packet); - if (rr_list) { - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - (void) ldns_rr2buffer_wire_compress(buffer, - ldns_rr_list_rr(rr_list, i), LDNS_SECTION_ANSWER, compression_data); - } - } - rr_list = ldns_pkt_authority(packet); - if (rr_list) { - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - (void) ldns_rr2buffer_wire_compress(buffer, - ldns_rr_list_rr(rr_list, i), LDNS_SECTION_AUTHORITY, compression_data); - } - } - rr_list = ldns_pkt_additional(packet); - if (rr_list) { - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - (void) ldns_rr2buffer_wire_compress(buffer, - ldns_rr_list_rr(rr_list, i), LDNS_SECTION_ADDITIONAL, compression_data); - } - } - - /* add EDNS to additional if it is needed */ - if (ldns_pkt_edns(packet)) { - edns_rr = ldns_rr_new(); - if(!edns_rr) return LDNS_STATUS_MEM_ERR; - ldns_rr_set_owner(edns_rr, - ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, ".")); - ldns_rr_set_type(edns_rr, LDNS_RR_TYPE_OPT); - ldns_rr_set_class(edns_rr, ldns_pkt_edns_udp_size(packet)); - edata[0] = ldns_pkt_edns_extended_rcode(packet); - edata[1] = ldns_pkt_edns_version(packet); - ldns_write_uint16(&edata[2], ldns_pkt_edns_z(packet)); - ldns_rr_set_ttl(edns_rr, ldns_read_uint32(edata)); - /* don't forget to add the edns rdata (if any) */ - if (packet->_edns_data) - ldns_rr_push_rdf (edns_rr, packet->_edns_data); - (void)ldns_rr2buffer_wire_compress(buffer, edns_rr, LDNS_SECTION_ADDITIONAL, compression_data); - /* take the edns rdata back out of the rr before we free rr */ - if (packet->_edns_data) - (void)ldns_rr_pop_rdf (edns_rr); - ldns_rr_free(edns_rr); - } - - /* add TSIG to additional if it is there */ - if (ldns_pkt_tsig(packet)) { - (void) ldns_rr2buffer_wire_compress(buffer, - ldns_pkt_tsig(packet), LDNS_SECTION_ADDITIONAL, compression_data); - } - - ldns_traverse_postorder(compression_data,compression_node_free,NULL); - ldns_rbtree_free(compression_data); - - return LDNS_STATUS_OK; -} - -ldns_status -ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *result_size) -{ - ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - ldns_status status; - *result_size = 0; - *dest = NULL; - if(!buffer) return LDNS_STATUS_MEM_ERR; - - status = ldns_rdf2buffer_wire(buffer, rdf); - if (status == LDNS_STATUS_OK) { - *result_size = ldns_buffer_position(buffer); - *dest = (uint8_t *) ldns_buffer_export(buffer); - } - ldns_buffer_free(buffer); - return status; -} - -ldns_status -ldns_rr2wire(uint8_t **dest, const ldns_rr *rr, int section, size_t *result_size) -{ - ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - ldns_status status; - *result_size = 0; - *dest = NULL; - if(!buffer) return LDNS_STATUS_MEM_ERR; - - status = ldns_rr2buffer_wire(buffer, rr, section); - if (status == LDNS_STATUS_OK) { - *result_size = ldns_buffer_position(buffer); - *dest = (uint8_t *) ldns_buffer_export(buffer); - } - ldns_buffer_free(buffer); - return status; -} - -ldns_status -ldns_pkt2wire(uint8_t **dest, const ldns_pkt *packet, size_t *result_size) -{ - ldns_buffer *buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - ldns_status status; - *result_size = 0; - *dest = NULL; - if(!buffer) return LDNS_STATUS_MEM_ERR; - - status = ldns_pkt2buffer_wire(buffer, packet); - if (status == LDNS_STATUS_OK) { - *result_size = ldns_buffer_position(buffer); - *dest = (uint8_t *) ldns_buffer_export(buffer); - } - ldns_buffer_free(buffer); - return status; -} diff --git a/ldns/install-sh b/ldns/install-sh deleted file mode 100755 index ec298b5..0000000 --- a/ldns/install-sh +++ /dev/null @@ -1,541 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2020-11-14.01; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# 'make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -tab=' ' -nl=' -' -IFS=" $tab$nl" - -# Set DOITPROG to "echo" to test this script. - -doit=${DOITPROG-} -doit_exec=${doit:-exec} - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -# Create dirs (including intermediate dirs) using mode 755. -# This is like GNU 'install' as of coreutils 8.32 (2020). -mkdir_umask=22 - -backupsuffix= -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -is_target_a_directory=possibly - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -p pass -p to $cpprog. - -s $stripprog installed files. - -S SUFFIX attempt to back up existing files, with suffix SUFFIX. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG - -By default, rm is invoked with -f; when overridden with RMPROG, -it's up to you to specify -f if you want it. - -If -S is not specified, no backups are attempted. - -Email bug reports to bug-automake@gnu.org. -Automake home page: https://www.gnu.org/software/automake/ -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -p) cpprog="$cpprog -p";; - - -s) stripcmd=$stripprog;; - - -S) backupsuffix="$2" - shift;; - - -t) - is_target_a_directory=always - dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) is_target_a_directory=never;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -# We allow the use of options -d and -T together, by making -d -# take the precedence; this is for compatibility with GNU install. - -if test -n "$dir_arg"; then - if test -n "$dst_arg"; then - echo "$0: target directory not allowed when installing a directory." >&2 - exit 1 - fi -fi - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call 'install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - if test $# -gt 1 || test "$is_target_a_directory" = always; then - if test ! -d "$dst_arg"; then - echo "$0: $dst_arg: Is not a directory." >&2 - exit 1 - fi - fi -fi - -if test -z "$dir_arg"; then - do_exit='(exit $ret); exit $ret' - trap "ret=129; $do_exit" 1 - trap "ret=130; $do_exit" 2 - trap "ret=141; $do_exit" 13 - trap "ret=143; $do_exit" 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names problematic for 'test' and other utilities. - case $src in - -* | [=\(\)!]) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - # Don't chown directories that already exist. - if test $dstdir_status = 0; then - chowncmd="" - fi - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - dst=$dst_arg - - # If destination is a directory, append the input filename. - if test -d "$dst"; then - if test "$is_target_a_directory" = never; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dstbase=`basename "$src"` - case $dst in - */) dst=$dst$dstbase;; - *) dst=$dst/$dstbase;; - esac - dstdir_status=0 - else - dstdir=`dirname "$dst"` - test -d "$dstdir" - dstdir_status=$? - fi - fi - - case $dstdir in - */) dstdirslash=$dstdir;; - *) dstdirslash=$dstdir/;; - esac - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - # The $RANDOM variable is not portable (e.g., dash). Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - - trap ' - ret=$? - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null - exit $ret - ' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p'. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null - fi - trap '' 0;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; - esac - - oIFS=$IFS - IFS=/ - set -f - set fnord $dstdir - shift - set +f - IFS=$oIFS - - prefixes= - - for d - do - test X"$d" = X && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=${dstdirslash}_inst.$$_ - rmtmp=${dstdirslash}_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && - { test -z "$stripcmd" || { - # Create $dsttmp read-write so that cp doesn't create it read-only, - # which would cause strip to fail. - if test -z "$doit"; then - : >"$dsttmp" # No need to fork-exec 'touch'. - else - $doit touch "$dsttmp" - fi - } - } && - $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - set +f && - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # If $backupsuffix is set, and the file being installed - # already exists, attempt a backup. Don't worry if it fails, - # e.g., if mv doesn't support -f. - if test -n "$backupsuffix" && test -f "$dst"; then - $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null - fi - - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/ldns/keys.c b/ldns/keys.c deleted file mode 100644 index 016f973..0000000 --- a/ldns/keys.c +++ /dev/null @@ -1,2204 +0,0 @@ -/* - * keys.c handle private keys for use in DNSSEC - * - * This module should hide some of the openSSL complexities - * and give a general interface for private keys and hmac - * handling - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#ifdef HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/rand.h> -#include <openssl/bn.h> -#include <openssl/rsa.h> -#ifdef USE_DSA -#include <openssl/dsa.h> -#endif -#ifndef OPENSSL_NO_ENGINE -#include <openssl/engine.h> -#endif -#endif /* HAVE_SSL */ - -ldns_lookup_table ldns_signing_algorithms[] = { - { LDNS_SIGN_RSAMD5, "RSAMD5" }, - { LDNS_SIGN_RSASHA1, "RSASHA1" }, - { LDNS_SIGN_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" }, -#ifdef USE_SHA2 - { LDNS_SIGN_RSASHA256, "RSASHA256" }, - { LDNS_SIGN_RSASHA512, "RSASHA512" }, -#endif -#ifdef USE_GOST - { LDNS_SIGN_ECC_GOST, "ECC-GOST" }, -#endif -#ifdef USE_ECDSA - { LDNS_SIGN_ECDSAP256SHA256, "ECDSAP256SHA256" }, - { LDNS_SIGN_ECDSAP384SHA384, "ECDSAP384SHA384" }, -#endif -#ifdef USE_ED25519 - { LDNS_SIGN_ED25519, "ED25519" }, -#endif -#ifdef USE_ED448 - { LDNS_SIGN_ED448, "ED448" }, -#endif -#ifdef USE_DSA - { LDNS_SIGN_DSA, "DSA" }, - { LDNS_SIGN_DSA_NSEC3, "DSA-NSEC3-SHA1" }, -#endif - { LDNS_SIGN_HMACMD5, "hmac-md5.sig-alg.reg.int" }, - { LDNS_SIGN_HMACSHA1, "hmac-sha1" }, - { LDNS_SIGN_HMACSHA256, "hmac-sha256" }, - { LDNS_SIGN_HMACSHA224, "hmac-sha224" }, - { LDNS_SIGN_HMACSHA384, "hmac-sha384" }, - { LDNS_SIGN_HMACSHA512, "hmac-sha512" }, - { 0, NULL } -}; - -ldns_key_list * -ldns_key_list_new(void) -{ - ldns_key_list *key_list = LDNS_MALLOC(ldns_key_list); - if (!key_list) { - return NULL; - } else { - key_list->_key_count = 0; - key_list->_keys = NULL; - return key_list; - } -} - -ldns_key * -ldns_key_new(void) -{ - ldns_key *newkey; - - newkey = LDNS_MALLOC(ldns_key); - if (!newkey) { - return NULL; - } else { - /* some defaults - not sure wether to do this */ - ldns_key_set_use(newkey, true); - ldns_key_set_flags(newkey, LDNS_KEY_ZONE_KEY); - ldns_key_set_origttl(newkey, 0); - ldns_key_set_keytag(newkey, 0); - ldns_key_set_inception(newkey, 0); - ldns_key_set_expiration(newkey, 0); - ldns_key_set_pubkey_owner(newkey, NULL); -#ifdef HAVE_SSL - ldns_key_set_evp_key(newkey, NULL); -#endif /* HAVE_SSL */ - ldns_key_set_hmac_key(newkey, NULL); - ldns_key_set_external_key(newkey, NULL); - return newkey; - } -} - -ldns_status -ldns_key_new_frm_fp(ldns_key **k, FILE *fp) -{ - return ldns_key_new_frm_fp_l(k, fp, NULL); -} - -#if defined(HAVE_SSL) && !defined(OPENSSL_NO_ENGINE) -ldns_status -ldns_key_new_frm_engine(ldns_key **key, ENGINE *e, char *key_id, ldns_algorithm alg) -{ - ldns_key *k; - - k = ldns_key_new(); - if(!k) return LDNS_STATUS_MEM_ERR; -#ifndef S_SPLINT_S - k->_key.key = ENGINE_load_private_key(e, key_id, UI_OpenSSL(), NULL); - if(!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } - ldns_key_set_algorithm(k, (ldns_signing_algorithm) alg); - if (!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ENGINE_KEY_NOT_LOADED; - } -#endif /* splint */ - *key = k; - return LDNS_STATUS_OK; -} -#endif - -#ifdef USE_GOST -/** store GOST engine reference loaded into OpenSSL library */ -ENGINE* ldns_gost_engine = NULL; - -int -ldns_key_EVP_load_gost_id(void) -{ - static int gost_id = 0; - const EVP_PKEY_ASN1_METHOD* meth; - ENGINE* e; - - if(gost_id) return gost_id; - - /* see if configuration loaded gost implementation from other engine*/ - meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1); - if(meth) { - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; - } - - /* see if engine can be loaded already */ - e = ENGINE_by_id("gost"); - if(!e) { - /* load it ourself, in case statically linked */ - ENGINE_load_builtin_engines(); - ENGINE_load_dynamic(); - e = ENGINE_by_id("gost"); - } - if(!e) { - /* no gost engine in openssl */ - return 0; - } - if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - - meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1); - if(!meth) { - /* algo not found */ - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - /* Note: do not ENGINE_finish and ENGINE_free the acquired engine - * on some platforms this frees up the meth and unloads gost stuff */ - ldns_gost_engine = e; - - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; -} - -void ldns_key_EVP_unload_gost(void) -{ - if(ldns_gost_engine) { - ENGINE_finish(ldns_gost_engine); - ENGINE_free(ldns_gost_engine); - ldns_gost_engine = NULL; - } -} - -/** read GOST private key */ -static EVP_PKEY* -ldns_key_new_frm_fp_gost_l(FILE* fp, int* line_nr) -{ - char token[16384]; - const unsigned char* pp; - int gost_id; - EVP_PKEY* pkey; - ldns_rdf* b64rdf = NULL; - - gost_id = ldns_key_EVP_load_gost_id(); - if(!gost_id) - return NULL; - - if (ldns_fget_keyword_data_l(fp, "GostAsn1", ": ", token, "\n", - sizeof(token), line_nr) == -1) - return NULL; - while(strlen(token) < 96) { - /* read more b64 from the file, b64 split on multiple lines */ - if(ldns_fget_token_l(fp, token+strlen(token), "\n", - sizeof(token)-strlen(token), line_nr) == -1) - return NULL; - } - if(ldns_str2rdf_b64(&b64rdf, token) != LDNS_STATUS_OK) - return NULL; - pp = (unsigned char*)ldns_rdf_data(b64rdf); - pkey = d2i_PrivateKey(gost_id, NULL, &pp, (int)ldns_rdf_size(b64rdf)); - ldns_rdf_deep_free(b64rdf); - return pkey; -} -#endif - -#ifdef USE_ECDSA -/** calculate public key from private key */ -static int -ldns_EC_KEY_calc_public(EC_KEY* ec) -{ - EC_POINT* pub_key; - const EC_GROUP* group; - group = EC_KEY_get0_group(ec); - pub_key = EC_POINT_new(group); - if(!pub_key) return 0; - if(!EC_POINT_copy(pub_key, EC_GROUP_get0_generator(group))) { - EC_POINT_free(pub_key); - return 0; - } - if(!EC_POINT_mul(group, pub_key, EC_KEY_get0_private_key(ec), - NULL, NULL, NULL)) { - EC_POINT_free(pub_key); - return 0; - } - if(EC_KEY_set_public_key(ec, pub_key) == 0) { - EC_POINT_free(pub_key); - return 0; - } - EC_POINT_free(pub_key); - return 1; -} - -/** read ECDSA private key */ -static EVP_PKEY* -ldns_key_new_frm_fp_ecdsa_l(FILE* fp, ldns_algorithm alg, int* line_nr) -{ - char token[16384]; - ldns_rdf* b64rdf = NULL; - unsigned char* pp; - BIGNUM* bn; - EVP_PKEY* evp_key; - EC_KEY* ec; - if (ldns_fget_keyword_data_l(fp, "PrivateKey", ": ", token, "\n", - sizeof(token), line_nr) == -1) - return NULL; - if(ldns_str2rdf_b64(&b64rdf, token) != LDNS_STATUS_OK) - return NULL; - pp = (unsigned char*)ldns_rdf_data(b64rdf); - - if(alg == LDNS_ECDSAP256SHA256) - ec = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - else if(alg == LDNS_ECDSAP384SHA384) - ec = EC_KEY_new_by_curve_name(NID_secp384r1); - else ec = NULL; - if(!ec) { - ldns_rdf_deep_free(b64rdf); - return NULL; - } - bn = BN_bin2bn(pp, (int)ldns_rdf_size(b64rdf), NULL); - ldns_rdf_deep_free(b64rdf); - if(!bn) { - EC_KEY_free(ec); - return NULL; - } - EC_KEY_set_private_key(ec, bn); - BN_free(bn); - if(!ldns_EC_KEY_calc_public(ec)) { - EC_KEY_free(ec); - return NULL; - } - - evp_key = EVP_PKEY_new(); - if(!evp_key) { - EC_KEY_free(ec); - return NULL; - } - if (!EVP_PKEY_assign_EC_KEY(evp_key, ec)) { - EVP_PKEY_free(evp_key); - EC_KEY_free(ec); - return NULL; - } - return evp_key; -} -#endif - -#ifdef USE_ED25519 -/** turn private key buffer into EC_KEY structure */ -static EVP_PKEY* -ldns_ed25519_priv_raw(uint8_t* pkey, int plen) -{ - const unsigned char* pp; - uint8_t buf[256]; - int buflen = 0; - uint8_t pre[] = {0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, - 0x03, 0x2b, 0x65, 0x70, 0x04, 0x22, 0x04, 0x20}; - int pre_len = 16; - /* ASN looks like this for ED25519 public key - * 302a300506032b6570032100 <32byteskey> - * for ED25519 private key - * 302e020100300506032b657004220420 <32bytes> - * - * for X25519 this was - * 30320201010420 <32byteskey> - * andparameters a00b06092b06010401da470f01 - * (noparameters, preamble is 30250201010420). - * the key is reversed (little endian). - */ - buflen = pre_len + plen; - if((size_t)buflen > sizeof(buf)) - return NULL; - memmove(buf, pre, pre_len); - memmove(buf+pre_len, pkey, plen); - /* reverse the pkey into the buf - key is not reversed it seems */ - /* for(i=0; i<plen; i++) - buf[pre_len+i] = pkey[plen-1-i]; */ - pp = buf; - return d2i_PrivateKey(NID_ED25519, NULL, &pp, buflen); -} - -/** read ED25519 private key */ -static EVP_PKEY* -ldns_key_new_frm_fp_ed25519_l(FILE* fp, int* line_nr) -{ - char token[16384]; - ldns_rdf* b64rdf = NULL; - EVP_PKEY* evp_key; - if (ldns_fget_keyword_data_l(fp, "PrivateKey", ": ", token, "\n", - sizeof(token), line_nr) == -1) - return NULL; - if(ldns_str2rdf_b64(&b64rdf, token) != LDNS_STATUS_OK) - return NULL; - - /* we use d2i_ECPrivateKey because it calculates the public key - * from the private part, which others, EC_KEY_set_private_key, - * and o2i methods, do not do */ - /* for that the private key has to be encoded in ASN1 notation - * with a ED25519 prefix on it */ - - evp_key = ldns_ed25519_priv_raw(ldns_rdf_data(b64rdf), - (int)ldns_rdf_size(b64rdf)); - ldns_rdf_deep_free(b64rdf); - return evp_key; -} -#endif - -#ifdef USE_ED448 -/** turn private key buffer into EC_KEY structure */ -static EVP_PKEY* -ldns_ed448_priv_raw(uint8_t* pkey, int plen) -{ - const unsigned char* pp; - uint8_t buf[256]; - int buflen = 0; - uint8_t pre[] = {0x30, 0x47, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x71, 0x04, 0x3b, 0x04, 0x39}; - int pre_len = 16; - /* ASN looks like this for ED448 - * 3047020100300506032b6571043b0439 <57bytekey> - * the key is reversed (little endian). - */ - buflen = pre_len + plen; - if((size_t)buflen > sizeof(buf)) - return NULL; - memmove(buf, pre, pre_len); - memmove(buf+pre_len, pkey, plen); - /* reverse the pkey into the buf - key is not reversed it seems */ - /* for(i=0; i<plen; i++) - buf[pre_len+i] = pkey[plen-1-i]; */ - pp = buf; - return d2i_PrivateKey(NID_ED448, NULL, &pp, buflen); -} - -/** read ED448 private key */ -static EVP_PKEY* -ldns_key_new_frm_fp_ed448_l(FILE* fp, int* line_nr) -{ - char token[16384]; - ldns_rdf* b64rdf = NULL; - EVP_PKEY* evp_key; - if (ldns_fget_keyword_data_l(fp, "PrivateKey", ": ", token, "\n", - sizeof(token), line_nr) == -1) - return NULL; - if(ldns_str2rdf_b64(&b64rdf, token) != LDNS_STATUS_OK) - return NULL; - - /* convert private key into ASN notation and then convert that */ - evp_key = ldns_ed448_priv_raw(ldns_rdf_data(b64rdf), - (int)ldns_rdf_size(b64rdf)); - ldns_rdf_deep_free(b64rdf); - return evp_key; -} -#endif - -ldns_status -ldns_key_new_frm_fp_l(ldns_key **key, FILE *fp, int *line_nr) -{ - ldns_key *k; - char *d; - ldns_signing_algorithm alg; - ldns_rr *key_rr; -#ifdef HAVE_SSL - RSA *rsa; -#ifdef USE_DSA - DSA *dsa; -#endif - unsigned char *hmac; - size_t hmac_size; -#endif /* HAVE_SSL */ - - k = ldns_key_new(); - - d = LDNS_XMALLOC(char, LDNS_MAX_LINELEN); - if (!k || !d) { - ldns_key_free(k); - LDNS_FREE(d); - return LDNS_STATUS_MEM_ERR; - } - - alg = 0; - - /* the file is highly structured. Do this in sequence */ - /* RSA: - * Private-key-format: v1.x. - * Algorithm: 1 (RSA) - - */ - /* get the key format version number */ - if (ldns_fget_keyword_data_l(fp, "Private-key-format", ": ", d, "\n", - LDNS_MAX_LINELEN, line_nr) == -1) { - /* no version information */ - ldns_key_free(k); - LDNS_FREE(d); - return LDNS_STATUS_SYNTAX_ERR; - } - if (strncmp(d, "v1.", 3) != 0) { - ldns_key_free(k); - LDNS_FREE(d); - return LDNS_STATUS_SYNTAX_VERSION_ERR; - } - - /* get the algorithm type, our file function strip ( ) so there are - * not in the return string! */ - if (ldns_fget_keyword_data_l(fp, "Algorithm", ": ", d, "\n", - LDNS_MAX_LINELEN, line_nr) == -1) { - /* no alg information */ - ldns_key_free(k); - LDNS_FREE(d); - return LDNS_STATUS_SYNTAX_ALG_ERR; - } - - if (strncmp(d, "1 RSA", 2) == 0) { - alg = LDNS_SIGN_RSAMD5; - } - if (strncmp(d, "2 DH", 2) == 0) { - alg = (ldns_signing_algorithm)LDNS_DH; - } - if (strncmp(d, "3 DSA", 2) == 0) { -#ifdef USE_DSA - alg = LDNS_SIGN_DSA; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: DSA not compiled into this "); - fprintf(stderr, "version of ldns\n"); -# endif -#endif - } - if (strncmp(d, "4 ECC", 2) == 0) { - alg = (ldns_signing_algorithm)LDNS_ECC; - } - if (strncmp(d, "5 RSASHA1", 2) == 0) { - alg = LDNS_SIGN_RSASHA1; - } - if (strncmp(d, "6 DSA", 2) == 0) { -#ifdef USE_DSA - alg = LDNS_SIGN_DSA_NSEC3; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: DSA not compiled into this "); - fprintf(stderr, "version of ldns\n"); -# endif -#endif - } - if (strncmp(d, "7 RSASHA1", 2) == 0) { - alg = LDNS_SIGN_RSASHA1_NSEC3; - } - - if (strncmp(d, "8 RSASHA256", 2) == 0) { -#ifdef USE_SHA2 - alg = LDNS_SIGN_RSASHA256; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: SHA256 not compiled into this "); - fprintf(stderr, "version of ldns\n"); -# endif -#endif - } - if (strncmp(d, "10 RSASHA512", 3) == 0) { -#ifdef USE_SHA2 - alg = LDNS_SIGN_RSASHA512; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: SHA512 not compiled into this "); - fprintf(stderr, "version of ldns\n"); -# endif -#endif - } - if (strncmp(d, "12 ECC-GOST", 3) == 0) { -#ifdef USE_GOST - alg = LDNS_SIGN_ECC_GOST; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: ECC-GOST not compiled into this "); - fprintf(stderr, "version of ldns, use --enable-gost\n"); -# endif -#endif - } - if (strncmp(d, "13 ECDSAP256SHA256", 3) == 0) { -#ifdef USE_ECDSA - alg = LDNS_SIGN_ECDSAP256SHA256; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: ECDSA not compiled into this "); - fprintf(stderr, "version of ldns, use --enable-ecdsa\n"); -# endif -#endif - } - if (strncmp(d, "14 ECDSAP384SHA384", 3) == 0) { -#ifdef USE_ECDSA - alg = LDNS_SIGN_ECDSAP384SHA384; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: ECDSA not compiled into this "); - fprintf(stderr, "version of ldns, use --enable-ecdsa\n"); -# endif -#endif - } - if (strncmp(d, "15 ED25519", 3) == 0) { -#ifdef USE_ED25519 - alg = LDNS_SIGN_ED25519; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: ED25519 not compiled into this "); - fprintf(stderr, "version of ldns, use --enable-ed25519\n"); -# endif -#endif - } - if (strncmp(d, "16 ED448", 3) == 0) { -#ifdef USE_ED448 - alg = LDNS_SIGN_ED448; -#else -# ifdef STDERR_MSGS - fprintf(stderr, "Warning: ED448 not compiled into this "); - fprintf(stderr, "version of ldns, use --enable-ed448\n"); -# endif -#endif - } - if (strncmp(d, "157 HMAC-MD5", 4) == 0) { - alg = LDNS_SIGN_HMACMD5; - } - if (strncmp(d, "158 HMAC-SHA1", 4) == 0) { - alg = LDNS_SIGN_HMACSHA1; - } - if (strncmp(d, "159 HMAC-SHA256", 4) == 0) { - alg = LDNS_SIGN_HMACSHA256; - } - /* For compatibility with dnssec-keygen */ - if (strncmp(d, "161 ", 4) == 0) { - alg = LDNS_SIGN_HMACSHA1; - } - if (strncmp(d, "162 HMAC-SHA224", 4) == 0) { - alg = LDNS_SIGN_HMACSHA224; - } - /* For compatibility with dnssec-keygen */ - if (strncmp(d, "163 ", 4) == 0) { - alg = LDNS_SIGN_HMACSHA256; - } - if (strncmp(d, "164 HMAC-SHA384", 4) == 0) { - alg = LDNS_SIGN_HMACSHA384; - } - if (strncmp(d, "165 HMAC-SHA512", 4) == 0) { - alg = LDNS_SIGN_HMACSHA512; - } - LDNS_FREE(d); - - switch(alg) { - case LDNS_SIGN_RSAMD5: - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: -#ifdef USE_SHA2 - case LDNS_SIGN_RSASHA256: - case LDNS_SIGN_RSASHA512: -#endif - ldns_key_set_algorithm(k, alg); -#ifdef HAVE_SSL - rsa = ldns_key_new_frm_fp_rsa_l(fp, line_nr); - if (!rsa) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } - ldns_key_assign_rsa_key(k, rsa); -#endif /* HAVE_SSL */ - break; -#ifdef USE_DSA - case LDNS_SIGN_DSA: - case LDNS_SIGN_DSA_NSEC3: - ldns_key_set_algorithm(k, alg); -#ifdef HAVE_SSL - dsa = ldns_key_new_frm_fp_dsa_l(fp, line_nr); - if (!dsa) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } - ldns_key_assign_dsa_key(k, dsa); -#endif /* HAVE_SSL */ - break; -#endif /* USE_DSA */ - case LDNS_SIGN_HMACMD5: - case LDNS_SIGN_HMACSHA1: - case LDNS_SIGN_HMACSHA224: - case LDNS_SIGN_HMACSHA256: - case LDNS_SIGN_HMACSHA384: - case LDNS_SIGN_HMACSHA512: - ldns_key_set_algorithm(k, alg); -#ifdef HAVE_SSL - hmac = ldns_key_new_frm_fp_hmac_l(fp, line_nr, &hmac_size); - if (!hmac) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } - ldns_key_set_hmac_size(k, hmac_size); - ldns_key_set_hmac_key(k, hmac); -#endif /* HAVE_SSL */ - break; - case LDNS_SIGN_ECC_GOST: - ldns_key_set_algorithm(k, alg); -#if defined(HAVE_SSL) && defined(USE_GOST) - if(!ldns_key_EVP_load_gost_id()) { - ldns_key_free(k); - return LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL; - } - ldns_key_set_evp_key(k, - ldns_key_new_frm_fp_gost_l(fp, line_nr)); -#ifndef S_SPLINT_S - if(!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } -#endif /* splint */ -#endif - break; -#ifdef USE_ECDSA - case LDNS_SIGN_ECDSAP256SHA256: - case LDNS_SIGN_ECDSAP384SHA384: - ldns_key_set_algorithm(k, alg); - ldns_key_set_evp_key(k, - ldns_key_new_frm_fp_ecdsa_l(fp, (ldns_algorithm)alg, line_nr)); -#ifndef S_SPLINT_S - if(!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } -#endif /* splint */ - break; -#endif -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: - ldns_key_set_algorithm(k, alg); - ldns_key_set_evp_key(k, - ldns_key_new_frm_fp_ed25519_l(fp, line_nr)); -#ifndef S_SPLINT_S - if(!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } -#endif /* splint */ - break; -#endif -#ifdef USE_ED448 - case LDNS_SIGN_ED448: - ldns_key_set_algorithm(k, alg); - ldns_key_set_evp_key(k, - ldns_key_new_frm_fp_ed448_l(fp, line_nr)); -#ifndef S_SPLINT_S - if(!k->_key.key) { - ldns_key_free(k); - return LDNS_STATUS_ERR; - } -#endif /* splint */ - break; -#endif - default: - ldns_key_free(k); - return LDNS_STATUS_SYNTAX_ALG_ERR; - } - key_rr = ldns_key2rr(k); - ldns_key_set_keytag(k, ldns_calc_keytag(key_rr)); - ldns_rr_free(key_rr); - - if (key) { - *key = k; - return LDNS_STATUS_OK; - } - ldns_key_free(k); - return LDNS_STATUS_ERR; -} - -#ifdef HAVE_SSL -RSA * -ldns_key_new_frm_fp_rsa(FILE *f) -{ - return ldns_key_new_frm_fp_rsa_l(f, NULL); -} - -RSA * -ldns_key_new_frm_fp_rsa_l(FILE *f, int *line_nr) -{ - /* we parse - * Modulus: - * PublicExponent: - * PrivateExponent: - * Prime1: - * Prime2: - * Exponent1: - * Exponent2: - * Coefficient: - * - * man 3 RSA: - * - * struct - * { - * BIGNUM *n; // public modulus - * BIGNUM *e; // public exponent - * BIGNUM *d; // private exponent - * BIGNUM *p; // secret prime factor - * BIGNUM *q; // secret prime factor - * BIGNUM *dmp1; // d mod (p-1) - * BIGNUM *dmq1; // d mod (q-1) - * BIGNUM *iqmp; // q^-1 mod p - * // ... - * - */ - char *b; - RSA *rsa; - uint8_t *buf; - int i; - BIGNUM *n=NULL, *e=NULL, *d=NULL, *p=NULL, *q=NULL, - *dmp1=NULL, *dmq1=NULL, *iqmp=NULL; - - b = LDNS_XMALLOC(char, LDNS_MAX_LINELEN); - buf = LDNS_XMALLOC(uint8_t, LDNS_MAX_LINELEN); - rsa = RSA_new(); - if (!b || !rsa || !buf) { - goto error; - } - - /* I could use functions again, but that seems an overkill, - * allthough this also looks tedious - */ - - /* Modules, rsa->n */ - if (ldns_fget_keyword_data_l(f, "Modulus", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); -#ifndef S_SPLINT_S - n = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!n) { - goto error; - } - - /* PublicExponent, rsa->e */ - if (ldns_fget_keyword_data_l(f, "PublicExponent", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - e = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!e) { - goto error; - } - - /* PrivateExponent, rsa->d */ - if (ldns_fget_keyword_data_l(f, "PrivateExponent", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - d = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!d) { - goto error; - } - - /* Prime1, rsa->p */ - if (ldns_fget_keyword_data_l(f, "Prime1", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - p = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!p) { - goto error; - } - - /* Prime2, rsa->q */ - if (ldns_fget_keyword_data_l(f, "Prime2", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - q = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!q) { - goto error; - } - - /* Exponent1, rsa->dmp1 */ - if (ldns_fget_keyword_data_l(f, "Exponent1", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - dmp1 = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!dmp1) { - goto error; - } - - /* Exponent2, rsa->dmq1 */ - if (ldns_fget_keyword_data_l(f, "Exponent2", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - dmq1 = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!dmq1) { - goto error; - } - - /* Coefficient, rsa->iqmp */ - if (ldns_fget_keyword_data_l(f, "Coefficient", ": ", b, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)b, buf, ldns_b64_ntop_calculate_size(strlen(b))); - iqmp = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!iqmp) { - goto error; - } -#endif /* splint */ - -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -# ifndef S_SPLINT_S - rsa->n = n; - rsa->e = e; - rsa->d = d; - rsa->p = p; - rsa->q = q; - rsa->dmp1 = dmp1; - rsa->dmq1 = dmq1; - rsa->iqmp = iqmp; -# endif -#else - if(!RSA_set0_key(rsa, n, e, d)) - goto error; - n = NULL; - e = NULL; - d = NULL; - if(!RSA_set0_factors(rsa, p, q)) - goto error; - p = NULL; - q = NULL; - if(!RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)) - goto error; -#endif - - LDNS_FREE(buf); - LDNS_FREE(b); - return rsa; - -error: - RSA_free(rsa); - LDNS_FREE(b); - LDNS_FREE(buf); - BN_free(n); - BN_free(e); - BN_free(d); - BN_free(p); - BN_free(q); - BN_free(dmp1); - BN_free(dmq1); - BN_free(iqmp); - return NULL; -} - -DSA * -ldns_key_new_frm_fp_dsa(FILE *f) -{ - return ldns_key_new_frm_fp_dsa_l(f, NULL); -} - -DSA * -ldns_key_new_frm_fp_dsa_l(FILE *f, ATTR_UNUSED(int *line_nr)) -{ - int i; - char *d; - DSA *dsa; - uint8_t *buf; - BIGNUM *p=NULL, *q=NULL, *g=NULL, *priv_key=NULL, *pub_key=NULL; - - d = LDNS_XMALLOC(char, LDNS_MAX_LINELEN); - buf = LDNS_XMALLOC(uint8_t, LDNS_MAX_LINELEN); - dsa = DSA_new(); - if (!d || !dsa || !buf) { - goto error; - } - - /* the line parser removes the () from the input... */ - - /* Prime, dsa->p */ - if (ldns_fget_keyword_data_l(f, "Primep", ": ", d, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)d, buf, ldns_b64_ntop_calculate_size(strlen(d))); -#ifndef S_SPLINT_S - p = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!p) { - goto error; - } - - /* Subprime, dsa->q */ - if (ldns_fget_keyword_data_l(f, "Subprimeq", ": ", d, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)d, buf, ldns_b64_ntop_calculate_size(strlen(d))); - q = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!q) { - goto error; - } - - /* Base, dsa->g */ - if (ldns_fget_keyword_data_l(f, "Baseg", ": ", d, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)d, buf, ldns_b64_ntop_calculate_size(strlen(d))); - g = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!g) { - goto error; - } - - /* Private key, dsa->priv_key */ - if (ldns_fget_keyword_data_l(f, "Private_valuex", ": ", d, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)d, buf, ldns_b64_ntop_calculate_size(strlen(d))); - priv_key = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!priv_key) { - goto error; - } - - /* Public key, dsa->priv_key */ - if (ldns_fget_keyword_data_l(f, "Public_valuey", ": ", d, "\n", LDNS_MAX_LINELEN, line_nr) == -1) { - goto error; - } - i = ldns_b64_pton((const char*)d, buf, ldns_b64_ntop_calculate_size(strlen(d))); - pub_key = BN_bin2bn((const char unsigned*)buf, i, NULL); - if (!pub_key) { - goto error; - } -#endif /* splint */ - -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -# ifndef S_SPLINT_S - dsa->p = p; - dsa->q = q; - dsa->g = g; - dsa->priv_key = priv_key; - dsa->pub_key = pub_key; -# endif -#else - if(!DSA_set0_pqg(dsa, p, q, g)) - goto error; - p = NULL; - q = NULL; - g = NULL; - if(!DSA_set0_key(dsa, pub_key, priv_key)) - goto error; -#endif - - LDNS_FREE(buf); - LDNS_FREE(d); - - return dsa; - -error: - LDNS_FREE(d); - LDNS_FREE(buf); - DSA_free(dsa); - BN_free(p); - BN_free(q); - BN_free(g); - BN_free(priv_key); - BN_free(pub_key); - return NULL; -} - -unsigned char * -ldns_key_new_frm_fp_hmac(FILE *f, size_t *hmac_size) -{ - return ldns_key_new_frm_fp_hmac_l(f, NULL, hmac_size); -} - -unsigned char * -ldns_key_new_frm_fp_hmac_l( FILE *f - , ATTR_UNUSED(int *line_nr) - , size_t *hmac_size - ) -{ - size_t bufsz; - char d[LDNS_MAX_LINELEN]; - unsigned char *buf = NULL; - - *hmac_size = ldns_fget_keyword_data_l(f, "Key", ": ", d, "\n", - LDNS_MAX_LINELEN, line_nr) == -1 - ? 0 - : (buf = LDNS_XMALLOC( unsigned char, (bufsz = - ldns_b64_ntop_calculate_size(strlen(d))))) == NULL - ? 0 - : (size_t) ldns_b64_pton((const char*)d, buf, bufsz); - return buf; -} -#endif /* HAVE_SSL */ - -#ifdef USE_GOST -static EVP_PKEY* -ldns_gen_gost_key(void) -{ - EVP_PKEY_CTX* ctx; - EVP_PKEY* p = NULL; - int gost_id = ldns_key_EVP_load_gost_id(); - if(!gost_id) - return NULL; - ctx = EVP_PKEY_CTX_new_id(gost_id, NULL); - if(!ctx) { - /* the id should be available now */ - return NULL; - } - if(EVP_PKEY_CTX_ctrl_str(ctx, "paramset", "A") <= 0) { - /* cannot set paramset */ - EVP_PKEY_CTX_free(ctx); - return NULL; - } - - if(EVP_PKEY_keygen_init(ctx) <= 0) { - EVP_PKEY_CTX_free(ctx); - return NULL; - } - if(EVP_PKEY_keygen(ctx, &p) <= 0) { - EVP_PKEY_free(p); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - EVP_PKEY_CTX_free(ctx); - return p; -} -#endif - -ldns_key * -ldns_key_new_frm_algorithm(ldns_signing_algorithm alg, uint16_t size) -{ - ldns_key *k; -#ifdef HAVE_SSL -#ifdef USE_DSA - DSA *d; -#endif /* USE_DSA */ -# ifdef USE_ECDSA - EC_KEY *ec = NULL; -# endif -# ifdef HAVE_EVP_PKEY_KEYGEN - EVP_PKEY_CTX *ctx; -# else - RSA *r; -# endif -#else - int i; - uint16_t offset = 0; -#endif - unsigned char *hmac; - - k = ldns_key_new(); - if (!k) { - return NULL; - } - switch(alg) { - case LDNS_SIGN_RSAMD5: - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: - case LDNS_SIGN_RSASHA256: - case LDNS_SIGN_RSASHA512: -#ifdef HAVE_SSL -#ifdef HAVE_EVP_PKEY_KEYGEN - ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); - if(!ctx) { - ldns_key_free(k); - return NULL; - } - if(EVP_PKEY_keygen_init(ctx) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, size) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } -#ifndef S_SPLINT_S - if (EVP_PKEY_keygen(ctx, &k->_key.key) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } -#endif - EVP_PKEY_CTX_free(ctx); -#else /* HAVE_EVP_PKEY_KEYGEN */ - r = RSA_generate_key((int)size, RSA_F4, NULL, NULL); - if(!r) { - ldns_key_free(k); - return NULL; - } - if (RSA_check_key(r) != 1) { - ldns_key_free(k); - return NULL; - } - ldns_key_set_rsa_key(k, r); - RSA_free(r); -#endif /* HAVE_EVP_PKEY_KEYGEN */ -#endif /* HAVE_SSL */ - break; - case LDNS_SIGN_DSA: - case LDNS_SIGN_DSA_NSEC3: -#ifdef USE_DSA -#ifdef HAVE_SSL -# if OPENSSL_VERSION_NUMBER < 0x00908000L - d = DSA_generate_parameters((int)size, NULL, 0, NULL, NULL, NULL, NULL); - if (!d) { - ldns_key_free(k); - return NULL; - } - -# else - if (! (d = DSA_new())) { - ldns_key_free(k); - return NULL; - } - if (! DSA_generate_parameters_ex(d, (int)size, NULL, 0, NULL, NULL, NULL)) { - DSA_free(d); - ldns_key_free(k); - return NULL; - } -# endif - if (DSA_generate_key(d) != 1) { - ldns_key_free(k); - return NULL; - } - ldns_key_set_dsa_key(k, d); - DSA_free(d); -#endif /* HAVE_SSL */ -#endif /* USE_DSA */ - break; - case LDNS_SIGN_HMACMD5: - case LDNS_SIGN_HMACSHA1: - case LDNS_SIGN_HMACSHA224: - case LDNS_SIGN_HMACSHA256: - case LDNS_SIGN_HMACSHA384: - case LDNS_SIGN_HMACSHA512: -#ifdef HAVE_SSL -#ifndef S_SPLINT_S - k->_key.key = NULL; -#endif /* splint */ -#endif /* HAVE_SSL */ - size = size / 8; - ldns_key_set_hmac_size(k, size); - - hmac = LDNS_XMALLOC(unsigned char, size); - if(!hmac) { - ldns_key_free(k); - return NULL; - } -#ifdef HAVE_SSL - if (RAND_bytes(hmac, (int) size) != 1) { - LDNS_FREE(hmac); - ldns_key_free(k); - return NULL; - } -#else - while (offset + sizeof(i) < size) { - i = random(); - memcpy(&hmac[offset], &i, sizeof(i)); - offset += sizeof(i); - } - if (offset < size) { - i = random(); - memcpy(&hmac[offset], &i, size - offset); - } -#endif /* HAVE_SSL */ - ldns_key_set_hmac_key(k, hmac); - - ldns_key_set_flags(k, 0); - break; - case LDNS_SIGN_ECC_GOST: -#if defined(HAVE_SSL) && defined(USE_GOST) - ldns_key_set_evp_key(k, ldns_gen_gost_key()); -#ifndef S_SPLINT_S - if(!k->_key.key) { - ldns_key_free(k); - return NULL; - } -#endif /* splint */ -#else - ldns_key_free(k); - return NULL; -#endif /* HAVE_SSL and USE_GOST */ - break; - case LDNS_SIGN_ECDSAP256SHA256: - case LDNS_SIGN_ECDSAP384SHA384: -#ifdef USE_ECDSA - if(alg == LDNS_SIGN_ECDSAP256SHA256) - ec = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - else if(alg == LDNS_SIGN_ECDSAP384SHA384) - ec = EC_KEY_new_by_curve_name(NID_secp384r1); - if(!ec) { - ldns_key_free(k); - return NULL; - } - if(!EC_KEY_generate_key(ec)) { - ldns_key_free(k); - EC_KEY_free(ec); - return NULL; - } -#ifndef S_SPLINT_S - k->_key.key = EVP_PKEY_new(); - if(!k->_key.key) { - ldns_key_free(k); - EC_KEY_free(ec); - return NULL; - } - if (!EVP_PKEY_assign_EC_KEY(k->_key.key, ec)) { - ldns_key_free(k); - EC_KEY_free(ec); - return NULL; - } -#endif /* splint */ -#else - ldns_key_free(k); - return NULL; -#endif /* ECDSA */ - break; -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: -#ifdef HAVE_EVP_PKEY_KEYGEN - ctx = EVP_PKEY_CTX_new_id(NID_ED25519, NULL); - if(!ctx) { - ldns_key_free(k); - return NULL; - } - if(EVP_PKEY_keygen_init(ctx) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - if (EVP_PKEY_keygen(ctx, &k->_key.key) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - EVP_PKEY_CTX_free(ctx); -#endif - break; -#endif /* ED25519 */ -#ifdef USE_ED448 - case LDNS_SIGN_ED448: -#ifdef HAVE_EVP_PKEY_KEYGEN - ctx = EVP_PKEY_CTX_new_id(NID_ED448, NULL); - if(!ctx) { - ldns_key_free(k); - return NULL; - } - if(EVP_PKEY_keygen_init(ctx) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - if (EVP_PKEY_keygen(ctx, &k->_key.key) <= 0) { - ldns_key_free(k); - EVP_PKEY_CTX_free(ctx); - return NULL; - } - EVP_PKEY_CTX_free(ctx); -#endif - break; -#endif /* ED448 */ - } - ldns_key_set_algorithm(k, alg); - return k; -} - -void -ldns_key_print(FILE *output, const ldns_key *k) -{ - char *str = ldns_key2str(k); - if (str) { - fprintf(output, "%s", str); - } else { - fprintf(output, "Unable to convert private key to string\n"); - } - LDNS_FREE(str); -} - - -void -ldns_key_set_algorithm(ldns_key *k, ldns_signing_algorithm l) -{ - k->_alg = l; -} - -void -ldns_key_set_flags(ldns_key *k, uint16_t f) -{ - k->_extra.dnssec.flags = f; -} - -#ifdef HAVE_SSL -#ifndef S_SPLINT_S -void -ldns_key_set_evp_key(ldns_key *k, EVP_PKEY *e) -{ - k->_key.key = e; -} - -void -ldns_key_set_rsa_key(ldns_key *k, RSA *r) -{ - EVP_PKEY *key = EVP_PKEY_new(); - EVP_PKEY_set1_RSA(key, r); - k->_key.key = key; -} - -void -ldns_key_set_dsa_key(ldns_key *k, DSA *d) -{ -#ifdef USE_DSA - EVP_PKEY *key = EVP_PKEY_new(); - EVP_PKEY_set1_DSA(key, d); - k->_key.key = key; -#else - (void)k; (void)d; -#endif -} - -void -ldns_key_assign_rsa_key(ldns_key *k, RSA *r) -{ - EVP_PKEY *key = EVP_PKEY_new(); - EVP_PKEY_assign_RSA(key, r); - k->_key.key = key; -} - -void -ldns_key_assign_dsa_key(ldns_key *k, DSA *d) -{ -#ifdef USE_DSA - EVP_PKEY *key = EVP_PKEY_new(); - EVP_PKEY_assign_DSA(key, d); - k->_key.key = key; -#else - (void)k; (void)d; -#endif -} -#endif /* splint */ -#endif /* HAVE_SSL */ - -void -ldns_key_set_hmac_key(ldns_key *k, unsigned char *hmac) -{ - k->_key.hmac.key = hmac; -} - -void -ldns_key_set_hmac_size(ldns_key *k, size_t hmac_size) -{ - k->_key.hmac.size = hmac_size; -} - -void -ldns_key_set_external_key(ldns_key *k, void *external_key) -{ - k->_key.external_key = external_key; -} - -void -ldns_key_set_origttl(ldns_key *k, uint32_t t) -{ - k->_extra.dnssec.orig_ttl = t; -} - -void -ldns_key_set_inception(ldns_key *k, uint32_t i) -{ - k->_extra.dnssec.inception = i; -} - -void -ldns_key_set_expiration(ldns_key *k, uint32_t e) -{ - k->_extra.dnssec.expiration = e; -} - -void -ldns_key_set_pubkey_owner(ldns_key *k, ldns_rdf *r) -{ - k->_pubkey_owner = r; -} - -void -ldns_key_set_keytag(ldns_key *k, uint16_t tag) -{ - k->_extra.dnssec.keytag = tag; -} - -/* read */ -size_t -ldns_key_list_key_count(const ldns_key_list *key_list) -{ - return key_list->_key_count; -} - -ldns_key * -ldns_key_list_key(const ldns_key_list *key, size_t nr) -{ - if (nr < ldns_key_list_key_count(key)) { - return key->_keys[nr]; - } else { - return NULL; - } -} - -ldns_signing_algorithm -ldns_key_algorithm(const ldns_key *k) -{ - return k->_alg; -} - -void -ldns_key_set_use(ldns_key *k, bool v) -{ - if (k) { - k->_use = v; - } -} - -bool -ldns_key_use(const ldns_key *k) -{ - if (k) { - return k->_use; - } - return false; -} - -#ifdef HAVE_SSL -#ifndef S_SPLINT_S -EVP_PKEY * -ldns_key_evp_key(const ldns_key *k) -{ - return k->_key.key; -} - -RSA * -ldns_key_rsa_key(const ldns_key *k) -{ - if (k->_key.key) { - return EVP_PKEY_get1_RSA(k->_key.key); - } else { - return NULL; - } -} - -DSA * -ldns_key_dsa_key(const ldns_key *k) -{ -#ifdef USE_DSA - if (k->_key.key) { - return EVP_PKEY_get1_DSA(k->_key.key); - } else { - return NULL; - } -#else - (void)k; - return NULL; -#endif -} -#endif /* splint */ -#endif /* HAVE_SSL */ - -unsigned char * -ldns_key_hmac_key(const ldns_key *k) -{ - if (k->_key.hmac.key) { - return k->_key.hmac.key; - } else { - return NULL; - } -} - -size_t -ldns_key_hmac_size(const ldns_key *k) -{ - if (k->_key.hmac.size) { - return k->_key.hmac.size; - } else { - return 0; - } -} - -void * -ldns_key_external_key(const ldns_key *k) -{ - return k->_key.external_key; -} - -uint32_t -ldns_key_origttl(const ldns_key *k) -{ - return k->_extra.dnssec.orig_ttl; -} - -uint16_t -ldns_key_flags(const ldns_key *k) -{ - return k->_extra.dnssec.flags; -} - -uint32_t -ldns_key_inception(const ldns_key *k) -{ - return k->_extra.dnssec.inception; -} - -uint32_t -ldns_key_expiration(const ldns_key *k) -{ - return k->_extra.dnssec.expiration; -} - -uint16_t -ldns_key_keytag(const ldns_key *k) -{ - return k->_extra.dnssec.keytag; -} - -ldns_rdf * -ldns_key_pubkey_owner(const ldns_key *k) -{ - return k->_pubkey_owner; -} - -/* write */ -void -ldns_key_list_set_use(ldns_key_list *keys, bool v) -{ - size_t i; - - for (i = 0; i < ldns_key_list_key_count(keys); i++) { - ldns_key_set_use(ldns_key_list_key(keys, i), v); - } -} - -void -ldns_key_list_set_key_count(ldns_key_list *key, size_t count) -{ - key->_key_count = count; -} - -bool -ldns_key_list_push_key(ldns_key_list *key_list, ldns_key *key) -{ - size_t key_count; - ldns_key **keys; - - key_count = ldns_key_list_key_count(key_list); - - /* grow the array */ - keys = LDNS_XREALLOC( - key_list->_keys, ldns_key *, key_count + 1); - if (!keys) { - return false; - } - - /* add the new member */ - key_list->_keys = keys; - key_list->_keys[key_count] = key; - - ldns_key_list_set_key_count(key_list, key_count + 1); - return true; -} - -ldns_key * -ldns_key_list_pop_key(ldns_key_list *key_list) -{ - size_t key_count; - ldns_key** a; - ldns_key *pop; - - if (!key_list) { - return NULL; - } - - key_count = ldns_key_list_key_count(key_list); - if (key_count == 0) { - return NULL; - } - - pop = ldns_key_list_key(key_list, key_count); - - /* shrink the array */ - a = LDNS_XREALLOC(key_list->_keys, ldns_key *, key_count - 1); - if(a) { - key_list->_keys = a; - } - - ldns_key_list_set_key_count(key_list, key_count - 1); - - return pop; -} - -#ifdef HAVE_SSL -#ifndef S_SPLINT_S -/* data pointer must be large enough (LDNS_MAX_KEYLEN) */ -static bool -ldns_key_rsa2bin(unsigned char *data, RSA *k, uint16_t *size) -{ - int i,j; - const BIGNUM *n=NULL, *e=NULL; - - if (!k) { - return false; - } -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) - n = k->n; - e = k->e; -#else - RSA_get0_key(k, &n, &e, NULL); -#endif - - if (BN_num_bytes(e) <= 256) { - /* normally only this path is executed (small factors are - * more common - */ - data[0] = (unsigned char) BN_num_bytes(e); - i = BN_bn2bin(e, data + 1); - j = BN_bn2bin(n, data + i + 1); - *size = (uint16_t) i + j; - } else if (BN_num_bytes(e) <= 65536) { - data[0] = 0; - /* BN_bn2bin does bigendian, _uint16 also */ - ldns_write_uint16(data + 1, (uint16_t) BN_num_bytes(e)); - - BN_bn2bin(e, data + 3); - BN_bn2bin(n, data + 4 + BN_num_bytes(e)); - *size = (uint16_t) BN_num_bytes(n) + 6; - } else { - return false; - } - return true; -} - -#ifdef USE_DSA -/* data pointer must be large enough (LDNS_MAX_KEYLEN) */ -static bool -ldns_key_dsa2bin(unsigned char *data, DSA *k, uint16_t *size) -{ - uint8_t T; - const BIGNUM *p, *q, *g; - const BIGNUM *pub_key, *priv_key; - - if (!k) { - return false; - } - - /* See RFC2536 */ -# ifdef HAVE_DSA_GET0_PQG - DSA_get0_pqg(k, &p, &q, &g); -# else - p = k->p; q = k->q; g = k->g; -# endif -# ifdef HAVE_DSA_GET0_KEY - DSA_get0_key(k, &pub_key, &priv_key); -# else - pub_key = k->pub_key; priv_key = k->priv_key; -# endif - (void)priv_key; - *size = (uint16_t)BN_num_bytes(p); - T = (*size - 64) / 8; - - if (T > 8) { -#ifdef STDERR_MSGS - fprintf(stderr, "DSA key with T > 8 (ie. > 1024 bits)"); - fprintf(stderr, " not implemented\n"); -#endif - return false; - } - - /* size = 64 + (T * 8); */ - memset(data, 0, 21 + *size * 3); - data[0] = (unsigned char)T; - BN_bn2bin(q, data + 1 ); /* 20 octects */ - BN_bn2bin(p, data + 21 ); /* offset octects */ - BN_bn2bin(g, data + 21 + *size * 2 - BN_num_bytes(g)); - BN_bn2bin(pub_key,data + 21 + *size * 3 - BN_num_bytes(pub_key)); - *size = 21 + *size * 3; - return true; -} -#endif /* USE_DSA */ - -#ifdef USE_GOST -static bool -ldns_key_gost2bin(unsigned char* data, EVP_PKEY* k, uint16_t* size) -{ - int i; - unsigned char* pp = NULL; - if(i2d_PUBKEY(k, &pp) != 37 + 64) { - /* expect 37 byte(ASN header) and 64 byte(X and Y) */ - free(pp); - return false; - } - /* omit ASN header */ - for(i=0; i<64; i++) - data[i] = pp[i+37]; - free(pp); - *size = 64; - return true; -} -#endif /* USE_GOST */ - -#ifdef USE_ED25519 -static bool -ldns_key_ed255192bin(unsigned char* data, EVP_PKEY* k, uint16_t* size) -{ - int i; - unsigned char* pp = NULL; - if(i2d_PUBKEY(k, &pp) != 12 + 32) { - /* expect 12 byte(ASN header) and 32 byte(pubkey) */ - free(pp); - return false; - } - /* omit ASN header */ - for(i=0; i<32; i++) - data[i] = pp[i+12]; - free(pp); - *size = 32; - return true; -} -#endif /* USE_ED25519 */ - -#ifdef USE_ED448 -static bool -ldns_key_ed4482bin(unsigned char* data, EVP_PKEY* k, uint16_t* size) -{ - int i; - unsigned char* pp = NULL; - if(i2d_PUBKEY(k, &pp) != 12 + 57) { - /* expect 12 byte(ASN header) and 57 byte(pubkey) */ - free(pp); - return false; - } - /* omit ASN header */ - for(i=0; i<57; i++) - data[i] = pp[i+12]; - free(pp); - *size = 57; - return true; -} -#endif /* USE_ED448 */ -#endif /* splint */ -#endif /* HAVE_SSL */ - -ldns_rr * -ldns_key2rr(const ldns_key *k) -{ - /* this function will convert a the keydata contained in - * rsa/dsa pointers to a DNSKEY rr. It will fill in as - * much as it can, but it does not know about key-flags - * for instance - */ - ldns_rr *pubkey; - ldns_rdf *keybin; - unsigned char *bin = NULL; - uint16_t size = 0; -#ifdef HAVE_SSL - RSA *rsa = NULL; -#ifdef USE_DSA - DSA *dsa = NULL; -#endif /* USE_DSA */ -#endif /* HAVE_SSL */ -#ifdef USE_ECDSA - EC_KEY* ec; -#endif - int internal_data = 0; - - if (!k) { - return NULL; - } - pubkey = ldns_rr_new(); - - switch (ldns_key_algorithm(k)) { - case LDNS_SIGN_HMACMD5: - case LDNS_SIGN_HMACSHA1: - case LDNS_SIGN_HMACSHA224: - case LDNS_SIGN_HMACSHA256: - case LDNS_SIGN_HMACSHA384: - case LDNS_SIGN_HMACSHA512: - ldns_rr_set_type(pubkey, LDNS_RR_TYPE_KEY); - break; - default: - ldns_rr_set_type(pubkey, LDNS_RR_TYPE_DNSKEY); - break; - } - /* zero-th rdf - flags */ - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, - ldns_key_flags(k))); - /* first - proto */ - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, LDNS_DNSSEC_KEYPROTO)); - - if (ldns_key_pubkey_owner(k)) { - ldns_rr_set_owner(pubkey, ldns_rdf_clone(ldns_key_pubkey_owner(k))); - } - - /* third - da algorithm */ - switch(ldns_key_algorithm(k)) { - case LDNS_SIGN_RSAMD5: - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: - case LDNS_SIGN_RSASHA256: - case LDNS_SIGN_RSASHA512: - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int8(LDNS_RDF_TYPE_ALG, ldns_key_algorithm(k))); -#ifdef HAVE_SSL - rsa = ldns_key_rsa_key(k); - if (rsa) { - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - if (!ldns_key_rsa2bin(bin, rsa, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } - RSA_free(rsa); - internal_data = 1; - } -#endif - size++; - break; - case LDNS_SIGN_DSA: - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int8(LDNS_RDF_TYPE_ALG, LDNS_DSA)); -#ifdef USE_DSA -#ifdef HAVE_SSL - dsa = ldns_key_dsa_key(k); - if (dsa) { - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - if (!ldns_key_dsa2bin(bin, dsa, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } - DSA_free(dsa); - internal_data = 1; - } -#endif /* HAVE_SSL */ -#endif /* USE_DSA */ - break; - case LDNS_SIGN_DSA_NSEC3: - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int8(LDNS_RDF_TYPE_ALG, LDNS_DSA_NSEC3)); -#ifdef USE_DSA -#ifdef HAVE_SSL - dsa = ldns_key_dsa_key(k); - if (dsa) { - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - if (!ldns_key_dsa2bin(bin, dsa, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } - DSA_free(dsa); - internal_data = 1; - } -#endif /* HAVE_SSL */ -#endif /* USE_DSA */ - break; - case LDNS_SIGN_ECC_GOST: - ldns_rr_push_rdf(pubkey, ldns_native2rdf_int8( - LDNS_RDF_TYPE_ALG, ldns_key_algorithm(k))); -#if defined(HAVE_SSL) && defined(USE_GOST) - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } -#ifndef S_SPLINT_S - if (!ldns_key_gost2bin(bin, k->_key.key, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } -#endif /* splint */ - internal_data = 1; -#else - ldns_rr_free(pubkey); - return NULL; -#endif /* HAVE_SSL and USE_GOST */ - break; - case LDNS_SIGN_ECDSAP256SHA256: - case LDNS_SIGN_ECDSAP384SHA384: -#ifdef USE_ECDSA - ldns_rr_push_rdf(pubkey, ldns_native2rdf_int8( - LDNS_RDF_TYPE_ALG, ldns_key_algorithm(k))); - bin = NULL; -#ifndef S_SPLINT_S - ec = EVP_PKEY_get1_EC_KEY(k->_key.key); -#endif - EC_KEY_set_conv_form(ec, POINT_CONVERSION_UNCOMPRESSED); - size = (uint16_t)i2o_ECPublicKey(ec, NULL); - if(!i2o_ECPublicKey(ec, &bin)) { - EC_KEY_free(ec); - ldns_rr_free(pubkey); - return NULL; - } - if(size > 1) { - /* move back one byte to shave off the 0x02 - * 'uncompressed' indicator that openssl made - * Actually its 0x04 (from implementation). - */ - assert(bin[0] == POINT_CONVERSION_UNCOMPRESSED); - size -= 1; - memmove(bin, bin+1, size); - } - /* down the reference count for ec, its still assigned - * to the pkey */ - EC_KEY_free(ec); - internal_data = 1; -#else - ldns_rr_free(pubkey); - return NULL; -#endif /* ECDSA */ - break; -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: - ldns_rr_push_rdf(pubkey, ldns_native2rdf_int8( - LDNS_RDF_TYPE_ALG, ldns_key_algorithm(k))); - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - if (!ldns_key_ed255192bin(bin, k->_key.key, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } - internal_data = 1; - break; -#endif -#ifdef USE_ED448 - case LDNS_SIGN_ED448: - ldns_rr_push_rdf(pubkey, ldns_native2rdf_int8( - LDNS_RDF_TYPE_ALG, ldns_key_algorithm(k))); - bin = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - if (!ldns_key_ed4482bin(bin, k->_key.key, &size)) { - LDNS_FREE(bin); - ldns_rr_free(pubkey); - return NULL; - } - internal_data = 1; - break; -#endif - case LDNS_SIGN_HMACMD5: - case LDNS_SIGN_HMACSHA1: - case LDNS_SIGN_HMACSHA224: - case LDNS_SIGN_HMACSHA256: - case LDNS_SIGN_HMACSHA384: - case LDNS_SIGN_HMACSHA512: - bin = LDNS_XMALLOC(unsigned char, ldns_key_hmac_size(k)); - if (!bin) { - ldns_rr_free(pubkey); - return NULL; - } - ldns_rr_push_rdf(pubkey, - ldns_native2rdf_int8(LDNS_RDF_TYPE_ALG, - ldns_key_algorithm(k))); - size = ldns_key_hmac_size(k); - memcpy(bin, ldns_key_hmac_key(k), size); - internal_data = 1; - break; - } - /* fourth the key bin material */ - if (internal_data) { - keybin = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, size, bin); - LDNS_FREE(bin); - ldns_rr_push_rdf(pubkey, keybin); - } - return pubkey; -} - -void -ldns_key_free(ldns_key *key) -{ - LDNS_FREE(key); -} - -void -ldns_key_deep_free(ldns_key *key) -{ - unsigned char* hmac; - if (ldns_key_pubkey_owner(key)) { - ldns_rdf_deep_free(ldns_key_pubkey_owner(key)); - } -#ifdef HAVE_SSL - if (ldns_key_evp_key(key)) { - EVP_PKEY_free(ldns_key_evp_key(key)); - } -#endif /* HAVE_SSL */ - if (ldns_key_hmac_key(key)) { - hmac = ldns_key_hmac_key(key); - LDNS_FREE(hmac); - } - LDNS_FREE(key); -} - -void -ldns_key_list_free(ldns_key_list *key_list) -{ - size_t i; - for (i = 0; i < ldns_key_list_key_count(key_list); i++) { - ldns_key_deep_free(ldns_key_list_key(key_list, i)); - } - LDNS_FREE(key_list->_keys); - LDNS_FREE(key_list); -} - -ldns_rr * -ldns_read_anchor_file(const char *filename) -{ - FILE *fp; - /*char line[LDNS_MAX_PACKETLEN];*/ - char *line = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN); - int c; - size_t i = 0; - ldns_rr *r; - ldns_status status; - if(!line) { - return NULL; - } - - fp = fopen(filename, "r"); - if (!fp) { -#ifdef STDERR_MSGS - fprintf(stderr, "Unable to open %s: %s\n", filename, strerror(errno)); -#endif - LDNS_FREE(line); - return NULL; - } - - while ((c = fgetc(fp)) && i+1 < LDNS_MAX_PACKETLEN && c != EOF) { - line[i] = c; - i++; - } - line[i] = '\0'; - - fclose(fp); - - if (i <= 0) { -#ifdef STDERR_MSGS - fprintf(stderr, "nothing read from %s", filename); -#endif - LDNS_FREE(line); - return NULL; - } else { - status = ldns_rr_new_frm_str(&r, line, 0, NULL, NULL); - if (status == LDNS_STATUS_OK && (ldns_rr_get_type(r) == LDNS_RR_TYPE_DNSKEY || ldns_rr_get_type(r) == LDNS_RR_TYPE_DS)) { - LDNS_FREE(line); - return r; - } else { -#ifdef STDERR_MSGS - fprintf(stderr, "Error creating DNSKEY or DS rr from %s: %s\n", filename, ldns_get_errorstr_by_id(status)); -#endif - LDNS_FREE(line); - return NULL; - } - } -} - -char * -ldns_key_get_file_base_name(const ldns_key *key) -{ - ldns_buffer *buffer; - char *file_base_name; - - buffer = ldns_buffer_new(255); - ldns_buffer_printf(buffer, "K"); - (void)ldns_rdf2buffer_str_dname(buffer, ldns_key_pubkey_owner(key)); - ldns_buffer_printf(buffer, - "+%03u+%05u", - ldns_key_algorithm(key), - ldns_key_keytag(key)); - file_base_name = ldns_buffer_export(buffer); - ldns_buffer_free(buffer); - return file_base_name; -} - -int ldns_key_algo_supported(int algo) -{ - ldns_lookup_table *lt = ldns_signing_algorithms; - while(lt->name) { - if(lt->id == algo) - return 1; - lt++; - } - return 0; -} - -ldns_signing_algorithm ldns_get_signing_algorithm_by_name(const char* name) -{ - /* list of (signing algorithm id, alias_name) */ - ldns_lookup_table aliases[] = { - /* from bind dnssec-keygen */ - {LDNS_SIGN_HMACMD5, "HMAC-MD5"}, - {LDNS_SIGN_DSA_NSEC3, "NSEC3DSA"}, - {LDNS_SIGN_RSASHA1_NSEC3, "NSEC3RSASHA1"}, - /* old ldns usage, now RFC names */ -#ifdef USE_DSA - {LDNS_SIGN_DSA_NSEC3, "DSA_NSEC3" }, -#endif - {LDNS_SIGN_RSASHA1_NSEC3, "RSASHA1_NSEC3" }, -#ifdef USE_GOST - {LDNS_SIGN_ECC_GOST, "GOST"}, -#endif - /* compat with possible output */ - {LDNS_DH, "DH"}, - {LDNS_ECC, "ECC"}, - {LDNS_INDIRECT, "INDIRECT"}, - {LDNS_PRIVATEDNS, "PRIVATEDNS"}, - {LDNS_PRIVATEOID, "PRIVATEOID"}, - {0, NULL}}; - ldns_lookup_table* lt = ldns_signing_algorithms; - ldns_signing_algorithm a; - char *endptr; - - while(lt->name) { - if(strcasecmp(lt->name, name) == 0) - return lt->id; - lt++; - } - lt = aliases; - while(lt->name) { - if(strcasecmp(lt->name, name) == 0) - return lt->id; - lt++; - } - a = strtol(name, &endptr, 10); - if (*name && !*endptr) - return a; - - return 0; -} diff --git a/ldns/ldns/buffer.h b/ldns/ldns/buffer.h deleted file mode 100644 index f49a550..0000000 --- a/ldns/ldns/buffer.h +++ /dev/null @@ -1,645 +0,0 @@ -/* - * buffer.h -- generic memory buffer. - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - * - * The buffer module implements a generic buffer. The API is based on - * the java.nio.Buffer interface. - */ - -#ifndef LDNS_BUFFER_H -#define LDNS_BUFFER_H - -#include <assert.h> -#include <stdarg.h> -#include <string.h> - -#include <ldns/error.h> -#include <ldns/common.h> - -#include "ldns/util.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * number of initial bytes in buffer of - * which we cannot tell the size before hand - */ -#define LDNS_MIN_BUFLEN 512 - -/** - * \file buffer.h - * - * This file contains the definition of ldns_buffer, and functions to manipulate those. - */ - -/** - * implementation of buffers to ease operations - * - * ldns_buffers can contain arbitrary information, per octet. You can write - * to the current end of a buffer, read from the current position, and - * access any data within it. - * - * Example use of buffers is in the source code of \ref host2str.c - */ -struct ldns_struct_buffer -{ - /** The current position used for reading/writing */ - size_t _position; - - /** The read/write limit */ - size_t _limit; - - /** The amount of data the buffer can contain */ - size_t _capacity; - - /** The data contained in the buffer */ - uint8_t *_data; - - /** If the buffer is fixed it cannot be resized */ - unsigned _fixed : 1; - - /** The current state of the buffer. If writing to the buffer fails - * for any reason, this value is changed. This way, you can perform - * multiple writes in sequence and check for success afterwards. */ - ldns_status _status; -}; -typedef struct ldns_struct_buffer ldns_buffer; - - -#ifdef NDEBUG -INLINE void -ldns_buffer_invariant(const ldns_buffer *ATTR_UNUSED(buffer)) -{ -} -#else -INLINE void -ldns_buffer_invariant(const ldns_buffer *buffer) -{ - assert(buffer != NULL); - assert(buffer->_position <= buffer->_limit); - assert(buffer->_limit <= buffer->_capacity); - assert(buffer->_data != NULL); -} -#endif - -/** - * creates a new buffer with the specified capacity. - * - * \param[in] capacity the size (in bytes) to allocate for the buffer - * \return the created buffer - */ -ldns_buffer *ldns_buffer_new(size_t capacity); - -/** - * creates a buffer with the specified data. The data IS copied - * and MEMORY allocations are done. The buffer is not fixed and can - * be resized using buffer_reserve(). - * - * \param[in] buffer pointer to the buffer to put the data in - * \param[in] data the data to encapsulate in the buffer - * \param[in] size the size of the data - */ -void ldns_buffer_new_frm_data(ldns_buffer *buffer, const void *data, size_t size); - -/** - * clears the buffer and make it ready for writing. The buffer's limit - * is set to the capacity and the position is set to 0. - * \param[in] buffer the buffer to clear - */ -INLINE void ldns_buffer_clear(ldns_buffer *buffer) -{ - ldns_buffer_invariant(buffer); - - /* reset status here? */ - - buffer->_position = 0; - buffer->_limit = buffer->_capacity; -} - -/** - * makes the buffer ready for reading the data that has been written to - * the buffer. The buffer's limit is set to the current position and - * the position is set to 0. - * - * \param[in] buffer the buffer to flip - * \return void - */ -INLINE void ldns_buffer_flip(ldns_buffer *buffer) -{ - ldns_buffer_invariant(buffer); - - buffer->_limit = buffer->_position; - buffer->_position = 0; -} - -/** - * make the buffer ready for re-reading the data. The buffer's - * position is reset to 0. - * \param[in] buffer the buffer to rewind - */ -INLINE void ldns_buffer_rewind(ldns_buffer *buffer) -{ - ldns_buffer_invariant(buffer); - - buffer->_position = 0; -} - -/** - * returns the current position in the buffer (as a number of bytes) - * \param[in] buffer the buffer - * \return the current position - */ -INLINE size_t -ldns_buffer_position(const ldns_buffer *buffer) -{ - return buffer->_position; -} - -/** - * sets the buffer's position to MARK. The position must be less than - * or equal to the buffer's limit. - * \param[in] buffer the buffer - * \param[in] mark the mark to use - */ -INLINE void -ldns_buffer_set_position(ldns_buffer *buffer, size_t mark) -{ - assert(mark <= buffer->_limit); - buffer->_position = mark; -} - -/** - * changes the buffer's position by COUNT bytes. The position must not - * be moved behind the buffer's limit or before the beginning of the - * buffer. - * \param[in] buffer the buffer - * \param[in] count the count to use - */ -INLINE void -ldns_buffer_skip(ldns_buffer *buffer, ssize_t count) -{ - assert(buffer->_position + count <= buffer->_limit); - buffer->_position += count; -} - -/** - * returns the maximum size of the buffer - * \param[in] buffer - * \return the size - */ -INLINE size_t -ldns_buffer_limit(const ldns_buffer *buffer) -{ - return buffer->_limit; -} - -/** - * changes the buffer's limit. If the buffer's position is greater - * than the new limit the position is set to the limit. - * \param[in] buffer the buffer - * \param[in] limit the new limit - */ -INLINE void -ldns_buffer_set_limit(ldns_buffer *buffer, size_t limit) -{ - assert(limit <= buffer->_capacity); - buffer->_limit = limit; - if (buffer->_position > buffer->_limit) - buffer->_position = buffer->_limit; -} - -/** - * returns the number of bytes the buffer can hold. - * \param[in] buffer the buffer - * \return the number of bytes - */ -INLINE size_t -ldns_buffer_capacity(const ldns_buffer *buffer) -{ - return buffer->_capacity; -} - -/** - * changes the buffer's capacity. The data is reallocated so any - * pointers to the data may become invalid. The buffer's limit is set - * to the buffer's new capacity. - * \param[in] buffer the buffer - * \param[in] capacity the capacity to use - * \return whether this failed or succeeded - */ -bool ldns_buffer_set_capacity(ldns_buffer *buffer, size_t capacity); - -/** - * ensures BUFFER can contain at least AMOUNT more bytes. The buffer's - * capacity is increased if necessary using buffer_set_capacity(). - * - * The buffer's limit is always set to the (possibly increased) - * capacity. - * \param[in] buffer the buffer - * \param[in] amount amount to use - * \return whether this failed or succeeded - */ -bool ldns_buffer_reserve(ldns_buffer *buffer, size_t amount); - -/** - * returns a pointer to the data at the indicated position. - * \param[in] buffer the buffer - * \param[in] at position - * \return the pointer to the data - */ -INLINE uint8_t * -ldns_buffer_at(const ldns_buffer *buffer, size_t at) -{ - assert(at <= buffer->_limit); - return buffer->_data + at; -} - -/** - * returns a pointer to the beginning of the buffer (the data at - * position 0). - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -ldns_buffer_begin(const ldns_buffer *buffer) -{ - return ldns_buffer_at(buffer, 0); -} - -/** - * returns a pointer to the end of the buffer (the data at the buffer's - * limit). - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -ldns_buffer_end(const ldns_buffer *buffer) -{ - return ldns_buffer_at(buffer, buffer->_limit); -} - -/** - * returns a pointer to the data at the buffer's current position. - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -ldns_buffer_current(const ldns_buffer *buffer) -{ - return ldns_buffer_at(buffer, buffer->_position); -} - -/** - * returns the number of bytes remaining between the indicated position and - * the limit. - * \param[in] buffer the buffer - * \param[in] at indicated position - * \return number of bytes - */ -INLINE size_t -ldns_buffer_remaining_at(const ldns_buffer *buffer, size_t at) -{ - ldns_buffer_invariant(buffer); - assert(at <= buffer->_limit); - return buffer->_limit - at; -} - -/** - * returns the number of bytes remaining between the buffer's position and - * limit. - * \param[in] buffer the buffer - * \return the number of bytes - */ -INLINE size_t -ldns_buffer_remaining(const ldns_buffer *buffer) -{ - return ldns_buffer_remaining_at(buffer, buffer->_position); -} - -/** - * checks if the buffer has at least COUNT more bytes available. - * Before reading or writing the caller needs to ensure enough space - * is available! - * \param[in] buffer the buffer - * \param[in] at indicated position - * \param[in] count how much is available - * \return true or false (as int?) - */ -INLINE int -ldns_buffer_available_at(const ldns_buffer *buffer, size_t at, size_t count) -{ - return count <= ldns_buffer_remaining_at(buffer, at); -} - -/** - * checks if the buffer has count bytes available at the current position - * \param[in] buffer the buffer - * \param[in] count how much is available - * \return true or false (as int?) - */ -INLINE int -ldns_buffer_available(const ldns_buffer *buffer, size_t count) -{ - return ldns_buffer_available_at(buffer, buffer->_position, count); -} - -/** - * writes the given data to the buffer at the specified position - * \param[in] buffer the buffer - * \param[in] at the position (in number of bytes) to write the data at - * \param[in] data pointer to the data to write to the buffer - * \param[in] count the number of bytes of data to write - */ -INLINE void -ldns_buffer_write_at(ldns_buffer *buffer, size_t at, const void *data, size_t count) -{ - assert(ldns_buffer_available_at(buffer, at, count)); - memcpy(buffer->_data + at, data, count); -} - -/** - * writes count bytes of data to the current position of the buffer - * \param[in] buffer the buffer - * \param[in] data the data to write - * \param[in] count the length of the data to write - */ -INLINE void -ldns_buffer_write(ldns_buffer *buffer, const void *data, size_t count) -{ - ldns_buffer_write_at(buffer, buffer->_position, data, count); - buffer->_position += count; -} - -/** - * copies the given (null-delimited) string to the specified position at the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] str the string to write - */ -INLINE void -ldns_buffer_write_string_at(ldns_buffer *buffer, size_t at, const char *str) -{ - ldns_buffer_write_at(buffer, at, str, strlen(str)); -} - -/** - * copies the given (null-delimited) string to the current position at the buffer - * \param[in] buffer the buffer - * \param[in] str the string to write - */ -INLINE void -ldns_buffer_write_string(ldns_buffer *buffer, const char *str) -{ - ldns_buffer_write(buffer, str, strlen(str)); -} - -/** - * writes the given byte of data at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 8 bits to write - */ -INLINE void -ldns_buffer_write_u8_at(ldns_buffer *buffer, size_t at, uint8_t data) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(data))); - buffer->_data[at] = data; -} - -/** - * writes the given byte of data at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 8 bits to write - */ -INLINE void -ldns_buffer_write_u8(ldns_buffer *buffer, uint8_t data) -{ - ldns_buffer_write_u8_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * writes the given 2 byte integer at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 16 bits to write - */ -INLINE void -ldns_buffer_write_u16_at(ldns_buffer *buffer, size_t at, uint16_t data) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(data))); - ldns_write_uint16(buffer->_data + at, data); -} - -/** - * writes the given 2 byte integer at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 16 bits to write - */ -INLINE void -ldns_buffer_write_u16(ldns_buffer *buffer, uint16_t data) -{ - ldns_buffer_write_u16_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * writes the given 4 byte integer at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 32 bits to write - */ -INLINE void -ldns_buffer_write_u32_at(ldns_buffer *buffer, size_t at, uint32_t data) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(data))); - ldns_write_uint32(buffer->_data + at, data); -} - -/** - * writes the given 4 byte integer at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 32 bits to write - */ -INLINE void -ldns_buffer_write_u32(ldns_buffer *buffer, uint32_t data) -{ - ldns_buffer_write_u32_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * copies count bytes of data at the given position to the given data-array - * \param[in] buffer the buffer - * \param[in] at the position in the buffer to start - * \param[out] data buffer to copy to - * \param[in] count the length of the data to copy - */ -INLINE void -ldns_buffer_read_at(const ldns_buffer *buffer, size_t at, void *data, size_t count) -{ - assert(ldns_buffer_available_at(buffer, at, count)); - memcpy(data, buffer->_data + at, count); -} - -/** - * copies count bytes of data at the current position to the given data-array - * \param[in] buffer the buffer - * \param[out] data buffer to copy to - * \param[in] count the length of the data to copy - */ -INLINE void -ldns_buffer_read(ldns_buffer *buffer, void *data, size_t count) -{ - ldns_buffer_read_at(buffer, buffer->_position, data, count); - buffer->_position += count; -} - -/** - * returns the byte value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \return 1 byte integer - */ -INLINE uint8_t -ldns_buffer_read_u8_at(const ldns_buffer *buffer, size_t at) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(uint8_t))); - return buffer->_data[at]; -} - -/** - * returns the byte value at the current position in the buffer - * \param[in] buffer the buffer - * \return 1 byte integer - */ -INLINE uint8_t -ldns_buffer_read_u8(ldns_buffer *buffer) -{ - uint8_t result = ldns_buffer_read_u8_at(buffer, buffer->_position); - buffer->_position += sizeof(uint8_t); - return result; -} - -/** - * returns the 2-byte integer value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at position in the buffer - * \return 2 byte integer - */ -INLINE uint16_t -ldns_buffer_read_u16_at(ldns_buffer *buffer, size_t at) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(uint16_t))); - return ldns_read_uint16(buffer->_data + at); -} - -/** - * returns the 2-byte integer value at the current position in the buffer - * \param[in] buffer the buffer - * \return 2 byte integer - */ -INLINE uint16_t -ldns_buffer_read_u16(ldns_buffer *buffer) -{ - uint16_t result = ldns_buffer_read_u16_at(buffer, buffer->_position); - buffer->_position += sizeof(uint16_t); - return result; -} - -/** - * returns the 4-byte integer value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at position in the buffer - * \return 4 byte integer - */ -INLINE uint32_t -ldns_buffer_read_u32_at(ldns_buffer *buffer, size_t at) -{ - assert(ldns_buffer_available_at(buffer, at, sizeof(uint32_t))); - return ldns_read_uint32(buffer->_data + at); -} - -/** - * returns the 4-byte integer value at the current position in the buffer - * \param[in] buffer the buffer - * \return 4 byte integer - */ -INLINE uint32_t -ldns_buffer_read_u32(ldns_buffer *buffer) -{ - uint32_t result = ldns_buffer_read_u32_at(buffer, buffer->_position); - buffer->_position += sizeof(uint32_t); - return result; -} - -/** - * returns the status of the buffer - * \param[in] buffer - * \return the status - */ -INLINE ldns_status -ldns_buffer_status(const ldns_buffer *buffer) -{ - return buffer->_status; -} - -/** - * returns true if the status of the buffer is LDNS_STATUS_OK, false otherwise - * \param[in] buffer the buffer - * \return true or false - */ -INLINE bool -ldns_buffer_status_ok(const ldns_buffer *buffer) -{ - if (buffer) { - return ldns_buffer_status(buffer) == LDNS_STATUS_OK; - } else { - return false; - } -} - -/** - * prints to the buffer, increasing the capacity if required using - * buffer_reserve(). The buffer's position is set to the terminating '\\0' - * Returns the number of characters written (not including the - * terminating '\\0') or -1 on failure. - */ -int ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...); -/* ATTR_FORMAT(printf, 2, 3);*/ - -/** - * frees the buffer. - * \param[in] *buffer the buffer to be freed - * \return void - */ -void ldns_buffer_free(ldns_buffer *buffer); - -/** - * Makes the buffer fixed and returns a pointer to the data. The - * caller is responsible for free'ing the result. - * \param[in] *buffer the buffer to be exported - * \return void - */ -void *ldns_buffer_export(ldns_buffer *buffer); - -/** - * Copy contents of the from buffer to the result buffer and then flips - * the result buffer. Data will be silently truncated if the result buffer is - * too small. - * \param[out] *result resulting buffer which is copied to. - * \param[in] *from what to copy to result. - */ -void ldns_buffer_copy(ldns_buffer* result, const ldns_buffer* from); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_BUFFER_H */ diff --git a/ldns/ldns/common.h.in b/ldns/ldns/common.h.in deleted file mode 100644 index 805eb8b..0000000 --- a/ldns/ldns/common.h.in +++ /dev/null @@ -1,78 +0,0 @@ -/** - * \file common.h - * - * Common definitions for LDNS - */ - -/** - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#ifndef LDNS_COMMON_H -#define LDNS_COMMON_H - -/* - * The build configuration that is used in the distributed headers, - * as detected and determined by the auto configure script. - */ -#define LDNS_BUILD_CONFIG_HAVE_SSL @ldns_build_config_have_ssl@ -#define LDNS_BUILD_CONFIG_HAVE_INTTYPES_H @ldns_build_config_have_inttypes_h@ -#define LDNS_BUILD_CONFIG_HAVE_ATTR_FORMAT @ldns_build_config_have_attr_format@ -#define LDNS_BUILD_CONFIG_HAVE_ATTR_UNUSED @ldns_build_config_have_attr_unused@ -#define LDNS_BUILD_CONFIG_HAVE_SOCKLEN_T @ldns_build_config_have_socklen_t@ -#define LDNS_BUILD_CONFIG_USE_DANE @ldns_build_config_use_dane@ -#define LDNS_BUILD_CONFIG_HAVE_B32_PTON @ldns_build_config_have_b32_pton@ -#define LDNS_BUILD_CONFIG_HAVE_B32_NTOP @ldns_build_config_have_b32_ntop@ - -/* - * HAVE_STDBOOL_H is not available when distributed as a library, but no build - * configuration variables may be used (like those above) because the header - * is sometimes only available when using special compiler flags to enable the - * c99 environment. Because we cannot force the usage of this flag, we have to - * provide a default type. Below what is suggested by the autoconf manual. - */ -/*@ignore@*/ -/* splint barfs on this construct */ -#ifndef __bool_true_false_are_defined -# ifdef HAVE_STDBOOL_H -# include <stdbool.h> -# else -# ifndef HAVE__BOOL -# ifdef __cplusplus -typedef bool _Bool; -# else -# define _Bool signed char -# endif -# endif -# define bool _Bool -# define false 0 -# define true 1 -# define __bool_true_false_are_defined 1 -# endif -#endif -/*@end@*/ - -#if LDNS_BUILD_CONFIG_HAVE_ATTR_FORMAT -#define ATTR_FORMAT(archetype, string_index, first_to_check) \ - __attribute__ ((format (archetype, string_index, first_to_check))) -#else /* !LDNS_BUILD_CONFIG_HAVE_ATTR_FORMAT */ -#define ATTR_FORMAT(archetype, string_index, first_to_check) /* empty */ -#endif /* !LDNS_BUILD_CONFIG_HAVE_ATTR_FORMAT */ - -#if defined(__cplusplus) -#define ATTR_UNUSED(x) -#elif LDNS_BUILD_CONFIG_HAVE_ATTR_UNUSED -#define ATTR_UNUSED(x) x __attribute__((unused)) -#else /* !LDNS_BUILD_CONFIG_HAVE_ATTR_UNUSED */ -#define ATTR_UNUSED(x) x -#endif /* !LDNS_BUILD_CONFIG_HAVE_ATTR_UNUSED */ - -#if !LDNS_BUILD_CONFIG_HAVE_SOCKLEN_T -typedef int socklen_t; -#endif - -#endif /* LDNS_COMMON_H */ diff --git a/ldns/ldns/config.h.in b/ldns/ldns/config.h.in deleted file mode 100644 index 9ca8a05..0000000 --- a/ldns/ldns/config.h.in +++ /dev/null @@ -1,677 +0,0 @@ -/* ldns/config.h.in. Generated from configure.ac by autoheader. */ - -/* Define if building universal (internal helper macro) */ -#undef AC_APPLE_UNIVERSAL_BUILD - -/* Define to 1 if you have the <arpa/inet.h> header file. */ -#undef HAVE_ARPA_INET_H - -/* Whether the C compiler accepts the "format" attribute */ -#undef HAVE_ATTR_FORMAT - -/* Whether the C compiler accepts the "unused" attribute */ -#undef HAVE_ATTR_UNUSED - -/* Define to 1 if you have the `b32_ntop' function. */ -#undef HAVE_B32_NTOP - -/* Define to 1 if you have the `b32_pton' function. */ -#undef HAVE_B32_PTON - -/* Define to 1 if you have the `b64_ntop' function. */ -#undef HAVE_B64_NTOP - -/* Define to 1 if you have the `b64_pton' function. */ -#undef HAVE_B64_PTON - -/* Define to 1 if you have the `bzero' function. */ -#undef HAVE_BZERO - -/* Define to 1 if you have the `calloc' function. */ -#undef HAVE_CALLOC - -/* Define to 1 if you have the `ctime_r' function. */ -#undef HAVE_CTIME_R - -/* Is a CAFILE given at configure time */ -#undef HAVE_DANE_CA_FILE - -/* Is a CAPATH given at configure time */ -#undef HAVE_DANE_CA_PATH - -/* Define to 1 if you have the declaration of `NID_ED25519', and to 0 if you - don't. */ -#undef HAVE_DECL_NID_ED25519 - -/* Define to 1 if you have the declaration of `NID_ED448', and to 0 if you - don't. */ -#undef HAVE_DECL_NID_ED448 - -/* Define to 1 if you have the declaration of `NID_secp384r1', and to 0 if you - don't. */ -#undef HAVE_DECL_NID_SECP384R1 - -/* Define to 1 if you have the declaration of `NID_X9_62_prime256v1', and to 0 - if you don't. */ -#undef HAVE_DECL_NID_X9_62_PRIME256V1 - -/* Define to 1 if you have the <dlfcn.h> header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the `DSA_get0_key' function. */ -#undef HAVE_DSA_GET0_KEY - -/* Define to 1 if you have the `DSA_get0_pqg' function. */ -#undef HAVE_DSA_GET0_PQG - -/* Define to 1 if you have the `DSA_SIG_get0' function. */ -#undef HAVE_DSA_SIG_GET0 - -/* Define to 1 if you have the `DSA_SIG_set0' function. */ -#undef HAVE_DSA_SIG_SET0 - -/* Define to 1 if you have the `ECDSA_SIG_get0' function. */ -#undef HAVE_ECDSA_SIG_GET0 - -/* Define to 1 if you have the `endprotoent' function. */ -#undef HAVE_ENDPROTOENT - -/* Define to 1 if you have the `endservent' function. */ -#undef HAVE_ENDSERVENT - -/* Define to 1 if you have the `ENGINE_load_cryptodev' function. */ -#undef HAVE_ENGINE_LOAD_CRYPTODEV - -/* Define to 1 if you have the `ERR_load_crypto_strings' function. */ -#undef HAVE_ERR_LOAD_CRYPTO_STRINGS - -/* Define to 1 if you have the `EVP_dss1' function. */ -#undef HAVE_EVP_DSS1 - -/* Define to 1 if you have the `EVP_MD_CTX_new' function. */ -#undef HAVE_EVP_MD_CTX_NEW - -/* Define to 1 if you have the `EVP_PKEY_base_id' function. */ -#undef HAVE_EVP_PKEY_BASE_ID - -/* Define to 1 if you have the `EVP_PKEY_keygen' function. */ -#undef HAVE_EVP_PKEY_KEYGEN - -/* Define to 1 if you have the `EVP_sha256' function. */ -#undef HAVE_EVP_SHA256 - -/* Define to 1 if you have the `EVP_sha384' function. */ -#undef HAVE_EVP_SHA384 - -/* Define to 1 if you have the `EVP_sha512' function. */ -#undef HAVE_EVP_SHA512 - -/* Define to 1 if you have the `fcntl' function. */ -#undef HAVE_FCNTL - -/* Define to 1 if you have the `fork' function. */ -#undef HAVE_FORK - -/* Whether getaddrinfo is available */ -#undef HAVE_GETADDRINFO - -/* Define to 1 if you have the <getopt.h> header file. */ -#undef HAVE_GETOPT_H - -/* Define to 1 if you have the `gmtime_r' function. */ -#undef HAVE_GMTIME_R - -/* If you have HMAC_Update */ -#undef HAVE_HMAC_UPDATE - -/* Define to 1 if you have the `inet_aton' function. */ -#undef HAVE_INET_ATON - -/* Define to 1 if you have the `inet_ntop' function. */ -#undef HAVE_INET_NTOP - -/* Define to 1 if you have the `inet_pton' function. */ -#undef HAVE_INET_PTON - -/* define if you have inttypes.h */ -#undef HAVE_INTTYPES_H - -/* if the function 'ioctlsocket' is available */ -#undef HAVE_IOCTLSOCKET - -/* Define to 1 if you have the `isascii' function. */ -#undef HAVE_ISASCII - -/* Define to 1 if you have the `isblank' function. */ -#undef HAVE_ISBLANK - -/* Define to 1 if you have the `pcap' library (-lpcap). */ -#undef HAVE_LIBPCAP - -/* Define if we have LibreSSL */ -#undef HAVE_LIBRESSL - -/* Define to 1 if you have the `localtime_r' function. */ -#undef HAVE_LOCALTIME_R - -/* Define to 1 if your system has a GNU libc compatible `malloc' function, and - to 0 otherwise. */ -#undef HAVE_MALLOC - -/* Define to 1 if you have the `memmove' function. */ -#undef HAVE_MEMMOVE - -/* Define to 1 if you have the <memory.h> header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the `memset' function. */ -#undef HAVE_MEMSET - -/* Define to 1 if you have the <netdb.h> header file. */ -#undef HAVE_NETDB_H - -/* Define to 1 if you have the <netinet/if_ether.h> header file. */ -#undef HAVE_NETINET_IF_ETHER_H - -/* Define to 1 if you have the <netinet/igmp.h> header file. */ -#undef HAVE_NETINET_IGMP_H - -/* Define to 1 if you have the <netinet/in.h> header file. */ -#undef HAVE_NETINET_IN_H - -/* Define to 1 if you have the <netinet/in_systm.h> header file. */ -#undef HAVE_NETINET_IN_SYSTM_H - -/* Define to 1 if you have the <netinet/ip6.h> header file. */ -#undef HAVE_NETINET_IP6_H - -/* Define to 1 if you have the <netinet/ip_compat.h> header file. */ -#undef HAVE_NETINET_IP_COMPAT_H - -/* Define to 1 if you have the <netinet/ip.h> header file. */ -#undef HAVE_NETINET_IP_H - -/* Define to 1 if you have the <netinet/udp.h> header file. */ -#undef HAVE_NETINET_UDP_H - -/* Define to 1 if you have the <net/ethernet.h> header file. */ -#undef HAVE_NET_ETHERNET_H - -/* Define to 1 if you have the <net/if.h> header file. */ -#undef HAVE_NET_IF_H - -/* Define to 1 if you have the <openssl/err.h> header file. */ -#undef HAVE_OPENSSL_ERR_H - -/* Define to 1 if you have the `OPENSSL_init_crypto' function. */ -#undef HAVE_OPENSSL_INIT_CRYPTO - -/* Define to 1 if you have the `OPENSSL_init_ssl' function. */ -#undef HAVE_OPENSSL_INIT_SSL - -/* Define to 1 if you have the <openssl/rand.h> header file. */ -#undef HAVE_OPENSSL_RAND_H - -/* Define to 1 if you have the <openssl/ssl.h> header file. */ -#undef HAVE_OPENSSL_SSL_H - -/* Define to 1 if you have the <pcap.h> header file. */ -#undef HAVE_PCAP_H - -/* This platform supports poll(7). */ -#undef HAVE_POLL - -/* If available, contains the Python version number currently in use. */ -#undef HAVE_PYTHON - -/* Define to 1 if you have the `random' function. */ -#undef HAVE_RANDOM - -/* Define to 1 if your system has a GNU libc compatible `realloc' function, - and to 0 otherwise. */ -#undef HAVE_REALLOC - -/* Define to 1 if you have the `sleep' function. */ -#undef HAVE_SLEEP - -/* Define to 1 if you have the `snprintf' function. */ -#undef HAVE_SNPRINTF - -/* Define if you have the SSL libraries installed. */ -#undef HAVE_SSL - -/* Define to 1 if you have the <stdarg.h> header file. */ -#undef HAVE_STDARG_H - -/* Define to 1 if stdbool.h conforms to C99. */ -#undef HAVE_STDBOOL_H - -/* Define to 1 if you have the <stdint.h> header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the <strings.h> header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the `strlcpy' function. */ -#undef HAVE_STRLCPY - -/* Define to 1 if you have the `strtoul' function. */ -#undef HAVE_STRTOUL - -/* Define if you have SWIG libraries and header files. */ -#undef HAVE_SWIG - -/* Define to 1 if you have the <sys/mount.h> header file. */ -#undef HAVE_SYS_MOUNT_H - -/* Define to 1 if you have the <sys/param.h> header file. */ -#undef HAVE_SYS_PARAM_H - -/* define if you have sys/socket.h */ -#undef HAVE_SYS_SOCKET_H - -/* Define to 1 if you have the <sys/stat.h> header file. */ -#undef HAVE_SYS_STAT_H - -/* define if you have sys/types.h */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the `timegm' function. */ -#undef HAVE_TIMEGM - -/* Define to 1 if you have the <time.h> header file. */ -#undef HAVE_TIME_H - -/* define if you have unistd.h */ -#undef HAVE_UNISTD_H - -/* Define to 1 if you have the `vfork' function. */ -#undef HAVE_VFORK - -/* Define to 1 if you have the <vfork.h> header file. */ -#undef HAVE_VFORK_H - -/* Define to 1 if you have the <winsock2.h> header file. */ -#undef HAVE_WINSOCK2_H - -/* Define to 1 if `fork' works. */ -#undef HAVE_WORKING_FORK - -/* Define to 1 if `vfork' works. */ -#undef HAVE_WORKING_VFORK - -/* Define to 1 if you have the <ws2tcpip.h> header file. */ -#undef HAVE_WS2TCPIP_H - -/* Define to 1 if the system has the type `_Bool'. */ -#undef HAVE__BOOL - -/* Is a CAFILE given at configure time */ -#undef LDNS_DANE_CA_FILE - -/* Is a CAPATH given at configure time */ -#undef LDNS_DANE_CA_PATH - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define this to enable RR type AMTRELAY. */ -#undef RRTYPE_AMTRELAY - -/* Define this to enable RR type AVC. */ -#undef RRTYPE_AVC - -/* Define this to enable RR type DOA. */ -#undef RRTYPE_DOA - -/* Define this to enable RR type NINFO. */ -#undef RRTYPE_NINFO - -/* Define this to enable RR type OPENPGPKEY. */ -#undef RRTYPE_OPENPGPKEY - -/* Define this to enable RR type RKEY. */ -#undef RRTYPE_RKEY - -/* Define this to enable RR type TA. */ -#undef RRTYPE_TA - -/* The size of `time_t', as computed by sizeof. */ -#undef SIZEOF_TIME_T - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define this to enable messages to stderr. */ -#undef STDERR_MSGS - -/* System configuration dir */ -#undef SYSCONFDIR - -/* Define this to enable DANE support. */ -#undef USE_DANE - -/* Define this to enable DANE-TA usage type support. */ -#undef USE_DANE_TA_USAGE - -/* Define this to enable DANE verify support. */ -#undef USE_DANE_VERIFY - -/* Define this to enable DSA support. */ -#undef USE_DSA - -/* Define this to enable ECDSA support. */ -#undef USE_ECDSA - -/* Define this to enable ED25519 support. */ -#undef USE_ED25519 - -/* Define this to enable ED448 support. */ -#undef USE_ED448 - -/* Define this to enable GOST support. */ -#undef USE_GOST - -/* Define this to enable SHA256 and SHA512 support. */ -#undef USE_SHA2 - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# undef _ALL_SOURCE -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# undef _GNU_SOURCE -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# undef _POSIX_PTHREAD_SEMANTICS -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# undef _TANDEM_SOURCE -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# undef __EXTENSIONS__ -#endif - - -/* Whether the windows socket API is used */ -#undef USE_WINSOCK - -/* the version of the windows API enabled */ -#undef WINVER - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -# undef WORDS_BIGENDIAN -# endif -#endif - -/* Define to 1 if on MINIX. */ -#undef _MINIX - -/* Enable for compile on Minix */ -#undef _NETBSD_SOURCE - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -#undef _POSIX_1_SOURCE - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to empty if `const' does not conform to ANSI C. */ -#undef const - -/* in_addr_t */ -#undef in_addr_t - -/* in_port_t */ -#undef in_port_t - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#undef inline -#endif - -/* Define to `short' if <sys/types.h> does not define. */ -#undef int16_t - -/* Define to `int' if <sys/types.h> does not define. */ -#undef int32_t - -/* Define to `long long' if <sys/types.h> does not define. */ -#undef int64_t - -/* Define to `char' if <sys/types.h> does not define. */ -#undef int8_t - -/* Define to `size_t' if <sys/types.h> does not define. */ -#undef intptr_t - -/* Define to rpl_malloc if the replacement function should be used. */ -#undef malloc - -/* Define to `int' if <sys/types.h> does not define. */ -#undef pid_t - -/* Define to rpl_realloc if the replacement function should be used. */ -#undef realloc - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -#undef size_t - -/* Define to 'int' if not defined */ -#undef socklen_t - -/* Fallback member name for socket family in struct sockaddr_storage */ -#undef ss_family - -/* Define to `int' if <sys/types.h> does not define. */ -#undef ssize_t - -/* Define to `unsigned short' if <sys/types.h> does not define. */ -#undef uint16_t - -/* Define to `unsigned int' if <sys/types.h> does not define. */ -#undef uint32_t - -/* Define to `unsigned long long' if <sys/types.h> does not define. */ -#undef uint64_t - -/* Define to `unsigned char' if <sys/types.h> does not define. */ -#undef uint8_t - -/* Define as `fork' if `vfork' does not work. */ -#undef vfork - - -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <assert.h> - -#ifndef LITTLE_ENDIAN -#define LITTLE_ENDIAN 1234 -#endif - -#ifndef BIG_ENDIAN -#define BIG_ENDIAN 4321 -#endif - -#ifndef BYTE_ORDER -#ifdef WORDS_BIGENDIAN -#define BYTE_ORDER BIG_ENDIAN -#else -#define BYTE_ORDER LITTLE_ENDIAN -#endif /* WORDS_BIGENDIAN */ -#endif /* BYTE_ORDER */ - -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif - -#ifdef HAVE_STDINT_H -#include <stdint.h> -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif - -#ifdef HAVE_WINSOCK2_H -#include <winsock2.h> -#endif - -#ifdef HAVE_WS2TCPIP_H -#include <ws2tcpip.h> -#endif - - -/* detect if we need to cast to unsigned int for FD_SET to avoid warnings */ -#ifdef HAVE_WINSOCK2_H -#define FD_SET_T (u_int) -#else -#define FD_SET_T -#endif - - - - -#ifdef __cplusplus -extern "C" { -#endif - -int ldns_b64_ntop(uint8_t const *src, size_t srclength, - char *target, size_t targsize); -/** - * calculates the size needed to store the result of b64_ntop - */ -/*@unused@*/ -static inline size_t ldns_b64_ntop_calculate_size(size_t srcsize) -{ - return ((((srcsize + 2) / 3) * 4) + 1); -} -int ldns_b64_pton(char const *src, uint8_t *target, size_t targsize); -/** - * calculates the size needed to store the result of ldns_b64_pton - */ -/*@unused@*/ -static inline size_t ldns_b64_pton_calculate_size(size_t srcsize) -{ - return (((((srcsize + 3) / 4) * 3)) + 1); -} - -/** - * Given in dnssec_zone.c, also used in dnssec_sign.c:w - - */ -int ldns_dname_compare_v(const void *a, const void *b); - -#ifndef HAVE_SLEEP -/* use windows sleep, in millisecs, instead */ -#define sleep(x) Sleep((x)*1000) -#endif - -#ifndef HAVE_RANDOM -#define srandom(x) srand(x) -#define random(x) rand(x) -#endif - -#ifndef HAVE_TIMEGM -#include <time.h> -time_t timegm (struct tm *tm); -#endif /* !TIMEGM */ -#ifndef HAVE_GMTIME_R -struct tm *gmtime_r(const time_t *timep, struct tm *result); -#endif -#ifndef HAVE_LOCALTIME_R -struct tm *localtime_r(const time_t *timep, struct tm *result); -#endif -#ifndef HAVE_ISBLANK -int isblank(int c); -#endif /* !HAVE_ISBLANK */ -#ifndef HAVE_ISASCII -int isascii(int c); -#endif /* !HAVE_ISASCII */ -#ifndef HAVE_SNPRINTF -#include <stdarg.h> -int snprintf (char *str, size_t count, const char *fmt, ...); -int vsnprintf (char *str, size_t count, const char *fmt, va_list arg); -#endif /* HAVE_SNPRINTF */ -#ifndef HAVE_INET_PTON -int inet_pton(int af, const char* src, void* dst); -#endif /* HAVE_INET_PTON */ -#ifndef HAVE_INET_NTOP -const char *inet_ntop(int af, const void *src, char *dst, size_t size); -#endif -#ifndef HAVE_INET_ATON -int inet_aton(const char *cp, struct in_addr *addr); -#endif -#ifndef HAVE_MEMMOVE -void *memmove(void *dest, const void *src, size_t n); -#endif -#ifndef HAVE_STRLCPY -size_t strlcpy(char *dst, const char *src, size_t siz); -#endif - -#ifdef USE_WINSOCK -#define SOCK_INVALID INVALID_SOCKET -#define close_socket(_s) do { if (_s != SOCK_INVALID) {closesocket(_s); _s = -1;} } while(0) -#else -#define SOCK_INVALID -1 -#define close_socket(_s) do { if (_s != SOCK_INVALID) {close(_s); _s = -1;} } while(0) -#endif - -#ifdef __cplusplus -} -#endif -#ifndef HAVE_GETADDRINFO -#include "compat/fake-rfc2553.h" -#endif -#ifndef HAVE_STRTOUL -#define strtoul (unsigned long)strtol -#endif - diff --git a/ldns/ldns/dane.h b/ldns/ldns/dane.h deleted file mode 100644 index 3bde546..0000000 --- a/ldns/ldns/dane.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - * dane.h -- defines for the DNS-Based Authentication of Named Entities (DANE) - * Transport Layer Security (TLS) Protocol: TLSA - * - * Copyright (c) 2012, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - */ - -/** - * \file - * - * This module contains base functions for creating and verifying TLSA RR's - * with PKIX certificates, certificate chains and validation stores. - * (See RFC6394 and RFC6698). - * - * Since those functions heavily rely op cryptographic operations, - * this module is dependent on openssl. - */ - - -#ifndef LDNS_DANE_H -#define LDNS_DANE_H - -#include <ldns/common.h> -#include <ldns/rdata.h> -#include <ldns/rr.h> -#if LDNS_BUILD_CONFIG_HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/err.h> -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The different "Certificate usage" rdata field values for a TLSA RR. - */ -enum ldns_enum_tlsa_certificate_usage -{ - /** CA constraint */ - LDNS_TLSA_USAGE_PKIX_TA = 0, - LDNS_TLSA_USAGE_CA_CONSTRAINT = 0, - /** Sevice certificate constraint */ - LDNS_TLSA_USAGE_PKIX_EE = 1, - LDNS_TLSA_USAGE_SERVICE_CERTIFICATE_CONSTRAINT = 1, - /** Trust anchor assertion */ - LDNS_TLSA_USAGE_DANE_TA = 2, - LDNS_TLSA_USAGE_TRUST_ANCHOR_ASSERTION = 2, - /** Domain issued certificate */ - LDNS_TLSA_USAGE_DANE_EE = 3, - LDNS_TLSA_USAGE_DOMAIN_ISSUED_CERTIFICATE = 3, - /** Reserved for Private Use */ - LDNS_TLSA_USAGE_PRIVCERT = 255 -}; -typedef enum ldns_enum_tlsa_certificate_usage ldns_tlsa_certificate_usage; - -/** - * The different "Selector" rdata field values for a TLSA RR. - */ -enum ldns_enum_tlsa_selector -{ - /** - * Full certificate: the Certificate binary structure - * as defined in [RFC5280] - */ - LDNS_TLSA_SELECTOR_CERT = 0, - LDNS_TLSA_SELECTOR_FULL_CERTIFICATE = 0, - - /** - * SubjectPublicKeyInfo: DER-encoded binary structure - * as defined in [RFC5280] - */ - LDNS_TLSA_SELECTOR_SPKI = 1, - LDNS_TLSA_SELECTOR_SUBJECTPUBLICKEYINFO = 1, - - /** Reserved for Private Use */ - LDNS_TLSA_SELECTOR_PRIVSEL = 255 -}; -typedef enum ldns_enum_tlsa_selector ldns_tlsa_selector; - -/** - * The different "Matching type" rdata field values for a TLSA RR. - */ -enum ldns_enum_tlsa_matching_type -{ - /** Exact match on selected content */ - LDNS_TLSA_MATCHING_TYPE_FULL = 0, - LDNS_TLSA_MATCHING_TYPE_NO_HASH_USED = 0, - /** SHA-256 hash of selected content [RFC6234] */ - LDNS_TLSA_MATCHING_TYPE_SHA2_256 = 1, - LDNS_TLSA_MATCHING_TYPE_SHA256 = 1, - /** SHA-512 hash of selected content [RFC6234] */ - LDNS_TLSA_MATCHING_TYPE_SHA2_512 = 2, - LDNS_TLSA_MATCHING_TYPE_SHA512 = 2, - /** Reserved for Private Use */ - LDNS_TLSA_MATCHING_TYPE_PRIVMATCH = 255 -}; -typedef enum ldns_enum_tlsa_matching_type ldns_tlsa_matching_type; - -/** - * Known transports to use with TLSA owner names. - */ -enum ldns_enum_dane_transport -{ - /** TCP */ - LDNS_DANE_TRANSPORT_TCP = 0, - /** UDP */ - LDNS_DANE_TRANSPORT_UDP = 1, - /** SCTP */ - LDNS_DANE_TRANSPORT_SCTP = 2 -}; -typedef enum ldns_enum_dane_transport ldns_dane_transport; - - -#if LDNS_BUILD_CONFIG_USE_DANE -/** - * Creates a dname consisting of the given name, prefixed by the service port - * and type of transport: _<EM>port</EM>._<EM>transport</EM>.<EM>name</EM>. - * - * \param[out] tlsa_owner The created dname. - * \param[in] name The dname that should be prefixed. - * \param[in] port The service port number for which the name should be created. - * \param[in] transport The transport for which the name should be created. - * \return LDNS_STATUS_OK on success or an error code otherwise. - */ -ldns_status ldns_dane_create_tlsa_owner(ldns_rdf** tlsa_owner, - const ldns_rdf* name, uint16_t port, - ldns_dane_transport transport); - - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Creates a LDNS_RDF_TYPE_HEX type rdf based on the binary data chosen by - * the selector and encoded using matching_type. - * - * \param[out] rdf The created created rdf of type LDNS_RDF_TYPE_HEX. - * \param[in] cert The certificate from which the data is selected - * \param[in] selector The full certificate or the public key - * \param[in] matching_type The full data or the SHA256 or SHA512 hash - * of the selected data - * \return LDNS_STATUS_OK on success or an error code otherwise. - */ -ldns_status ldns_dane_cert2rdf(ldns_rdf** rdf, X509* cert, - ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type); - - -/** - * Selects the certificate from cert, extra_certs or the pkix_validation_store - * based on the value of cert_usage and index. - * - * \param[out] selected_cert The selected cert. - * \param[in] cert The certificate to validate (or not) - * \param[in] extra_certs Intermediate certificates that might be necessary - * during validation. May be NULL, except when the certificate - * usage is "Trust Anchor Assertion" because the trust anchor has - * to be provided.(otherwise choose a "Domain issued certificate!" - * \param[in] pkix_validation_store Used when the certificate usage is - * "CA constraint" or "Service Certificate Constraint" to - * validate the certificate and, in case of "CA constraint", - * select the CA. - * When pkix_validation_store is NULL, validation is explicitly - * turned off and the behaviour is then the same as for "Trust - * anchor assertion" and "Domain issued certificate" respectively. - * \param[in] cert_usage Which certificate to use and how to validate. - * \param[in] index Used to select the trust anchor when certificate usage - * is "Trust Anchor Assertion". 0 is the last certificate in the - * validation chain. 1 the one but last, etc. When index is -1, - * the last certificate is used that MUST be self-signed. - * This can help to make sure that the intended (self signed) - * trust anchor is actually present in extra_certs (which is a - * DANE requirement). - * - * \return LDNS_STATUS_OK on success or an error code otherwise. - */ -ldns_status ldns_dane_select_certificate(X509** selected_cert, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store, - ldns_tlsa_certificate_usage cert_usage, int index); - -/** - * Creates a TLSA resource record from the certificate. - * No PKIX validation is performed! The given certificate is used as data - * regardless the value of certificate_usage. - * - * \param[out] tlsa The created TLSA resource record. - * \param[in] certificate_usage The value for the Certificate Usage field - * \param[in] selector The value for the Selector field - * \param[in] matching_type The value for the Matching Type field - * \param[in] cert The certificate which data will be represented - * - * \return LDNS_STATUS_OK on success or an error code otherwise. - */ -ldns_status ldns_dane_create_tlsa_rr(ldns_rr** tlsa, - ldns_tlsa_certificate_usage certificate_usage, - ldns_tlsa_selector selector, - ldns_tlsa_matching_type matching_type, - X509* cert); - -/** - * BEWARE! We strongly recommend to use OpenSSL 1.1.0 dane verification - * functions instead of the ones provided by ldns. When OpenSSL 1.1.0 was - * available ldns will use the OpenSSL 1.1.0 dane verification functions - * under the hood. When ldns was linked with OpenSSL < 1.1.0, this function - * will not be able to verify TLSA records with DANE-TA usage types. - * - * BEWARE! The ldns dane verification functions do *not* do server name - * checks. The user has to perform additional server name checks themselves! - * - * Verify if the given TLSA resource record matches the given certificate. - * Reporting on a TLSA rr mismatch (LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH) - * is preferred over PKIX failure (LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE). - * So when PKIX validation is required by the TLSA Certificate usage, - * but the TLSA data does not match, LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH - * is returned whether the PKIX validated or not. - * - * When ldns is linked with OpenSSL < 1.1.0 and this function is available, - * then the DANE-TA usage type will not be verified, and on a tlsa_rr with - * this usage type, - * LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA will be returned. - * - * \param[in] tlsa_rr The resource record that specifies what and how to - * match the certificate. With tlsa_rr == NULL, regular PKIX - * validation is performed. - * \param[in] cert The certificate to match (and validate) - * \param[in] extra_certs Intermediate certificates that might be necessary - * creating the validation chain. - * \param[in] pkix_validation_store Used when the certificate usage is - * "CA constraint" or "Service Certificate Constraint" to - * validate the certificate. - * - * \return LDNS_STATUS_OK on success, - * LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA when the - * provided TLSA had the DANE-TA usage type, - * LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH on TLSA data mismatch, - * LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE when TLSA matched, - * but the PKIX validation failed, or other ldns_status errors. - */ -ldns_status ldns_dane_verify_rr(const ldns_rr* tlsa_rr, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store); - -/** - * BEWARE! We strongly recommend to use OpenSSL 1.1.0 dane verification - * functions instead of the ones provided by ldns. When OpenSSL 1.1.0 was - * available ldns will use the OpenSSL 1.1.0 dane verification functions - * under the hood. When ldns was linked with OpenSSL < 1.1.0, this function - * will not be able to verify TLSA records with DANE-TA usage types. - * - * BEWARE! The ldns dane verification functions do *not* do server name - * checks. The user has to perform additional server name checks themselves! - * - * Verify if any of the given TLSA resource records matches the given - * certificate. - * - * \param[in] tlsas The resource records that specify what and how to - * match the certificate. One must match for this function - * to succeed. With tlsas == NULL or the number of TLSA records - * in tlsas == 0, regular PKIX validation is performed. - * \param[in] cert The certificate to match (and validate) - * \param[in] extra_certs Intermediate certificates that might be necessary - * creating the validation chain. - * \param[in] pkix_validation_store Used when the certificate usage is - * "CA constraint" or "Service Certificate Constraint" to - * validate the certificate. - * - * \return LDNS_STATUS_OK on success, - * LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA when at least one - * of the TLSA's had usage type DANE-TA and none of the TLSA's matched - * or PKIX validated, - * LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE when one of the TLSA's - * matched but the PKIX validation failed, - * LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH when none of the TLSA's matched, - * or other ldns_status errors. - */ -ldns_status ldns_dane_verify(const ldns_rr_list* tlsas, - X509* cert, STACK_OF(X509)* extra_certs, - X509_STORE* pkix_validation_store); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ -#endif /* LDNS_BUILD_CONFIG_USE_DANE */ - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_DANE_H */ - diff --git a/ldns/ldns/dname.h b/ldns/ldns/dname.h deleted file mode 100644 index b76e823..0000000 --- a/ldns/ldns/dname.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * dname.h - * - * dname definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file dname.h - * - * dname contains function to read and manipulate domain names. - * - * Example domain names are "www.nlnetlabs.nl." and "." (the root) - * - * If a domain name ends with a dot ("."), it is called a Fully Qualified - * Domain Name (FQDN). In certain places (for instance when reading a zone - * file), an origin (which is just another domain name) non-FQDNs will be - * placed after the current. For instance, if i have a zone file where the - * origin has been set to "nl.", and my file contains the name - * "www.nlnetlabs", it will result in "www.nlnetlabs.nl.". Internally, dnames are - * always absolute (the dot is added when it is missing and there is no origin). - * - * An FQDN is also - * known as an absolute domain name, therefore the function to check this is - * called \ref ldns_dname_str_absolute - * - * Domain names are stored in \ref ldns_rdf structures, with the type - * \ref LDNS_RDF_TYPE_DNAME - * - * This module is *NOT* about the RR type called DNAME. - */ - - -#ifndef LDNS_DNAME_H -#define LDNS_DNAME_H - -#include <ldns/common.h> -#include <ldns/rdata.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_DNAME_NORMALIZE tolower - -/** - * concatenates two dnames together - * \param[in] rd1 the leftside - * \param[in] rd2 the rightside - * \return a new rdf with leftside/rightside - */ -ldns_rdf *ldns_dname_cat_clone(const ldns_rdf *rd1, const ldns_rdf *rd2); - -/** - * concatenates rd2 after rd1 (rd2 is copied, rd1 is modified) - * \param[in] rd1 the leftside - * \param[in] rd2 the rightside - * \return LDNS_STATUS_OK on success - */ -ldns_status ldns_dname_cat(ldns_rdf *rd1, const ldns_rdf *rd2); - -/** - * Returns a clone of the given dname with the labels - * reversed - * \param[in] d the dname to reverse - * \return clone of the dname with the labels reversed. - */ -ldns_rdf *ldns_dname_reverse(const ldns_rdf *d); - -/** - * Clones the given dname from the nth label on - * \param[in] d The dname to clone - * \param[in] n the label nr to clone from, if this is 0, the complete - * dname is cloned - * \return A newly allocated *rdf structure, containing the cloned dname, - * or NULL if either d was NULL, not a dname, or if n >= - * label_count - */ -ldns_rdf * -ldns_dname_clone_from(const ldns_rdf *d, uint16_t n); - -/** - * chop one label off the left side of a dname. so - * wwww.nlnetlabs.nl, becomes nlnetlabs.nl - * This new name is a clone and must be freed with ldns_deep_free() - * \param[in] d the dname to chop - * \return the remaining dname - */ -ldns_rdf *ldns_dname_left_chop(const ldns_rdf *d); - -/** - * count the number of labels inside a LDNS_RDF_DNAME type rdf. - * \param[in] *r the rdf - * \return the number of labels - */ -uint8_t ldns_dname_label_count(const ldns_rdf *r); - -/** - * creates a new dname rdf from a string. - * \param[in] str string to use - * \return ldns_rdf* or NULL in case of an error - */ -ldns_rdf *ldns_dname_new_frm_str(const char *str); - -/** - * Create a new dname rdf from a string. The data pointer - * is stored in the rdf, not a copy of the data - * \param[in] s the size of the new dname - * \param[in] *data pointer to the actual data - * - * \return ldns_rdf* - */ -ldns_rdf *ldns_dname_new(uint16_t s, void *data); - -/** - * Create a new dname rdf from data (the data is copied) - * \param[in] size the size of the data - * \param[in] *data pointer to the actual data - * - * \return ldns_rdf* - */ -ldns_rdf *ldns_dname_new_frm_data(uint16_t size, const void *data); - -/** - * Put a dname into canonical fmt - ie. lowercase it - * \param[in] rdf the dname to lowercase - * \return void - */ -void ldns_dname2canonical(const ldns_rdf *rdf); - -/** - * test whether the name sub falls under parent (i.e. is a subdomain - * of parent). This function will return false if the given dnames are - * equal. - * \param[in] sub the name to test - * \param[in] parent the parent's name - * \return true if sub falls under parent, otherwise false - */ -bool ldns_dname_is_subdomain(const ldns_rdf *sub, const ldns_rdf *parent); - -/** - * Compares the two dname rdf's according to the algorithm for ordering - * in RFC4034 Section 6. - * \param[in] dname1 First dname rdf to compare - * \param[in] dname2 Second dname rdf to compare - * \return -1 if dname1 comes before dname2, 1 if dname1 comes after dname2, and 0 if they are equal. - */ -int ldns_dname_compare(const ldns_rdf *dname1, const ldns_rdf *dname2); -int ldns_dname_compare_v(const void *, const void *); - -/** - * Checks whether the dname matches the given wildcard - * \param[in] dname The dname to check - * \param[in] wildcard The wildcard to check with - * \return 1 If the wildcard matches, OR if 'wildcard' is not a wildcard and - * the names are *exactly* the same - * 0 If the wildcard does not match, or if it is not a wildcard and - * the names are not the same - */ -int ldns_dname_match_wildcard(const ldns_rdf *dname, const ldns_rdf *wildcard); - -/** - * check if middle lays in the interval defined by prev and next - * prev <= middle < next. This is useful for nsec checking - * \param[in] prev the previous dname - * \param[in] middle the dname to check - * \param[in] next the next dname - * return 0 on error or unknown, -1 when middle is in the interval, +1 when not - */ -int ldns_dname_interval(const ldns_rdf *prev, const ldns_rdf *middle, const ldns_rdf *next); - -/** - * Checks whether the given dname string is absolute (i.e. ends with a '.') - * \param[in] *dname_str a string representing the dname - * \return true or false - */ -bool ldns_dname_str_absolute(const char *dname_str); - -/** - * Checks whether the given dname is absolute (i.e. ends with a '.') - * \param[in] *dname a rdf representing the dname - * \return true or false - */ -bool ldns_dname_absolute(const ldns_rdf *dname); - -/** - * look inside the rdf and if it is an LDNS_RDF_TYPE_DNAME - * try and retrieve a specific label. The labels are numbered - * starting from 0 (left most). - * \param[in] rdf the rdf to look in - * \param[in] labelpos return the label with this number - * \return a ldns_rdf* with the label as name or NULL on error - */ -ldns_rdf * ldns_dname_label(const ldns_rdf *rdf, uint8_t labelpos); - -/** - * Check if dname is a wildcard, starts with *. - * \param[in] dname: the rdf to look in - * \return true if a wildcard, false if not. - */ -int ldns_dname_is_wildcard(const ldns_rdf* dname); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_DNAME_H */ diff --git a/ldns/ldns/dnssec.h b/ldns/ldns/dnssec.h deleted file mode 100644 index 9881fda..0000000 --- a/ldns/ldns/dnssec.h +++ /dev/null @@ -1,565 +0,0 @@ -/* - * dnssec.h -- defines for the Domain Name System (SEC) (DNSSEC) - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - * A bunch of defines that are used in the DNS - */ - -/** - * \file dnssec.h - * - * This module contains base functions for DNSSEC operations - * (RFC4033 t/m RFC4035). - * - * Since those functions heavily rely op cryptographic operations, - * this module is dependent on openssl. - * - */ - - -#ifndef LDNS_DNSSEC_H -#define LDNS_DNSSEC_H - -#include <ldns/common.h> -#if LDNS_BUILD_CONFIG_HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/evp.h> -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ -#include <ldns/packet.h> -#include <ldns/keys.h> -#include <ldns/zone.h> -#include <ldns/resolver.h> -#include <ldns/dnssec_zone.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_MAX_KEYLEN 2048 -#define LDNS_DNSSEC_KEYPROTO 3 -/* default time before sigs expire */ -#define LDNS_DEFAULT_EXP_TIME 2419200 /* 4 weeks */ - -/** return values for the old-signature callback */ -#define LDNS_SIGNATURE_LEAVE_ADD_NEW 0 -#define LDNS_SIGNATURE_LEAVE_NO_ADD 1 -#define LDNS_SIGNATURE_REMOVE_ADD_NEW 2 -#define LDNS_SIGNATURE_REMOVE_NO_ADD 3 - -/** - * Returns the first RRSIG rr that corresponds to the rrset - * with the given name and type - * - * \param[in] name The dname of the RRset covered by the RRSIG to find - * \param[in] type The type of the RRset covered by the RRSIG to find - * \param[in] rrs List of rrs to search in - * \returns Pointer to the first RRsig ldns_rr found, or NULL if it is - * not present - */ -ldns_rr *ldns_dnssec_get_rrsig_for_name_and_type(const ldns_rdf *name, - const ldns_rr_type type, - const ldns_rr_list *rrs); - -/** - * Returns the DNSKEY that corresponds to the given RRSIG rr from the list, if - * any - * - * \param[in] rrsig The rrsig to find the DNSKEY for - * \param[in] rrs The rr list to find the key in - * \return The DNSKEY that corresponds to the given RRSIG, or NULL if it was - * not found. - */ -ldns_rr *ldns_dnssec_get_dnskey_for_rrsig(const ldns_rr *rrsig, const ldns_rr_list *rrs); - -/** - * Returns the rdata field that contains the bitmap of the covered types of - * the given NSEC record - * - * \param[in] nsec The nsec to get the covered type bitmap of - * \return An ldns_rdf containing the bitmap, or NULL on error - */ -ldns_rdf *ldns_nsec_get_bitmap(const ldns_rr *nsec); - - -#define LDNS_NSEC3_MAX_ITERATIONS 65535 - -/** - * Returns the dname of the closest (provable) encloser - */ -ldns_rdf * -ldns_dnssec_nsec3_closest_encloser(const ldns_rdf *qname, - ldns_rr_type qtype, - const ldns_rr_list *nsec3s); - -/** - * Checks whether the packet contains rrsigs - */ -bool -ldns_dnssec_pkt_has_rrsigs(const ldns_pkt *pkt); - -/** - * Returns a ldns_rr_list containing the signatures covering the given name - * and type - */ -ldns_rr_list *ldns_dnssec_pkt_get_rrsigs_for_name_and_type(const ldns_pkt *pkt, const ldns_rdf *name, ldns_rr_type type); - -/** - * Returns a ldns_rr_list containing the signatures covering the given type - */ -ldns_rr_list *ldns_dnssec_pkt_get_rrsigs_for_type(const ldns_pkt *pkt, ldns_rr_type type); - -/** - * calculates a keytag of a key for use in DNSSEC. - * - * \param[in] key the key as an RR to use for the calc. - * \return the keytag - */ -uint16_t ldns_calc_keytag(const ldns_rr *key); - -/** - * Calculates keytag of DNSSEC key, operates on wireformat rdata. - * \param[in] key the key as uncompressed wireformat rdata. - * \param[in] keysize length of key data. - * \return the keytag - */ -uint16_t ldns_calc_keytag_raw(const uint8_t* key, size_t keysize); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * converts a buffer holding key material to a DSA key in openssl. - * - * \param[in] key the key to convert - * \return a DSA * structure with the key material - */ -DSA *ldns_key_buf2dsa(const ldns_buffer *key); -/** - * Like ldns_key_buf2dsa, but uses raw buffer. - * \param[in] key the uncompressed wireformat of the key. - * \param[in] len length of key data - * \return a DSA * structure with the key material - */ -DSA *ldns_key_buf2dsa_raw(const unsigned char* key, size_t len); - -/** - * Utility function to calculate hash using generic EVP_MD pointer. - * \param[in] data the data to hash. - * \param[in] len length of data. - * \param[out] dest the destination of the hash, must be large enough. - * \param[in] md the message digest to use. - * \return true if worked, false on failure. - */ -int ldns_digest_evp(const unsigned char* data, unsigned int len, - unsigned char* dest, const EVP_MD* md); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with GOST. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \return the key or NULL on error. - */ -EVP_PKEY* ldns_gost2pkey_raw(const unsigned char* key, size_t keylen); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with ECDSA. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \param[in] algo precise algorithm to initialize ECC group values. - * \return the key or NULL on error. - */ -EVP_PKEY* ldns_ecdsa2pkey_raw(const unsigned char* key, size_t keylen, uint8_t algo); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with ED25519. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \return the key or NULL on error. - */ -EVP_PKEY* ldns_ed255192pkey_raw(const unsigned char* key, size_t keylen); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with ED448. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \return the key or NULL on error. - */ -EVP_PKEY* ldns_ed4482pkey_raw(const unsigned char* key, size_t keylen); - -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * converts a buffer holding key material to a RSA key in openssl. - * - * \param[in] key the key to convert - * \return a RSA * structure with the key material - */ -RSA *ldns_key_buf2rsa(const ldns_buffer *key); - -/** - * Like ldns_key_buf2rsa, but uses raw buffer. - * \param[in] key the uncompressed wireformat of the key. - * \param[in] len length of key data - * \return a RSA * structure with the key material - */ -RSA *ldns_key_buf2rsa_raw(const unsigned char* key, size_t len); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * returns a new DS rr that represents the given key rr. - * - * \param[in] *key the key to convert - * \param[in] h the hash to use LDNS_SHA1/LDNS_SHA256 - * - * \return ldns_rr* a new rr pointer to a DS - */ -ldns_rr *ldns_key_rr2ds(const ldns_rr *key, ldns_hash h); - -/** - * Create the type bitmap for an NSEC(3) record - */ -ldns_rdf * -ldns_dnssec_create_nsec_bitmap(ldns_rr_type rr_type_list[], - size_t size, - ldns_rr_type nsec_type); - -/** - * returns whether a rrset of the given type is found in the rrsets. - * - * \param[in] rrsets the rrsets to be tested - * \param[in] type the type to test for - * \return int 1 if the type was found, 0 otherwise. - */ -int -ldns_dnssec_rrsets_contains_type(const ldns_dnssec_rrsets *rrsets, ldns_rr_type type); - -/** - * Creates NSEC - */ -ldns_rr * -ldns_dnssec_create_nsec(const ldns_dnssec_name *from, - const ldns_dnssec_name *to, - ldns_rr_type nsec_type); - - -/** - * Creates NSEC3 - */ -ldns_rr * -ldns_dnssec_create_nsec3(const ldns_dnssec_name *from, - const ldns_dnssec_name *to, - const ldns_rdf *zone_name, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt); - -/** - * Create a NSEC record - * \param[in] cur_owner the current owner which should be taken as the starting point - * \param[in] next_owner the rrlist which the nsec rr should point to - * \param[in] rrs all rrs from the zone, to find all RR types of cur_owner in - * \return a ldns_rr with the nsec record in it - */ -ldns_rr * ldns_create_nsec(ldns_rdf *cur_owner, ldns_rdf *next_owner, ldns_rr_list *rrs); - -/** - * Calculates the hashed name using the given parameters - * \param[in] *name The owner name to calculate the hash for - * \param[in] algorithm The hash algorithm to use - * \param[in] iterations The number of hash iterations to use - * \param[in] salt_length The length of the salt in bytes - * \param[in] salt The salt to use - * \return The hashed owner name rdf, without the domain name - */ -ldns_rdf *ldns_nsec3_hash_name(const ldns_rdf *name, uint8_t algorithm, uint16_t iterations, uint8_t salt_length, const uint8_t *salt); - -/** - * Sets all the NSEC3 options. The rr to set them in must be initialized with _new() and - * type LDNS_RR_TYPE_NSEC3 - * \param[in] *rr The RR to set the values in - * \param[in] algorithm The NSEC3 hash algorithm - * \param[in] flags The flags field - * \param[in] iterations The number of hash iterations - * \param[in] salt_length The length of the salt in bytes - * \param[in] salt The salt bytes - */ -void ldns_nsec3_add_param_rdfs(ldns_rr *rr, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt); - -/* this will NOT return the NSEC3 completed, you will have to run the - finalize function on the rrlist later! */ -ldns_rr * -ldns_create_nsec3(const ldns_rdf *cur_owner, - const ldns_rdf *cur_zone, - const ldns_rr_list *rrs, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - const uint8_t *salt, - bool emptynonterminal); - -/** - * Returns the hash algorithm used in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The algorithm identifier, or 0 on error - */ -uint8_t ldns_nsec3_algorithm(const ldns_rr *nsec3_rr); - -/** - * Returns flags field - */ -uint8_t -ldns_nsec3_flags(const ldns_rr *nsec3_rr); - -/** - * Returns true if the opt-out flag has been set in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return true if the RR has type NSEC3 and the opt-out bit has been set, false otherwise - */ -bool ldns_nsec3_optout(const ldns_rr *nsec3_rr); - -/** - * Returns the number of hash iterations used in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The number of iterations - */ -uint16_t ldns_nsec3_iterations(const ldns_rr *nsec3_rr); - -/** - * Returns the salt used in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The salt rdf, or NULL on error - */ -ldns_rdf *ldns_nsec3_salt(const ldns_rr *nsec3_rr); - -/** - * Returns the length of the salt used in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The length of the salt in bytes - */ -uint8_t ldns_nsec3_salt_length(const ldns_rr *nsec3_rr); - -/** - * Returns the salt bytes used in the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The salt in bytes, this is alloced, so you need to free it - */ -uint8_t *ldns_nsec3_salt_data(const ldns_rr *nsec3_rr); - -/** - * Returns the first label of the next ownername in the NSEC3 chain (ie. without the domain) - * \param[in] nsec3_rr The RR to read from - * \return The first label of the next owner name in the NSEC3 chain, or NULL on error - */ -ldns_rdf *ldns_nsec3_next_owner(const ldns_rr *nsec3_rr); - -/** - * Returns the bitmap specifying the covered types of the given NSEC3 RR - * \param[in] *nsec3_rr The RR to read from - * \return The covered type bitmap rdf - */ -ldns_rdf *ldns_nsec3_bitmap(const ldns_rr *nsec3_rr); - -/** - * Calculates the hashed name using the parameters of the given NSEC3 RR - * \param[in] *nsec The RR to use the parameters from - * \param[in] *name The owner name to calculate the hash for - * \return The hashed owner name rdf, without the domain name - */ -ldns_rdf *ldns_nsec3_hash_name_frm_nsec3(const ldns_rr *nsec, const ldns_rdf *name); - -/** - * Check if RR type t is enumerated and set in the RR type bitmap rdf. - * \param[in] bitmap the RR type bitmap rdf to look in - * \param[in] type the type to check for - * \return true when t is found and set, otherwise return false - */ -bool ldns_nsec_bitmap_covers_type(const ldns_rdf* bitmap, ldns_rr_type type); - -/** - * Checks if RR type t is enumerated in the type bitmap rdf and sets the bit. - * \param[in] bitmap the RR type bitmap rdf to look in - * \param[in] type the type to for which the bit to set - * \return LDNS_STATUS_OK on success. LDNS_STATUS_TYPE_NOT_IN_BITMAP is - * returned when the bitmap does not contain the bit to set. - */ -ldns_status ldns_nsec_bitmap_set_type(ldns_rdf* bitmap, ldns_rr_type type); - -/** - * Checks if RR type t is enumerated in the type bitmap rdf and clears the bit. - * \param[in] bitmap the RR type bitmap rdf to look in - * \param[in] type the type to for which the bit to clear - * \return LDNS_STATUS_OK on success. LDNS_STATUS_TYPE_NOT_IN_BITMAP is - * returned when the bitmap does not contain the bit to clear. - */ -ldns_status ldns_nsec_bitmap_clear_type(ldns_rdf* bitmap, ldns_rr_type type); - -/** - * Checks coverage of NSEC(3) RR name span - * Remember that nsec and name must both be in canonical form (ie use - * \ref ldns_rr2canonical and \ref ldns_dname2canonical prior to calling this - * function) - * - * \param[in] nsec The NSEC RR to check - * \param[in] name The owner dname to check, if the nsec record is a NSEC3 record, this should be the hashed name - * \return true if the NSEC RR covers the owner name - */ -bool ldns_nsec_covers_name(const ldns_rr *nsec, const ldns_rdf *name); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * verify a packet - * \param[in] p the packet - * \param[in] t the rr set type to check - * \param[in] o the rr set name to check - * \param[in] k list of keys - * \param[in] s list of sigs (may be null) - * \param[out] good_keys keys which validated the packet - * \return status - * - */ -ldns_status ldns_pkt_verify(const ldns_pkt *p, ldns_rr_type t, const ldns_rdf *o, const ldns_rr_list *k, const ldns_rr_list *s, ldns_rr_list *good_keys); - -/** - * verify a packet - * \param[in] p the packet - * \param[in] t the rr set type to check - * \param[in] o the rr set name to check - * \param[in] k list of keys - * \param[in] s list of sigs (may be null) - * \param[in] check_time the time for which the validation is performed - * \param[out] good_keys keys which validated the packet - * \return status - * - */ -ldns_status ldns_pkt_verify_time(const ldns_pkt *p, ldns_rr_type t, const ldns_rdf *o, const ldns_rr_list *k, const ldns_rr_list *s, time_t check_time, ldns_rr_list *good_keys); - -#endif - -/** - * chains nsec3 list - */ -ldns_status -ldns_dnssec_chain_nsec3_list(ldns_rr_list *nsec3_rrs); - -/** - * compare for nsec3 sort - */ -int -qsort_rr_compare_nsec3(const void *a, const void *b); - -/** - * sort nsec3 list - */ -void -ldns_rr_list_sort_nsec3(ldns_rr_list *unsorted); - -/** - * Default callback function to always leave present signatures, and - * add new ones - * \param[in] sig The signature to check for removal (unused) - * \param[in] n Optional argument (unused) - * \return LDNS_SIGNATURE_LEAVE_ADD_NEW - */ -int ldns_dnssec_default_add_to_signatures(ldns_rr *sig, void *n); -/** - * Default callback function to always leave present signatures, and - * add no new ones for the keys of these signatures - * \param[in] sig The signature to check for removal (unused) - * \param[in] n Optional argument (unused) - * \return LDNS_SIGNATURE_LEAVE_NO_ADD - */ -int ldns_dnssec_default_leave_signatures(ldns_rr *sig, void *n); -/** - * Default callback function to always remove present signatures, but - * add no new ones - * \param[in] sig The signature to check for removal (unused) - * \param[in] n Optional argument (unused) - * \return LDNS_SIGNATURE_REMOVE_NO_ADD - */ -int ldns_dnssec_default_delete_signatures(ldns_rr *sig, void *n); -/** - * Default callback function to always leave present signatures, and - * add new ones - * \param[in] sig The signature to check for removal (unused) - * \param[in] n Optional argument (unused) - * \return LDNS_SIGNATURE_REMOVE_ADD_NEW - */ -int ldns_dnssec_default_replace_signatures(ldns_rr *sig, void *n); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Converts the DSA signature from ASN1 representation (RFC2459, as - * used by OpenSSL) to raw signature data as used in DNS (rfc2536) - * - * \param[in] sig The signature in RFC2459 format - * \param[in] sig_len The length of the signature - * \return a new rdf with the signature - */ -ldns_rdf * -ldns_convert_dsa_rrsig_asn12rdf(const ldns_buffer *sig, - const long sig_len); - -/** - * Converts the RRSIG signature RDF (in rfc2536 format) to a buffer - * with the signature in rfc2459 format - * - * \param[out] target_buffer buffer to place the signature data - * \param[in] sig_rdf The signature rdf to convert - * \return LDNS_STATUS_OK on success, error code otherwise - */ -ldns_status -ldns_convert_dsa_rrsig_rdf2asn1(ldns_buffer *target_buffer, - const ldns_rdf *sig_rdf); - -/** - * Converts the ECDSA signature from ASN1 representation (as - * used by OpenSSL) to raw signature data as used in DNS - * This routine is only present if ldns is compiled with ecdsa support. - * The older ldns_convert_ecdsa_rrsig_asn12rdf routine could not (always) - * construct a valid rdf because it did not have the num_bytes parameter. - * The num_bytes parameter is 32 for p256 and 48 for p384 (bits/8). - * - * \param[in] sig The signature in ASN1 format - * \param[in] sig_len The length of the signature - * \param[in] num_bytes number of bytes for values in the curve, the curve - * size divided by 8. - * \return a new rdf with the signature - */ -ldns_rdf * -ldns_convert_ecdsa_rrsig_asn1len2rdf(const ldns_buffer *sig, - const long sig_len, int num_bytes); - -/** - * Converts the RRSIG signature RDF (from DNS) to a buffer with the - * signature in ASN1 format as openssl uses it. - * This routine is only present if ldns is compiled with ecdsa support. - * - * \param[out] target_buffer buffer to place the signature data in ASN1. - * \param[in] sig_rdf The signature rdf to convert - * \return LDNS_STATUS_OK on success, error code otherwise - */ -ldns_status -ldns_convert_ecdsa_rrsig_rdf2asn1(ldns_buffer *target_buffer, - const ldns_rdf *sig_rdf); - -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_DNSSEC_H */ diff --git a/ldns/ldns/dnssec_sign.h b/ldns/ldns/dnssec_sign.h deleted file mode 100644 index a88a46a..0000000 --- a/ldns/ldns/dnssec_sign.h +++ /dev/null @@ -1,384 +0,0 @@ -/** dnssec_verify */ - -#ifndef LDNS_DNSSEC_SIGN_H -#define LDNS_DNSSEC_SIGN_H - -#include <ldns/dnssec.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* sign functions */ - -/** Sign flag that makes DNSKEY type signed by all keys, not only by SEP keys*/ -#define LDNS_SIGN_DNSKEY_WITH_ZSK 1 -#define LDNS_SIGN_WITH_ALL_ALGORITHMS 2 - -/** - * Create an empty RRSIG RR (i.e. without the actual signature data) - * \param[in] rrset The RRset to create the signature for - * \param[in] key The key that will create the signature - * \return signature rr - */ -ldns_rr * -ldns_create_empty_rrsig(const ldns_rr_list *rrset, - const ldns_key *key); - -/** - * Sign the buffer which contains the wiredata of an rrset, and the - * corresponding empty rrsig rr with the given key - * \param[in] sign_buf the buffer with data to sign - * \param[in] key the key to sign with - * \return an rdata field with the signature data - */ -ldns_rdf * -ldns_sign_public_buffer(ldns_buffer *sign_buf, ldns_key *key); - -/** - * Sign an rrset - * \param[in] rrset the rrset - * \param[in] keys the keys to use - * \return a rr_list with the signatures - */ -ldns_rr_list *ldns_sign_public(ldns_rr_list *rrset, ldns_key_list *keys); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Sign a buffer with the DSA key (hash with SHA1) - * \param[in] to_sign buffer with the data - * \param[in] key the key to use - * \return a ldns_rdf with the signed data - */ -ldns_rdf *ldns_sign_public_dsa(ldns_buffer *to_sign, DSA *key); - -/** - * Sign data with EVP (general method for different algorithms) - * - * \param[in] to_sign The ldns_buffer containing raw data that is - * to be signed - * \param[in] key The EVP_PKEY key structure to sign with - * \param[in] digest_type The digest algorithm to use in the creation of - * the signature - * \return ldns_rdf for the RRSIG ldns_rr - */ -ldns_rdf *ldns_sign_public_evp(ldns_buffer *to_sign, - EVP_PKEY *key, - const EVP_MD *digest_type); - -/** - * Sign a buffer with the RSA key (hash with SHA1) - * \param[in] to_sign buffer with the data - * \param[in] key the key to use - * \return a ldns_rdf with the signed data - */ -ldns_rdf *ldns_sign_public_rsasha1(ldns_buffer *to_sign, RSA *key); - -/** - * Sign a buffer with the RSA key (hash with MD5) - * \param[in] to_sign buffer with the data - * \param[in] key the key to use - * \return a ldns_rdf with the signed data - */ -ldns_rdf *ldns_sign_public_rsamd5(ldns_buffer *to_sign, RSA *key); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * Marks the names in the zone that are occluded. Those names will be skipped - * when walking the tree with the ldns_dnssec_name_node_next_nonglue() - * function. But watch out! Names that are partially occluded (like glue with - * the same name as the delegation) will not be marked and should specifically - * be taken into account separately. - * - * When glue_list is given (not NULL), in the process of marking the names, all - * glue resource records will be pushed to that list, even glue at the delegation name. - * - * \param[in] zone the zone in which to mark the names - * \param[in] glue_list the list to which to push the glue rrs - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status -ldns_dnssec_zone_mark_and_get_glue( - ldns_dnssec_zone *zone, ldns_rr_list *glue_list); - -/** - * Marks the names in the zone that are occluded. Those names will be skipped - * when walking the tree with the ldns_dnssec_name_node_next_nonglue() - * function. But watch out! Names that are partially occluded (like glue with - * the same name as the delegation) will not be marked and should specifically - * be taken into account separately. - * - * \param[in] zone the zone in which to mark the names - * \return LDNS_STATUS_OK on succesful completion - */ -ldns_status -ldns_dnssec_zone_mark_glue(ldns_dnssec_zone *zone); - -/** - * Finds the first dnssec_name node in the rbtree that is not occluded. - * It *does* return names that are partially occluded. - * - * \param[in] node the first node to check - * \return the first node that has not been marked as glue, or NULL - * if not found (TODO: make that LDNS_RBTREE_NULL?) - */ -ldns_rbnode_t *ldns_dnssec_name_node_next_nonglue(ldns_rbnode_t *node); - -/** - * Adds NSEC records to the given dnssec_zone - * - * \param[in] zone the zone to add the records to - * \param[in] new_rrs ldns_rr's created by this function are - * added to this rr list, so the caller can free them later - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_create_nsecs(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs); - -/** - * Adds NSEC3 records to the zone - */ -ldns_status -ldns_dnssec_zone_create_nsec3s(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt); - -/** - * remove signatures if callback function tells to - * - * \param[in] signatures list of signatures to check, and - * possibly remove, depending on the value of the - * callback - * \param[in] key_list these are marked to be used or not, - * on the return value of the callback - * \param[in] func this function is called to specify what to - * do with each signature (and corresponding key) - * \param[in] arg Optional argument for the callback function - * \returns pointer to the new signatures rrs (the original - * passed to this function may have been removed) - */ -ldns_dnssec_rrs *ldns_dnssec_remove_signatures(ldns_dnssec_rrs *signatures, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg); - -/** - * Adds signatures to the zone - * - * \param[in] zone the zone to add RRSIG Resource Records to - * \param[in] new_rrs the RRSIG RRs that are created are also - * added to this list, so the caller can free them - * later - * \param[in] key_list list of keys to sign with. - * \param[in] func Callback function to decide what keys to - * use and what to do with old signatures - * \param[in] arg Optional argument for the callback function - * \param[in] flags option flags for signing process. 0 makes DNSKEY - * RRset signed with the minimal key set, that is only SEP keys are used - * for signing. If there are no SEP keys available, non-SEP keys will - * be used. LDNS_SIGN_DNSKEY_WITH_ZSK makes DNSKEY type signed with all - * keys. 0 is the default. - * \return LDNS_STATUS_OK on success, error otherwise - */ -ldns_status ldns_dnssec_zone_create_rrsigs_flg(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void*), - void *arg, - int flags); - -/** - * Adds signatures to the zone - * - * \param[in] zone the zone to add RRSIG Resource Records to - * \param[in] new_rrs the RRSIG RRs that are created are also - * added to this list, so the caller can free them - * later - * \param[in] key_list list of keys to sign with. - * \param[in] func Callback function to decide what keys to - * use and what to do with old signatures - * \param[in] arg Optional argument for the callback function - * \return LDNS_STATUS_OK on success, error otherwise - */ -ldns_status ldns_dnssec_zone_create_rrsigs(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void*), - void *arg); - -/** - * signs the given zone with the given keys - * - * \param[in] zone the zone to sign - * \param[in] key_list the list of keys to sign the zone with - * \param[in] new_rrs newly created resource records are added to this list, to free them later - * \param[in] func callback function that decides what to do with old signatures - * This function takes an ldns_rr* and an optional void *arg argument, and returns one of four values: - * LDNS_SIGNATURE_LEAVE_ADD_NEW: - * leave the signature and add a new one for the corresponding key - * LDNS_SIGNATURE_REMOVE_ADD_NEW: - * remove the signature and replace is with a new one from the same key - * LDNS_SIGNATURE_LEAVE_NO_ADD: - * leave the signature and do not add a new one with the corresponding key - * LDNS_SIGNATURE_REMOVE_NO_ADD: - * remove the signature and do not replace - * - * \param[in] arg optional argument for the callback function - * \param[in] flags option flags for signing process. 0 makes DNSKEY - * RRset signed with the minimal key set, that is only SEP keys are used - * for signing. If there are no SEP keys available, non-SEP keys will - * be used. LDNS_SIGN_DNSKEY_WITH_ZSK makes DNSKEY type signed with all - * keys. 0 is the default. - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_sign_flg(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - int flags); - -/** - * signs the given zone with the given new zone, with NSEC3 - * - * \param[in] zone the zone to sign - * \param[in] key_list the list of keys to sign the zone with - * \param[in] new_rrs newly created resource records are added to this list, to free them later - * \param[in] func callback function that decides what to do with old signatures - * \param[in] arg optional argument for the callback function - * \param[in] algorithm the NSEC3 hashing algorithm to use - * \param[in] flags NSEC3 flags - * \param[in] iterations the number of NSEC3 hash iterations to use - * \param[in] salt_length the length (in octets) of the NSEC3 salt - * \param[in] salt the NSEC3 salt data - * \param[in] signflags option flags for signing process. 0 is the default. - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_sign_nsec3_flg(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt, - int signflags); - -/** - * signs the given zone with the given new zone, with NSEC3 - * - * \param[in] zone the zone to sign - * \param[in] key_list the list of keys to sign the zone with - * \param[in] new_rrs newly created resource records are added to this list, to free them later - * \param[in] func callback function that decides what to do with old signatures - * \param[in] arg optional argument for the callback function - * \param[in] algorithm the NSEC3 hashing algorithm to use - * \param[in] flags NSEC3 flags - * \param[in] iterations the number of NSEC3 hash iterations to use - * \param[in] salt_length the length (in octets) of the NSEC3 salt - * \param[in] salt the NSEC3 salt data - * \param[in] signflags option flags for signing process. 0 is the default. - * \param[out] map a referenced rbtree pointer variable. The newly created - * rbtree will contain mappings from hashed owner names to the - * unhashed name. - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_sign_nsec3_flg_mkmap(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt, - int signflags, - ldns_rbtree_t **map - ); - - -/** - * signs the given zone with the given keys - * - * \param[in] zone the zone to sign - * \param[in] key_list the list of keys to sign the zone with - * \param[in] new_rrs newly created resource records are added to this list, to free them later - * \param[in] func callback function that decides what to do with old signatures - * This function takes an ldns_rr* and an optional void *arg argument, and returns one of four values: - * LDNS_SIGNATURE_LEAVE_ADD_NEW: - * leave the signature and add a new one for the corresponding key - * LDNS_SIGNATURE_REMOVE_ADD_NEW: - * remove the signature and replace is with a new one from the same key - * LDNS_SIGNATURE_LEAVE_NO_ADD: - * leave the signature and do not add a new one with the corresponding key - * LDNS_SIGNATURE_REMOVE_NO_ADD: - * remove the signature and do not replace - * - * \param[in] arg optional argument for the callback function - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_sign(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg); - -/** - * signs the given zone with the given new zone, with NSEC3 - * - * \param[in] zone the zone to sign - * \param[in] key_list the list of keys to sign the zone with - * \param[in] new_rrs newly created resource records are added to this list, to free them later - * \param[in] func callback function that decides what to do with old signatures - * \param[in] arg optional argument for the callback function - * \param[in] algorithm the NSEC3 hashing algorithm to use - * \param[in] flags NSEC3 flags - * \param[in] iterations the number of NSEC3 hash iterations to use - * \param[in] salt_length the length (in octets) of the NSEC3 salt - * \param[in] salt the NSEC3 salt data - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_sign_nsec3(ldns_dnssec_zone *zone, - ldns_rr_list *new_rrs, - ldns_key_list *key_list, - int (*func)(ldns_rr *, void *), - void *arg, - uint8_t algorithm, - uint8_t flags, - uint16_t iterations, - uint8_t salt_length, - uint8_t *salt); - -/** - * Signs the zone, and returns a newly allocated signed zone - * \param[in] zone the zone to sign - * \param[in] key_list list of keys to sign with - * \return signed zone - */ -ldns_zone *ldns_zone_sign(const ldns_zone *zone, ldns_key_list *key_list); - -/** - * Signs the zone with NSEC3, and returns a newly allocated signed zone - * \param[in] zone the zone to sign - * \param[in] key_list list of keys to sign with - * \param[in] algorithm the NSEC3 hashing algorithm to use - * \param[in] flags NSEC3 flags - * \param[in] iterations the number of NSEC3 hash iterations to use - * \param[in] salt_length the length (in octets) of the NSEC3 salt - * \param[in] salt the NSEC3 salt data - * \return signed zone - */ -ldns_zone *ldns_zone_sign_nsec3(ldns_zone *zone, ldns_key_list *key_list, uint8_t algorithm, uint8_t flags, uint16_t iterations, uint8_t salt_length, uint8_t *salt); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ldns/ldns/dnssec_verify.h b/ldns/ldns/dnssec_verify.h deleted file mode 100644 index 80881c6..0000000 --- a/ldns/ldns/dnssec_verify.h +++ /dev/null @@ -1,857 +0,0 @@ -/** dnssec_verify */ - -#ifndef LDNS_DNSSEC_VERIFY_H -#define LDNS_DNSSEC_VERIFY_H - -#define LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS 10 - -#include <ldns/dnssec.h> -#include <ldns/host2str.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Chain structure that contains all DNSSEC data needed to - * verify an rrset - */ -typedef struct ldns_dnssec_data_chain_struct ldns_dnssec_data_chain; -struct ldns_dnssec_data_chain_struct -{ - ldns_rr_list *rrset; - ldns_rr_list *signatures; - ldns_rr_type parent_type; - ldns_dnssec_data_chain *parent; - ldns_pkt_rcode packet_rcode; - ldns_rr_type packet_qtype; - bool packet_nodata; -}; - -/** - * Creates a new dnssec_chain structure - * \return ldns_dnssec_data_chain * - */ -ldns_dnssec_data_chain *ldns_dnssec_data_chain_new(void); - -/** - * Frees a dnssec_data_chain structure - * - * \param[in] *chain The chain to free - */ -void ldns_dnssec_data_chain_free(ldns_dnssec_data_chain *chain); - -/** - * Frees a dnssec_data_chain structure, and all data - * contained therein - * - * \param[in] *chain The dnssec_data_chain to free - */ -void ldns_dnssec_data_chain_deep_free(ldns_dnssec_data_chain *chain); - -/** - * Prints the dnssec_data_chain to the given file stream - * - * \param[in] *out The file stream to print to - * \param[in] *chain The dnssec_data_chain to print - */ -void ldns_dnssec_data_chain_print(FILE *out, const ldns_dnssec_data_chain *chain); - -/** - * Prints the dnssec_data_chain to the given file stream - * - * \param[in] *out The file stream to print to - * \param[in] *fmt The format of the textual representation - * \param[in] *chain The dnssec_data_chain to print - */ -void ldns_dnssec_data_chain_print_fmt(FILE *out, - const ldns_output_format *fmt, - const ldns_dnssec_data_chain *chain); - -/** - * Build an ldns_dnssec_data_chain, which contains all - * DNSSEC data that is needed to derive the trust tree later - * - * The data_set will be cloned - * - * \param[in] *res resolver structure for further needed queries - * \param[in] qflags resolution flags - * \param[in] *data_set The original rrset where the chain ends - * \param[in] *pkt optional, can contain the original packet - * (and hence the sigs and maybe the key) - * \param[in] *orig_rr The original Resource Record - * - * \return the DNSSEC data chain - */ -ldns_dnssec_data_chain *ldns_dnssec_build_data_chain(ldns_resolver *res, - const uint16_t qflags, - const ldns_rr_list *data_set, - const ldns_pkt *pkt, - ldns_rr *orig_rr); - -/** - * Tree structure that contains the relation of DNSSEC data, - * and their cryptographic status. - * - * This tree is derived from a data_chain, and can be used - * to look whether there is a connection between an RRSET - * and a trusted key. The tree only contains pointers to the - * data_chain, and therefore one should *never* free() the - * data_chain when there is still a trust tree derived from - * that chain. - * - * Example tree: - * key key key - * \ | / - * \ | / - * \ | / - * ds - * | - * key - * | - * key - * | - * rr - * - * For each signature there is a parent; if the parent - * pointer is null, it couldn't be found and there was no - * denial; otherwise is a tree which contains either a - * DNSKEY, a DS, or a NSEC rr - */ -typedef struct ldns_dnssec_trust_tree_struct ldns_dnssec_trust_tree; -struct ldns_dnssec_trust_tree_struct -{ - ldns_rr *rr; - /* the complete rrset this rr was in */ - ldns_rr_list *rrset; - ldns_dnssec_trust_tree *parents[LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS]; - ldns_status parent_status[LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS]; - /** for debugging, add signatures too (you might want - those if they contain errors) */ - ldns_rr *parent_signature[LDNS_DNSSEC_TRUST_TREE_MAX_PARENTS]; - size_t parent_count; -}; - -/** - * Creates a new (empty) dnssec_trust_tree structure - * - * \return ldns_dnssec_trust_tree * - */ -ldns_dnssec_trust_tree *ldns_dnssec_trust_tree_new(void); - -/** - * Frees the dnssec_trust_tree recursively - * - * There is no deep free; all data in the trust tree - * consists of pointers to a data_chain - * - * \param[in] tree The tree to free - */ -void ldns_dnssec_trust_tree_free(ldns_dnssec_trust_tree *tree); - -/** - * returns the depth of the trust tree - * - * \param[in] tree tree to calculate the depth of - * \return The depth of the tree - */ -size_t ldns_dnssec_trust_tree_depth(ldns_dnssec_trust_tree *tree); - -/** - * Prints the dnssec_trust_tree structure to the given file - * stream. - * - * If a link status is not LDNS_STATUS_OK; the status and - * relevant signatures are printed too - * - * \param[in] *out The file stream to print to - * \param[in] tree The trust tree to print - * \param[in] tabs Prepend each line with tabs*2 spaces - * \param[in] extended If true, add little explanation lines to the output - */ -void ldns_dnssec_trust_tree_print(FILE *out, - ldns_dnssec_trust_tree *tree, - size_t tabs, - bool extended); - -/** - * Prints the dnssec_trust_tree structure to the given file - * stream. - * - * If a link status is not LDNS_STATUS_OK; the status and - * relevant signatures are printed too - * - * \param[in] *out The file stream to print to - * \param[in] *fmt The format of the textual representation - * \param[in] tree The trust tree to print - * \param[in] tabs Prepend each line with tabs*2 spaces - * \param[in] extended If true, add little explanation lines to the output - */ -void ldns_dnssec_trust_tree_print_fmt(FILE *out, - const ldns_output_format *fmt, - ldns_dnssec_trust_tree *tree, - size_t tabs, - bool extended); - -/** - * Adds a trust tree as a parent for the given trust tree - * - * \param[in] *tree The tree to add the parent to - * \param[in] *parent The parent tree to add - * \param[in] *parent_signature The RRSIG relevant to this parent/child - * connection - * \param[in] parent_status The DNSSEC status for this parent, child and RRSIG - * \return LDNS_STATUS_OK if the addition succeeds, error otherwise - */ -ldns_status ldns_dnssec_trust_tree_add_parent(ldns_dnssec_trust_tree *tree, - const ldns_dnssec_trust_tree *parent, - const ldns_rr *parent_signature, - const ldns_status parent_status); - -/** - * Generates a dnssec_trust_tree for the given rr from the - * given data_chain - * - * This does not clone the actual data; Don't free the - * data_chain before you are done with this tree - * - * \param[in] *data_chain The chain to derive the trust tree from - * \param[in] *rr The RR this tree will be about - * \return ldns_dnssec_trust_tree * - */ -ldns_dnssec_trust_tree *ldns_dnssec_derive_trust_tree( - ldns_dnssec_data_chain *data_chain, - ldns_rr *rr); - -/** - * Generates a dnssec_trust_tree for the given rr from the - * given data_chain - * - * This does not clone the actual data; Don't free the - * data_chain before you are done with this tree - * - * \param[in] *data_chain The chain to derive the trust tree from - * \param[in] *rr The RR this tree will be about - * \param[in] check_time the time for which the validation is performed - * \return ldns_dnssec_trust_tree * - */ -ldns_dnssec_trust_tree *ldns_dnssec_derive_trust_tree_time( - ldns_dnssec_data_chain *data_chain, - ldns_rr *rr, time_t check_time); - -/** - * Sub function for derive_trust_tree that is used for a 'normal' rrset - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_sig_rr The currently relevant signature - */ -void ldns_dnssec_derive_trust_tree_normal_rrset( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_sig_rr); - -/** - * Sub function for derive_trust_tree that is used for a 'normal' rrset - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_sig_rr The currently relevant signature - * \param[in] check_time the time for which the validation is performed - */ -void ldns_dnssec_derive_trust_tree_normal_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_sig_rr, time_t check_time); - - -/** - * Sub function for derive_trust_tree that is used for DNSKEY rrsets - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_rr The currently relevant DNSKEY RR - * \param[in] cur_sig_rr The currently relevant signature - */ -void ldns_dnssec_derive_trust_tree_dnskey_rrset( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, - ldns_rr *cur_sig_rr); - -/** - * Sub function for derive_trust_tree that is used for DNSKEY rrsets - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_rr The currently relevant DNSKEY RR - * \param[in] cur_sig_rr The currently relevant signature - * \param[in] check_time the time for which the validation is performed - */ -void ldns_dnssec_derive_trust_tree_dnskey_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, ldns_rr *cur_sig_rr, - time_t check_time); - -/** - * Sub function for derive_trust_tree that is used for DS rrsets - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_rr The currently relevant DS RR - */ -void ldns_dnssec_derive_trust_tree_ds_rrset( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr); - -/** - * Sub function for derive_trust_tree that is used for DS rrsets - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] cur_rr The currently relevant DS RR - * \param[in] check_time the time for which the validation is performed - */ -void ldns_dnssec_derive_trust_tree_ds_rrset_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - ldns_rr *cur_rr, time_t check_time); - -/** - * Sub function for derive_trust_tree that is used when there are no - * signatures - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - */ -void ldns_dnssec_derive_trust_tree_no_sig( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain); - -/** - * Sub function for derive_trust_tree that is used when there are no - * signatures - * - * \param[in] new_tree The trust tree that we are building - * \param[in] data_chain The data chain containing the data for the trust tree - * \param[in] check_time the time for which the validation is performed - */ -void ldns_dnssec_derive_trust_tree_no_sig_time( - ldns_dnssec_trust_tree *new_tree, - ldns_dnssec_data_chain *data_chain, - time_t check_time); - - -/** - * Returns OK if there is a trusted path in the tree to one of - * the DNSKEY or DS RRs in the given list - * - * \param *tree The trust tree so search - * \param *keys A ldns_rr_list of DNSKEY and DS rrs to look for - * - * \return LDNS_STATUS_OK if there is a trusted path to one of - * the keys, or the *first* error encountered - * if there were no paths - */ -ldns_status ldns_dnssec_trust_tree_contains_keys( - ldns_dnssec_trust_tree *tree, - ldns_rr_list *keys); - -/** - * Verifies a list of signatures for one rrset. - * - * \param[in] rrset the rrset to verify - * \param[in] rrsig a list of signatures to check - * \param[in] keys a list of keys to check with - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return status LDNS_STATUS_OK if there is at least one correct key - */ -ldns_status ldns_verify(ldns_rr_list *rrset, - ldns_rr_list *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys); - -/** - * Verifies a list of signatures for one rrset. - * - * \param[in] rrset the rrset to verify - * \param[in] rrsig a list of signatures to check - * \param[in] keys a list of keys to check with - * \param[in] check_time the time for which the validation is performed - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return status LDNS_STATUS_OK if there is at least one correct key - */ -ldns_status ldns_verify_time(const ldns_rr_list *rrset, - const ldns_rr_list *rrsig, - const ldns_rr_list *keys, - time_t check_time, - ldns_rr_list *good_keys); - - -/** - * Verifies a list of signatures for one rrset, but disregard the time. - * Inception and Expiration are not checked. - * - * \param[in] rrset the rrset to verify - * \param[in] rrsig a list of signatures to check - * \param[in] keys a list of keys to check with - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return status LDNS_STATUS_OK if there is at least one correct key - */ -ldns_status ldns_verify_notime(ldns_rr_list *rrset, - ldns_rr_list *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys); - -/** - * Tries to build an authentication chain from the given - * keys down to the queried domain. - * - * If we find a valid trust path, return the valid keys for the domain. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \param[out] status pointer to the status variable where the result - * code will be stored - * \return the set of trusted keys for the domain, or NULL if no - * trust path could be built. - */ -ldns_rr_list *ldns_fetch_valid_domain_keys(const ldns_resolver * res, - const ldns_rdf * domain, - const ldns_rr_list * keys, - ldns_status *status); - -/** - * Tries to build an authentication chain from the given - * keys down to the queried domain. - * - * If we find a valid trust path, return the valid keys for the domain. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \param[in] check_time the time for which the validation is performed - * \param[out] status pointer to the status variable where the result - * code will be stored - * \return the set of trusted keys for the domain, or NULL if no - * trust path could be built. - */ -ldns_rr_list *ldns_fetch_valid_domain_keys_time(const ldns_resolver * res, - const ldns_rdf * domain, const ldns_rr_list * keys, - time_t check_time, ldns_status *status); - - -/** - * Validates the DNSKEY RRset for the given domain using the provided - * trusted keys. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \return the set of trusted keys for the domain, or NULL if the RRSET - * could not be validated - */ -ldns_rr_list *ldns_validate_domain_dnskey (const ldns_resolver *res, - const ldns_rdf *domain, - const ldns_rr_list *keys); - -/** - * Validates the DNSKEY RRset for the given domain using the provided - * trusted keys. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \param[in] check_time the time for which the validation is performed - * \return the set of trusted keys for the domain, or NULL if the RRSET - * could not be validated - */ -ldns_rr_list *ldns_validate_domain_dnskey_time( - const ldns_resolver *res, const ldns_rdf *domain, - const ldns_rr_list *keys, time_t check_time); - - -/** - * Validates the DS RRset for the given domain using the provided trusted keys. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \return the set of trusted keys for the domain, or NULL if the RRSET could not be validated - */ -ldns_rr_list *ldns_validate_domain_ds(const ldns_resolver *res, - const ldns_rdf * - domain, - const ldns_rr_list * keys); - -/** - * Validates the DS RRset for the given domain using the provided trusted keys. - * - * \param[in] res the current resolver - * \param[in] domain the domain we want valid keys for - * \param[in] keys the current set of trusted keys - * \param[in] check_time the time for which the validation is performed - * \return the set of trusted keys for the domain, or NULL if the RRSET could not be validated - */ -ldns_rr_list *ldns_validate_domain_ds_time( - const ldns_resolver *res, const ldns_rdf *domain, - const ldns_rr_list * keys, time_t check_time); - - -/** - * Verifies a list of signatures for one RRset using a valid trust path. - * - * \param[in] res the current resolver - * \param[in] rrset the rrset to verify - * \param[in] rrsigs a list of signatures to check - * \param[out] validating_keys if this is a (initialized) list, the - * keys from keys that validate one of - * the signatures are added to it - * \return status LDNS_STATUS_OK if there is at least one correct key - */ -ldns_status ldns_verify_trusted(ldns_resolver *res, - ldns_rr_list *rrset, - ldns_rr_list *rrsigs, - ldns_rr_list *validating_keys); - -/** - * Verifies a list of signatures for one RRset using a valid trust path. - * - * \param[in] res the current resolver - * \param[in] rrset the rrset to verify - * \param[in] rrsigs a list of signatures to check - * \param[in] check_time the time for which the validation is performed - * \param[out] validating_keys if this is a (initialized) list, the - * keys from keys that validate one of - * the signatures are added to it - * \return status LDNS_STATUS_OK if there is at least one correct key - */ -ldns_status ldns_verify_trusted_time( - ldns_resolver *res, ldns_rr_list *rrset, - ldns_rr_list *rrsigs, time_t check_time, - ldns_rr_list *validating_keys); - - -/** - * denial is not just a river in egypt - * - * \param[in] rr The (query) RR to check the denial of existence for - * \param[in] nsecs The list of NSEC RRs that are supposed to deny the - * existence of the RR - * \param[in] rrsigs The RRSIG RR covering the NSEC RRs - * \return LDNS_STATUS_OK if the NSEC RRs deny the existence, error code - * containing the reason they do not otherwise - */ -ldns_status ldns_dnssec_verify_denial(ldns_rr *rr, - ldns_rr_list *nsecs, - ldns_rr_list *rrsigs); - -/** - * Denial of existence using NSEC3 records - * Since NSEC3 is a bit more complicated than normal denial, some - * context arguments are needed - * - * \param[in] rr The (query) RR to check the denial of existence for - * \param[in] nsecs The list of NSEC3 RRs that are supposed to deny the - * existence of the RR - * \param[in] rrsigs The RRSIG rr covering the NSEC RRs - * \param[in] packet_rcode The RCODE value of the packet that provided the - * NSEC3 RRs - * \param[in] packet_qtype The original query RR type - * \param[in] packet_nodata True if the providing packet had an empty ANSWER - * section - * \return LDNS_STATUS_OK if the NSEC3 RRs deny the existence, error code - * containing the reason they do not otherwise - */ -ldns_status ldns_dnssec_verify_denial_nsec3(ldns_rr *rr, - ldns_rr_list *nsecs, - ldns_rr_list *rrsigs, - ldns_pkt_rcode packet_rcode, - ldns_rr_type packet_qtype, - bool packet_nodata); - -/** - * Same as ldns_status ldns_dnssec_verify_denial_nsec3 but also returns - * the nsec rr that matched. - * - * \param[in] rr The (query) RR to check the denial of existence for - * \param[in] nsecs The list of NSEC3 RRs that are supposed to deny the - * existence of the RR - * \param[in] rrsigs The RRSIG rr covering the NSEC RRs - * \param[in] packet_rcode The RCODE value of the packet that provided the - * NSEC3 RRs - * \param[in] packet_qtype The original query RR type - * \param[in] packet_nodata True if the providing packet had an empty ANSWER - * section - * \param[in] match On match, the given (reference to a) pointer will be set - * to point to the matching nsec resource record. - * \return LDNS_STATUS_OK if the NSEC3 RRs deny the existence, error code - * containing the reason they do not otherwise - */ -ldns_status ldns_dnssec_verify_denial_nsec3_match(ldns_rr *rr, - ldns_rr_list *nsecs, - ldns_rr_list *rrsigs, - ldns_pkt_rcode packet_rcode, - ldns_rr_type packet_qtype, - bool packet_nodata, - ldns_rr **match); -/** - * Verifies the already processed data in the buffers - * This function should probably not be used directly. - * - * \param[in] rawsig_buf Buffer containing signature data to use - * \param[in] verify_buf Buffer containing data to verify - * \param[in] key_buf Buffer containing key data to use - * \param[in] algo Signing algorithm - * \return status LDNS_STATUS_OK if the data verifies. Error if not. - */ -ldns_status ldns_verify_rrsig_buffers(ldns_buffer *rawsig_buf, - ldns_buffer *verify_buf, - ldns_buffer *key_buf, - uint8_t algo); - -/** - * Like ldns_verify_rrsig_buffers, but uses raw data. - * - * \param[in] sig signature data to use - * \param[in] siglen length of signature data to use - * \param[in] verify_buf Buffer containing data to verify - * \param[in] key key data to use - * \param[in] keylen length of key data to use - * \param[in] algo Signing algorithm - * \return status LDNS_STATUS_OK if the data verifies. Error if not. - */ -ldns_status ldns_verify_rrsig_buffers_raw(unsigned char* sig, - size_t siglen, - ldns_buffer *verify_buf, - unsigned char* key, - size_t keylen, - uint8_t algo); - -/** - * Verifies an rrsig. All keys in the keyset are tried. - * \param[in] rrset the rrset to check - * \param[in] rrsig the signature of the rrset - * \param[in] keys the keys to try - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return a list of keys which validate the rrsig + rrset. Returns - * status LDNS_STATUS_OK if at least one key matched. Else an error. - */ -ldns_status ldns_verify_rrsig_keylist(ldns_rr_list *rrset, - ldns_rr *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys); - -/** - * Verifies an rrsig. All keys in the keyset are tried. - * \param[in] rrset the rrset to check - * \param[in] rrsig the signature of the rrset - * \param[in] keys the keys to try - * \param[in] check_time the time for which the validation is performed - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return a list of keys which validate the rrsig + rrset. Returns - * status LDNS_STATUS_OK if at least one key matched. Else an error. - */ -ldns_status ldns_verify_rrsig_keylist_time( - const ldns_rr_list *rrset, const ldns_rr *rrsig, - const ldns_rr_list *keys, time_t check_time, - ldns_rr_list *good_keys); - - -/** - * Verifies an rrsig. All keys in the keyset are tried. Time is not checked. - * \param[in] rrset the rrset to check - * \param[in] rrsig the signature of the rrset - * \param[in] keys the keys to try - * \param[out] good_keys if this is a (initialized) list, the pointer to keys - * from keys that validate one of the signatures - * are added to it - * \return a list of keys which validate the rrsig + rrset. Returns - * status LDNS_STATUS_OK if at least one key matched. Else an error. - */ -ldns_status ldns_verify_rrsig_keylist_notime(const ldns_rr_list *rrset, - const ldns_rr *rrsig, - const ldns_rr_list *keys, - ldns_rr_list *good_keys); - -/** - * verify an rrsig with 1 key - * \param[in] rrset the rrset - * \param[in] rrsig the rrsig to verify - * \param[in] key the key to use - * \return status message whether verification succeeded. - */ -ldns_status ldns_verify_rrsig(ldns_rr_list *rrset, - ldns_rr *rrsig, - ldns_rr *key); - - -/** - * verify an rrsig with 1 key - * \param[in] rrset the rrset - * \param[in] rrsig the rrsig to verify - * \param[in] key the key to use - * \param[in] check_time the time for which the validation is performed - * \return status message whether verification succeeded. - */ -ldns_status ldns_verify_rrsig_time( - ldns_rr_list *rrset, ldns_rr *rrsig, - ldns_rr *key, time_t check_time); - - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * verifies a buffer with signature data for a buffer with rrset data - * with an EVP_PKEY - * - * \param[in] sig the signature data - * \param[in] rrset the rrset data, sorted and processed for verification - * \param[in] key the EVP key structure - * \param[in] digest_type The digest type of the signature - */ -ldns_status ldns_verify_rrsig_evp(ldns_buffer *sig, - ldns_buffer *rrset, - EVP_PKEY *key, - const EVP_MD *digest_type); - -/** - * Like ldns_verify_rrsig_evp, but uses raw signature data. - * \param[in] sig the signature data, wireformat uncompressed - * \param[in] siglen length of the signature data - * \param[in] rrset the rrset data, sorted and processed for verification - * \param[in] key the EVP key structure - * \param[in] digest_type The digest type of the signature - */ -ldns_status ldns_verify_rrsig_evp_raw(const unsigned char *sig, - size_t siglen, - const ldns_buffer *rrset, - EVP_PKEY *key, - const EVP_MD *digest_type); -#endif - -/** - * verifies a buffer with signature data (DSA) for a buffer with rrset data - * with a buffer with key data. - * - * \param[in] sig the signature data - * \param[in] rrset the rrset data, sorted and processed for verification - * \param[in] key the key data - */ -ldns_status ldns_verify_rrsig_dsa(ldns_buffer *sig, - ldns_buffer *rrset, - ldns_buffer *key); - -/** - * verifies a buffer with signature data (RSASHA1) for a buffer with rrset data - * with a buffer with key data. - * - * \param[in] sig the signature data - * \param[in] rrset the rrset data, sorted and processed for verification - * \param[in] key the key data - */ -ldns_status ldns_verify_rrsig_rsasha1(ldns_buffer *sig, - ldns_buffer *rrset, - ldns_buffer *key); - -/** - * verifies a buffer with signature data (RSAMD5) for a buffer with rrset data - * with a buffer with key data. - * - * \param[in] sig the signature data - * \param[in] rrset the rrset data, sorted and processed for verification - * \param[in] key the key data - */ -ldns_status ldns_verify_rrsig_rsamd5(ldns_buffer *sig, - ldns_buffer *rrset, - ldns_buffer *key); - -/** - * Like ldns_verify_rrsig_dsa, but uses raw signature and key data. - * \param[in] sig raw uncompressed wireformat signature data - * \param[in] siglen length of signature data - * \param[in] rrset ldns buffer with prepared rrset data. - * \param[in] key raw uncompressed wireformat key data - * \param[in] keylen length of key data - */ -ldns_status ldns_verify_rrsig_dsa_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen); - -/** - * Like ldns_verify_rrsig_rsasha1, but uses raw signature and key data. - * \param[in] sig raw uncompressed wireformat signature data - * \param[in] siglen length of signature data - * \param[in] rrset ldns buffer with prepared rrset data. - * \param[in] key raw uncompressed wireformat key data - * \param[in] keylen length of key data - */ -ldns_status ldns_verify_rrsig_rsasha1_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen); - -/** - * Like ldns_verify_rrsig_rsasha256, but uses raw signature and key data. - * \param[in] sig raw uncompressed wireformat signature data - * \param[in] siglen length of signature data - * \param[in] rrset ldns buffer with prepared rrset data. - * \param[in] key raw uncompressed wireformat key data - * \param[in] keylen length of key data - */ - -ldns_status ldns_verify_rrsig_rsasha256_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen); - -/** - * Like ldns_verify_rrsig_rsasha512, but uses raw signature and key data. - * \param[in] sig raw uncompressed wireformat signature data - * \param[in] siglen length of signature data - * \param[in] rrset ldns buffer with prepared rrset data. - * \param[in] key raw uncompressed wireformat key data - * \param[in] keylen length of key data - */ -ldns_status ldns_verify_rrsig_rsasha512_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen); - -/** - * Like ldns_verify_rrsig_rsamd5, but uses raw signature and key data. - * \param[in] sig raw uncompressed wireformat signature data - * \param[in] siglen length of signature data - * \param[in] rrset ldns buffer with prepared rrset data. - * \param[in] key raw uncompressed wireformat key data - * \param[in] keylen length of key data - */ -ldns_status ldns_verify_rrsig_rsamd5_raw(unsigned char* sig, - size_t siglen, - ldns_buffer* rrset, - unsigned char* key, - size_t keylen); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/ldns/ldns/dnssec_zone.h b/ldns/ldns/dnssec_zone.h deleted file mode 100644 index e97ea30..0000000 --- a/ldns/ldns/dnssec_zone.h +++ /dev/null @@ -1,483 +0,0 @@ -/* - * special zone file structures and functions for better dnssec handling - * - * A zone contains a SOA dnssec_zone_rrset, and an AVL tree of 'normal' - * dnssec_zone_rrsets, indexed by name and type - */ - -#ifndef LDNS_DNSSEC_ZONE_H -#define LDNS_DNSSEC_ZONE_H - -#include <ldns/rbtree.h> -#include <ldns/host2str.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Singly linked list of rrs - */ -typedef struct ldns_struct_dnssec_rrs ldns_dnssec_rrs; -struct ldns_struct_dnssec_rrs -{ - ldns_rr *rr; - ldns_dnssec_rrs *next; -}; - -/** - * Singly linked list of RRsets - */ -typedef struct ldns_struct_dnssec_rrsets ldns_dnssec_rrsets; -struct ldns_struct_dnssec_rrsets -{ - ldns_dnssec_rrs *rrs; - ldns_rr_type type; - ldns_dnssec_rrs *signatures; - ldns_dnssec_rrsets *next; -}; - -/** - * Structure containing all resource records for a domain name - * Including the derived NSEC3, if present - */ -typedef struct ldns_struct_dnssec_name ldns_dnssec_name; -struct ldns_struct_dnssec_name -{ - /** - * pointer to a dname containing the name. - * Usually points to the owner name of the first RR of the first RRset - */ - ldns_rdf *name; - /** - * Usually, the name is a pointer to the owner name of the first rr for - * this name, but sometimes there is no actual data to point to, - * for instance in - * names representing empty nonterminals. If so, set alloced to true to - * indicate that this data must also be freed when the name is freed - */ - bool name_alloced; - /** - * The rrsets for this name - */ - ldns_dnssec_rrsets *rrsets; - /** - * NSEC pointing to the next name (or NSEC3 pointing to the next NSEC3) - */ - ldns_rr *nsec; - /** - * signatures for the NSEC record - */ - ldns_dnssec_rrs *nsec_signatures; - /** - * Unlike what the name is_glue suggests, this field is set to true by - * ldns_dnssec_zone_mark_glue() or ldns_dnssec_zone_mark_and_get_glue() - * when the name, this dnssec_name struct represents, is occluded. - * Names that contain other occluded rrsets and records with glue on - * the delegation point will NOT have this bool set to true. - * This field should NOT be read directly, but only via the - * ldns_dnssec_name_is_glue() function! - */ - bool is_glue; - /** - * pointer to store the hashed name (only used when in an NSEC3 zone - */ - ldns_rdf *hashed_name; -}; - -/** - * Structure containing a dnssec zone - */ -struct ldns_struct_dnssec_zone { - /** points to the name containing the SOA RR */ - ldns_dnssec_name *soa; - /** tree of ldns_dnssec_names */ - ldns_rbtree_t *names; - /** tree of ldns_dnssec_names by nsec3 hashes (when applicible) */ - ldns_rbtree_t *hashed_names; - /** points to the first added NSEC3 rr whose parameters will be - * assumed for all subsequent NSEC3 rr's and which will be used - * to calculate hashed names - */ - ldns_rr *_nsec3params; -}; -typedef struct ldns_struct_dnssec_zone ldns_dnssec_zone; - -/** - * Creates a new entry for 1 pointer to an rr and 1 pointer to the next rrs - * \return the allocated data - */ -ldns_dnssec_rrs *ldns_dnssec_rrs_new(void); - -/** - * Frees the list of rrs, but *not* the individual ldns_rr records - * contained in the list - * - * \param[in] rrs the data structure to free - */ -void ldns_dnssec_rrs_free(ldns_dnssec_rrs *rrs); - -/** - * Frees the list of rrs, and the individual ldns_rr records - * contained in the list - * - * \param[in] rrs the data structure to free - */ -void ldns_dnssec_rrs_deep_free(ldns_dnssec_rrs *rrs); - -/** - * Adds an RR to the list of RRs. The list will remain ordered. - * If an equal RR already exists, this RR will not be added. - * - * \param[in] rrs the list to add to - * \param[in] rr the RR to add - * \return LDNS_STATUS_OK on success - */ -ldns_status ldns_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr); - -/** - * Prints the given rrs to the file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] rrs the list of RRs to print - */ -void ldns_dnssec_rrs_print(FILE *out, const ldns_dnssec_rrs *rrs); - -/** - * Prints the given rrs to the file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] fmt the format of the textual representation - * \param[in] rrs the list of RRs to print - */ -void ldns_dnssec_rrs_print_fmt(FILE *out, - const ldns_output_format *fmt, const ldns_dnssec_rrs *rrs); - -/** - * Creates a new list (entry) of RRsets - * \return the newly allocated structure - */ -ldns_dnssec_rrsets *ldns_dnssec_rrsets_new(void); - -/** - * Frees the list of rrsets and their rrs, but *not* the ldns_rr - * records in the sets - * - * \param[in] rrsets the data structure to free - */ -void ldns_dnssec_rrsets_free(ldns_dnssec_rrsets *rrsets); - -/** - * Frees the list of rrsets and their rrs, and the ldns_rr - * records in the sets - * - * \param[in] rrsets the data structure to free - */ -void ldns_dnssec_rrsets_deep_free(ldns_dnssec_rrsets *rrsets); - -/** - * Returns the rr type of the rrset (that is head of the given list) - * - * \param[in] rrsets the rrset to get the type of - * \return the rr type - */ -ldns_rr_type ldns_dnssec_rrsets_type(const ldns_dnssec_rrsets *rrsets); - -/** - * Sets the RR type of the rrset (that is head of the given list) - * - * \param[in] rrsets the rrset to set the type of - * \param[in] type the type to set - * \return LDNS_STATUS_OK on success - */ -ldns_status ldns_dnssec_rrsets_set_type(ldns_dnssec_rrsets *rrsets, - ldns_rr_type type); - -/** - * Add an ldns_rr to the corresponding RRset in the given list of RRsets. - * If it is not present, add it as a new RRset with 1 record. - * - * \param[in] rrsets the list of rrsets to add the RR to - * \param[in] rr the rr to add to the list of rrsets - * \return LDNS_STATUS_OK on success - */ -ldns_status ldns_dnssec_rrsets_add_rr(ldns_dnssec_rrsets *rrsets, ldns_rr *rr); - -/** - * Print the given list of rrsets to the fiven file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] rrsets the list of RRsets to print - * \param[in] follow if set to false, only print the first RRset - */ -void ldns_dnssec_rrsets_print(FILE *out, - const ldns_dnssec_rrsets *rrsets, - bool follow); - -/** - * Print the given list of rrsets to the fiven file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] fmt the format of the textual representation - * \param[in] rrsets the list of RRsets to print - * \param[in] follow if set to false, only print the first RRset - */ -void ldns_dnssec_rrsets_print_fmt(FILE *out, - const ldns_output_format *fmt, - const ldns_dnssec_rrsets *rrsets, - bool follow); - - -/** - * Create a new data structure for a dnssec name - * \return the allocated structure - */ -ldns_dnssec_name *ldns_dnssec_name_new(void); - -/** - * Create a new data structure for a dnssec name for the given RR - * - * \param[in] rr the RR to derive properties from, and to add to the name - */ -ldns_dnssec_name *ldns_dnssec_name_new_frm_rr(ldns_rr *rr); - -/** - * Frees the name structure and its rrs and rrsets. - * Individual ldns_rr records therein are not freed - * - * \param[in] name the structure to free - */ -void ldns_dnssec_name_free(ldns_dnssec_name *name); - -/** - * Frees the name structure and its rrs and rrsets. - * Individual ldns_rr records contained in the name are also freed - * - * \param[in] name the structure to free - */ -void ldns_dnssec_name_deep_free(ldns_dnssec_name *name); - -/** - * Returns the domain name of the given dnssec_name structure - * - * \param[in] name the dnssec name to get the domain name from - * \return the domain name - */ -ldns_rdf *ldns_dnssec_name_name(const ldns_dnssec_name *name); - - -/** - * Sets the domain name of the given dnssec_name structure - * - * \param[in] name the dnssec name to set the domain name of - * \param[in] dname the domain name to set it to. This data is *not* copied. - */ -void ldns_dnssec_name_set_name(ldns_dnssec_name *name, - ldns_rdf *dname); -/** - * Returns if dnssec_name structure is marked as glue. - * The ldns_dnssec_zone_mark_glue() function has to be called on a zone before - * using this function. - * Only names that have only glue rrsets will be marked. - * Names that have other occluded rrsets and names containing glue on the - * delegation point will NOT be marked! - * - * \param[in] name the dnssec name to get the domain name from - * \return true if the structure is marked as glue, false otherwise. - */ -bool ldns_dnssec_name_is_glue(const ldns_dnssec_name *name); - -/** - * Sets the NSEC(3) RR of the given dnssec_name structure - * - * \param[in] name the dnssec name to set the domain name of - * \param[in] nsec the nsec rr to set it to. This data is *not* copied. - */ -void ldns_dnssec_name_set_nsec(ldns_dnssec_name *name, ldns_rr *nsec); - -/** - * Compares the domain names of the two arguments in their - * canonical ordening. - * - * \param[in] a The first dnssec_name to compare - * \param[in] b The second dnssec_name to compare - * \return -1 if the domain name of a comes before that of b in canonical - * ordening, 1 if it is the other way around, and 0 if they are - * equal - */ -int ldns_dnssec_name_cmp(const void *a, const void *b); - -/** - * Inserts the given rr at the right place in the current dnssec_name - * No checking is done whether the name matches - * - * \param[in] name The ldns_dnssec_name to add the RR to - * \param[in] rr The RR to add - * \return LDNS_STATUS_OK on success, error code otherwise - */ -ldns_status ldns_dnssec_name_add_rr(ldns_dnssec_name *name, - ldns_rr *rr); - -/** - * Find the RRset with the given type in within this name structure - * - * \param[in] name the name to find the RRset in - * \param[in] type the type of the RRset to find - * \return the RRset, or NULL if not present - */ -ldns_dnssec_rrsets *ldns_dnssec_name_find_rrset(const ldns_dnssec_name *name, - ldns_rr_type type); - -/** - * Find the RRset with the given name and type in the zone - * - * \param[in] zone the zone structure to find the RRset in - * \param[in] dname the domain name of the RRset to find - * \param[in] type the type of the RRset to find - * \return the RRset, or NULL if not present - */ -ldns_dnssec_rrsets *ldns_dnssec_zone_find_rrset(const ldns_dnssec_zone *zone, - const ldns_rdf *dname, - ldns_rr_type type); - -/** - * Prints the RRs in the dnssec name structure to the given - * file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] name the name structure to print the contents of - */ -void ldns_dnssec_name_print(FILE *out, const ldns_dnssec_name *name); - -/** - * Prints the RRs in the dnssec name structure to the given - * file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] fmt the format of the textual representation - * \param[in] name the name structure to print the contents of - */ -void ldns_dnssec_name_print_fmt(FILE *out, - const ldns_output_format *fmt, const ldns_dnssec_name *name); - -/** - * Creates a new dnssec_zone structure - * \return the allocated structure - */ -ldns_dnssec_zone *ldns_dnssec_zone_new(void); - -/** - * Create a new dnssec zone from a file. - * \param[out] z the new zone - * \param[in] *fp the filepointer to use - * \param[in] *origin the zones' origin - * \param[in] c default class to use (IN) - * \param[in] ttl default ttl to use - * - * \return ldns_status mesg with an error or LDNS_STATUS_OK - */ -ldns_status ldns_dnssec_zone_new_frm_fp(ldns_dnssec_zone** z, FILE* fp, - const ldns_rdf* origin, uint32_t ttl, ldns_rr_class c); - -/** - * Create a new dnssec zone from a file, keep track of the line numbering - * \param[out] z the new zone - * \param[in] *fp the filepointer to use - * \param[in] *origin the zones' origin - * \param[in] ttl default ttl to use - * \param[in] c default class to use (IN) - * \param[out] line_nr used for error msg, to get to the line number - * - * \return ldns_status mesg with an error or LDNS_STATUS_OK - */ -ldns_status ldns_dnssec_zone_new_frm_fp_l(ldns_dnssec_zone** z, FILE* fp, - const ldns_rdf* origin, uint32_t ttl, ldns_rr_class c, int* line_nr); - -/** - * Frees the given zone structure, and its rbtree of dnssec_names - * Individual ldns_rr RRs within those names are *not* freed - * \param[in] *zone the zone to free - */ -void ldns_dnssec_zone_free(ldns_dnssec_zone *zone); - -/** - * Frees the given zone structure, and its rbtree of dnssec_names - * Individual ldns_rr RRs within those names are also freed - * \param[in] *zone the zone to free - */ -void ldns_dnssec_zone_deep_free(ldns_dnssec_zone *zone); - -/** - * Adds the given RR to the zone. - * It find whether there is a dnssec_name with that name present. - * If so, add it to that, if not create a new one. - * Special handling of NSEC and RRSIG provided - * - * \param[in] zone the zone to add the RR to - * \param[in] rr The RR to add - * \return LDNS_STATUS_OK on success, an error code otherwise - */ -ldns_status ldns_dnssec_zone_add_rr(ldns_dnssec_zone *zone, - ldns_rr *rr); - -/** - * Prints the rbtree of ldns_dnssec_name structures to the file descriptor - * - * \param[in] out the file descriptor to print the names to - * \param[in] tree the tree of ldns_dnssec_name structures to print - * \param[in] print_soa if true, print SOA records, if false, skip them - */ -void ldns_dnssec_zone_names_print(FILE *out, const ldns_rbtree_t *tree, bool print_soa); - -/** - * Prints the rbtree of ldns_dnssec_name structures to the file descriptor - * - * \param[in] out the file descriptor to print the names to - * \param[in] fmt the format of the textual representation - * \param[in] tree the tree of ldns_dnssec_name structures to print - * \param[in] print_soa if true, print SOA records, if false, skip them - */ -void ldns_dnssec_zone_names_print_fmt(FILE *out, const ldns_output_format *fmt, - const ldns_rbtree_t *tree, bool print_soa); - -/** - * Prints the complete zone to the given file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] zone the dnssec_zone to print - */ -void ldns_dnssec_zone_print(FILE *out, const ldns_dnssec_zone *zone); - -/** - * Prints the complete zone to the given file descriptor - * - * \param[in] out the file descriptor to print to - * \param[in] fmt the format of the textual representation - * \param[in] zone the dnssec_zone to print - */ -void ldns_dnssec_zone_print_fmt(FILE *out, - const ldns_output_format *fmt, const ldns_dnssec_zone *zone); - -/** - * Adds explicit dnssec_name structures for the empty nonterminals - * in this zone. (this is needed for NSEC3 generation) - * - * \param[in] zone the zone to check for empty nonterminals - * return LDNS_STATUS_OK on success. - */ -ldns_status ldns_dnssec_zone_add_empty_nonterminals(ldns_dnssec_zone *zone); - -/** - * If a NSEC3PARAM is available in the apex, walks the zone and returns true - * on the first optout nsec3. - * - * \param[in] zone the zone to check for nsec3 optout records - * return true when the zone has at least one nsec3 optout record. - */ -bool ldns_dnssec_zone_is_nsec3_optout(const ldns_dnssec_zone* zone); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/ldns/ldns/duration.h b/ldns/ldns/duration.h deleted file mode 100644 index e6282ac..0000000 --- a/ldns/ldns/duration.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * $Id: duration.h 4341 2011-01-31 15:21:09Z matthijs $ - * - * Copyright (c) 2009 NLNet Labs. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER - * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * - * This file is copied from the OpenDNSSEC source repository - * and only slightly adapted to make it fit. - */ - -/** - * - * Durations. - */ - -#ifndef LDNS_DURATION_H -#define LDNS_DURATION_H - -#include <stdint.h> -#include <time.h> - -/** - * Duration. - * - */ -typedef struct ldns_duration_struct ldns_duration_type; -struct ldns_duration_struct -{ - time_t years; - time_t months; - time_t weeks; - time_t days; - time_t hours; - time_t minutes; - time_t seconds; -}; - -/** - * Create a new 'instant' duration. - * \return ldns_duration_type* created duration - * - */ -ldns_duration_type* ldns_duration_create(void); - -/** - * Compare durations. - * \param[in] d1 one duration - * \param[in] d2 another duration - * \return int 0 if equal, -1 if d1 < d2, 1 if d2 < d1 - * - */ -int ldns_duration_compare(const ldns_duration_type* d1, const ldns_duration_type* d2); - -/** - * Create a duration from string. - * \param[in] str string-format duration - * \return ldns_duration_type* created duration - * - */ -ldns_duration_type* ldns_duration_create_from_string(const char* str); - -/** - * Convert a duration to a string. - * \param[in] duration duration to be converted - * \return char* string-format duration - * - */ -char* ldns_duration2string(const ldns_duration_type* duration); - -/** - * Convert a duration to a time. - * \param[in] duration duration to be converted - * \return time_t time-format duration - * - */ -time_t ldns_duration2time(const ldns_duration_type* duration); - -/** - * Clean up duration. - * \param[in] duration duration to be cleaned up - * - */ -void ldns_duration_cleanup(ldns_duration_type* duration); - -#endif /* LDNS_DURATION_H */ diff --git a/ldns/ldns/error.h b/ldns/ldns/error.h deleted file mode 100644 index 15f49a2..0000000 --- a/ldns/ldns/error.h +++ /dev/null @@ -1,150 +0,0 @@ -/** - * \file error.h - * - * Defines error numbers and functions to translate those to a readable string. - * - */ - -/** - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -#ifndef LDNS_ERROR_H -#define LDNS_ERROR_H - -#include <ldns/util.h> - -#ifdef __cplusplus -extern "C" { -#endif - -enum ldns_enum_status { - LDNS_STATUS_OK, - LDNS_STATUS_EMPTY_LABEL, - LDNS_STATUS_LABEL_OVERFLOW, - LDNS_STATUS_DOMAINNAME_OVERFLOW, - LDNS_STATUS_DOMAINNAME_UNDERFLOW, - LDNS_STATUS_DDD_OVERFLOW, - LDNS_STATUS_PACKET_OVERFLOW, - LDNS_STATUS_INVALID_POINTER, - LDNS_STATUS_MEM_ERR, - LDNS_STATUS_INTERNAL_ERR, - LDNS_STATUS_SSL_ERR, - LDNS_STATUS_ERR, - LDNS_STATUS_INVALID_INT, - LDNS_STATUS_INVALID_IP4, - LDNS_STATUS_INVALID_IP6, - LDNS_STATUS_INVALID_STR, - LDNS_STATUS_INVALID_B32_EXT, - LDNS_STATUS_INVALID_B64, - LDNS_STATUS_INVALID_HEX, - LDNS_STATUS_INVALID_TIME, - LDNS_STATUS_NETWORK_ERR, - LDNS_STATUS_ADDRESS_ERR, - LDNS_STATUS_FILE_ERR, - LDNS_STATUS_UNKNOWN_INET, - LDNS_STATUS_NOT_IMPL, - LDNS_STATUS_NULL, - LDNS_STATUS_CRYPTO_UNKNOWN_ALGO, - LDNS_STATUS_CRYPTO_ALGO_NOT_IMPL, - LDNS_STATUS_CRYPTO_NO_RRSIG, - LDNS_STATUS_CRYPTO_NO_DNSKEY, - LDNS_STATUS_CRYPTO_NO_TRUSTED_DNSKEY, - LDNS_STATUS_CRYPTO_NO_DS, - LDNS_STATUS_CRYPTO_NO_TRUSTED_DS, - LDNS_STATUS_CRYPTO_NO_MATCHING_KEYTAG_DNSKEY, - LDNS_STATUS_CRYPTO_VALIDATED, - LDNS_STATUS_CRYPTO_BOGUS, - LDNS_STATUS_CRYPTO_SIG_EXPIRED, - LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED, - LDNS_STATUS_CRYPTO_TSIG_BOGUS, - LDNS_STATUS_CRYPTO_TSIG_ERR, - LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION, - LDNS_STATUS_CRYPTO_TYPE_COVERED_ERR, - LDNS_STATUS_ENGINE_KEY_NOT_LOADED, - LDNS_STATUS_NSEC3_ERR, - LDNS_STATUS_RES_NO_NS, - LDNS_STATUS_RES_QUERY, - LDNS_STATUS_WIRE_INCOMPLETE_HEADER, - LDNS_STATUS_WIRE_INCOMPLETE_QUESTION, - LDNS_STATUS_WIRE_INCOMPLETE_ANSWER, - LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY, - LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL, - LDNS_STATUS_NO_DATA, - LDNS_STATUS_CERT_BAD_ALGORITHM, - LDNS_STATUS_SYNTAX_TYPE_ERR, - LDNS_STATUS_SYNTAX_CLASS_ERR, - LDNS_STATUS_SYNTAX_TTL_ERR, - LDNS_STATUS_SYNTAX_INCLUDE_ERR_NOTIMPL, - LDNS_STATUS_SYNTAX_RDATA_ERR, - LDNS_STATUS_SYNTAX_DNAME_ERR, - LDNS_STATUS_SYNTAX_VERSION_ERR, - LDNS_STATUS_SYNTAX_ALG_ERR, - LDNS_STATUS_SYNTAX_KEYWORD_ERR, - LDNS_STATUS_SYNTAX_TTL, - LDNS_STATUS_SYNTAX_ORIGIN, - LDNS_STATUS_SYNTAX_INCLUDE, - LDNS_STATUS_SYNTAX_EMPTY, - LDNS_STATUS_SYNTAX_ITERATIONS_OVERFLOW, - LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR, - LDNS_STATUS_SYNTAX_INTEGER_OVERFLOW, - LDNS_STATUS_SYNTAX_BAD_ESCAPE, - LDNS_STATUS_SOCKET_ERROR, - LDNS_STATUS_SYNTAX_ERR, - LDNS_STATUS_DNSSEC_EXISTENCE_DENIED, - LDNS_STATUS_DNSSEC_NSEC_RR_NOT_COVERED, - LDNS_STATUS_DNSSEC_NSEC_WILDCARD_NOT_COVERED, - LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND, - LDNS_STATUS_MISSING_RDATA_FIELDS_RRSIG, - LDNS_STATUS_MISSING_RDATA_FIELDS_KEY, - LDNS_STATUS_CRYPTO_SIG_EXPIRED_WITHIN_MARGIN, - LDNS_STATUS_CRYPTO_SIG_NOT_INCEPTED_WITHIN_MARGIN, - LDNS_STATUS_DANE_STATUS_MESSAGES, - LDNS_STATUS_DANE_UNKNOWN_CERTIFICATE_USAGE, - LDNS_STATUS_DANE_UNKNOWN_SELECTOR, - LDNS_STATUS_DANE_UNKNOWN_MATCHING_TYPE, - LDNS_STATUS_DANE_UNKNOWN_PROTOCOL, - LDNS_STATUS_DANE_UNKNOWN_TRANSPORT, - LDNS_STATUS_DANE_MISSING_EXTRA_CERTS, - LDNS_STATUS_DANE_EXTRA_CERTS_NOT_USED, - LDNS_STATUS_DANE_OFFSET_OUT_OF_RANGE, - LDNS_STATUS_DANE_INSECURE, - LDNS_STATUS_DANE_BOGUS, - LDNS_STATUS_DANE_TLSA_DID_NOT_MATCH, - LDNS_STATUS_DANE_NON_CA_CERTIFICATE, - LDNS_STATUS_DANE_PKIX_DID_NOT_VALIDATE, - LDNS_STATUS_DANE_PKIX_NO_SELF_SIGNED_TRUST_ANCHOR, - LDNS_STATUS_EXISTS_ERR, - LDNS_STATUS_INVALID_ILNP64, - LDNS_STATUS_INVALID_EUI48, - LDNS_STATUS_INVALID_EUI64, - LDNS_STATUS_WIRE_RDATA_ERR, - LDNS_STATUS_INVALID_TAG, - LDNS_STATUS_TYPE_NOT_IN_BITMAP, - LDNS_STATUS_INVALID_RDF_TYPE, - LDNS_STATUS_RDATA_OVERFLOW, - LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR, - LDNS_STATUS_NSEC3_DOMAINNAME_OVERFLOW, - LDNS_STATUS_DANE_NEED_OPENSSL_GE_1_1_FOR_DANE_TA -}; -typedef enum ldns_enum_status ldns_status; - -extern ldns_lookup_table ldns_error_str[]; - -/** - * look up a descriptive text by each error. This function - * could use a better name - * \param[in] err ldns_status number - * \return the string for that error - */ -const char *ldns_get_errorstr_by_id(ldns_status err); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_ERROR_H */ diff --git a/ldns/ldns/higher.h b/ldns/ldns/higher.h deleted file mode 100644 index 59c2802..0000000 --- a/ldns/ldns/higher.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * \file higher.h - * - * Specifies some higher level functions that could - * be useful for certain applications - */ - -/* - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -#ifndef LDNS_HIGHER_H -#define LDNS_HIGHER_H - -#include <ldns/resolver.h> -#include <ldns/rdata.h> -#include <ldns/rr.h> -#include <ldns/host2str.h> -#include <ldns/tsig.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Ask the resolver about name - * and return all address records - * \param[in] r the resolver to use - * \param[in] name the name to look for - * \param[in] c the class to use - * \param[in] flags give some optional flags to the query - */ -ldns_rr_list *ldns_get_rr_list_addr_by_name(ldns_resolver *r, const ldns_rdf *name, ldns_rr_class c, uint16_t flags); - -/** - * ask the resolver about the address - * and return the name - * \param[in] r the resolver to use - * \param[in] addr the addr to look for - * \param[in] c the class to use - * \param[in] flags give some optional flags to the query - */ -ldns_rr_list *ldns_get_rr_list_name_by_addr(ldns_resolver *r, const ldns_rdf *addr, ldns_rr_class c, uint16_t flags); - -/** - * wade through fp (a /etc/hosts like file) - * and return a rr_list containing all the - * defined hosts in there - * \param[in] fp the file pointer to use - * \return ldns_rr_list * with the names - */ -ldns_rr_list *ldns_get_rr_list_hosts_frm_fp(FILE *fp); - -/** - * wade through fp (a /etc/hosts like file) - * and return a rr_list containing all the - * defined hosts in there - * \param[in] fp the file pointer to use - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return ldns_rr_list * with the names - */ -ldns_rr_list *ldns_get_rr_list_hosts_frm_fp_l(FILE *fp, int *line_nr); - -/** - * wade through fp (a /etc/hosts like file) - * and return a rr_list containing all the - * defined hosts in there - * \param[in] filename the filename to use (NULL for /etc/hosts) - * \return ldns_rr_list * with the names - */ -ldns_rr_list *ldns_get_rr_list_hosts_frm_file(char *filename); - -/** - * This function is a wrapper function for ldns_get_rr_list_name_by_addr - * and ldns_get_rr_list_addr_by_name. It's name is from the getaddrinfo() - * library call. It tries to mimic that call, but without the lowlevel - * stuff. - * \param[in] res The resolver. If this value is NULL then a resolver will - * be created by ldns_getaddrinfo. - * \param[in] node the name or ip address to look up - * \param[in] c the class to look in - * \param[out] list put the found RR's in this list - * \return the number of RR found. - */ -uint16_t ldns_getaddrinfo(ldns_resolver *res, const ldns_rdf *node, ldns_rr_class c, ldns_rr_list **list); - -/** - * Check if t is enumerated in the nsec type rdata - * \param[in] nsec the NSEC Record to look in - * \param[in] t the type to check for - * \return true when t is found, otherwise return false - */ -bool ldns_nsec_type_check(const ldns_rr *nsec, ldns_rr_type t); - -/** - * Print a number of rdf's of the RR. The rdfnum-list must - * be ended by -1, otherwise unpredictable things might happen. - * rdfs may be printed multiple times - * \param[in] fp FILE * to write to - * \param[in] r RR to write - * \param[in] rdfnum a list of rdf to print. - */ -void ldns_print_rr_rdf(FILE *fp, ldns_rr *r, int rdfnum, ...); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_HIGHER_H */ diff --git a/ldns/ldns/host2str.h b/ldns/ldns/host2str.h deleted file mode 100644 index 4b443d0..0000000 --- a/ldns/ldns/host2str.h +++ /dev/null @@ -1,902 +0,0 @@ -/** - * host2str.h - txt presentation of RRs - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains functions to translate the main structures to their text - * representation, as well as functions to print them. - */ - -#ifndef LDNS_HOST2STR_H -#define LDNS_HOST2STR_H - -#include <ldns/common.h> -#include <ldns/error.h> -#include <ldns/rr.h> -#include <ldns/rdata.h> -#include <ldns/packet.h> -#include <ldns/buffer.h> -#include <ldns/resolver.h> -#include <ldns/zone.h> -#include <ctype.h> - -#include "ldns/util.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_APL_IP4 1 -#define LDNS_APL_IP6 2 -#define LDNS_APL_MASK 0x7f -#define LDNS_APL_NEGATION 0x80 - -/** - * Represent a NULL pointer (instead of a pointer to a ldns_rr as "; (null)" - * as opposed to outputting nothing at all in such a case. - */ -/* Flag Name Flag Nr. Has data associated - ---------------------------------------------------------------------*/ -#define LDNS_COMMENT_NULLS (1 << 0) -/** Show key id with DNSKEY RR's as comment */ -#define LDNS_COMMENT_KEY_ID (1 << 1) -/** Show if a DNSKEY is a ZSK or KSK as comment */ -#define LDNS_COMMENT_KEY_TYPE (1 << 2) -/** Show DNSKEY key size as comment */ -#define LDNS_COMMENT_KEY_SIZE (1 << 3) -/** Provide bubblebabble representation for DS RR's as comment */ -#define LDNS_COMMENT_BUBBLEBABBLE (1 << 4) -/** Show when a NSEC3 RR has the optout flag set as comment */ -#define LDNS_COMMENT_FLAGS (1 << 5) -/** Show the unhashed owner and next owner names for NSEC3 RR's as comment */ -#define LDNS_COMMENT_NSEC3_CHAIN (1 << 6) /* yes */ -/** Print mark up */ -#define LDNS_COMMENT_LAYOUT (1 << 7) -/** Also comment KEY_ID with RRSIGS **/ -#define LDNS_COMMENT_RRSIGS (1 << 8) -#define LDNS_FMT_ZEROIZE_RRSIGS (1 << 9) -#define LDNS_FMT_PAD_SOA_SERIAL (1 << 10) -#define LDNS_FMT_RFC3597 (1 << 11) /* yes */ - -#define LDNS_FMT_FLAGS_WITH_DATA 2 - -/** Show key id, type and size as comment for DNSKEY RR's */ -#define LDNS_COMMENT_KEY (LDNS_COMMENT_KEY_ID \ - |LDNS_COMMENT_KEY_TYPE\ - |LDNS_COMMENT_KEY_SIZE) - -/** - * Output format specifier - * - * Determines how Packets, Resource Records and Resource record data fiels are - * formatted when printing or converting to string. - * Currently it is only used to specify what aspects of a Resource Record are - * annotated in the comment section of the textual representation the record. - * This is speciefed with flags and potential exra data (such as for example - * a lookup map of hashes to real names for annotation NSEC3 records). - */ -struct ldns_struct_output_format -{ - /** Specification of how RR's should be formatted in text */ - int flags; - /** Potential extra data to be used with formatting RR's in text */ - void *data; -}; -typedef struct ldns_struct_output_format ldns_output_format; - -/** - * Output format struct with additional data for flags that use them. - * This struct may not be initialized directly. Use ldns_output_format_init - * to initialize. - */ -struct ldns_struct_output_format_storage -{ int flags; - ldns_rbtree_t* hashmap; /* for LDNS_COMMENT_NSEC3_CHAIN */ - ldns_rdf* bitmap; /* for LDNS_FMT_RFC3597 */ -}; -typedef struct ldns_struct_output_format_storage ldns_output_format_storage; - -/** - * Standard output format record that disables commenting in the textual - * representation of Resource Records completely. - */ -extern const ldns_output_format *ldns_output_format_nocomments; -/** - * Standard output format record that annotated only DNSKEY RR's with commenti - * text. - */ -extern const ldns_output_format *ldns_output_format_onlykeyids; -/** - * The default output format record. Same as ldns_output_format_onlykeyids. - */ -extern const ldns_output_format *ldns_output_format_default; -/** - * Standard output format record that shows all DNSKEY related information in - * the comment text, plus the optout flag when set with NSEC3's, plus the - * bubblebabble representation of DS RR's. - */ -extern const ldns_output_format *ldns_output_format_bubblebabble; - -/** - * Initialize output format storage to the default value. - * \param[in] fmt A reference to an output_format_ storage struct - * \return The initialized storage struct typecasted to ldns_output_format - */ -INLINE -ldns_output_format* ldns_output_format_init(ldns_output_format_storage* fmt) { - fmt->flags = ldns_output_format_default->flags; - fmt->hashmap = NULL; - fmt->bitmap = NULL; - return (ldns_output_format*)fmt; -} - -/** - * Set an output format flag. - */ -INLINE void ldns_output_format_set(ldns_output_format* fmt, int flag) { - fmt->flags |= flag; -} - -/** - * Clear an output format flag. - */ -INLINE void ldns_output_format_clear(ldns_output_format* fmt, int flag) { - fmt->flags &= !flag; -} - -/** - * Makes sure the LDNS_FMT_RFC3597 is set in the output format. - * Marks the type to be printed in RFC3597 format. - * /param[in] fmt the output format to update - * /param[in] the type to be printed in RFC3597 format - * /return LDNS_STATUS_OK on success - */ -ldns_status -ldns_output_format_set_type(ldns_output_format* fmt, ldns_rr_type type); - -/** - * Makes sure the LDNS_FMT_RFC3597 is set in the output format. - * Marks the type to not be printed in RFC3597 format. When no other types - * have been marked before, all known types (except the given one) will be - * marked for printing in RFC3597 format. - * /param[in] fmt the output format to update - * /param[in] the type not to be printed in RFC3597 format - * /return LDNS_STATUS_OK on success - */ -ldns_status -ldns_output_format_clear_type(ldns_output_format* fmt, ldns_rr_type type); - -/** - * Converts an ldns packet opcode value to its mnemonic, and adds that - * to the output buffer - * \param[in] *output the buffer to add the data to - * \param[in] opcode to find the string representation of - * \return LDNS_STATUS_OK on success, or a buffer failure mode on error - */ -ldns_status -ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode); - -/** - * Converts an ldns packet rcode value to its mnemonic, and adds that - * to the output buffer - * \param[in] *output the buffer to add the data to - * \param[in] rcode to find the string representation of - * \return LDNS_STATUS_OK on success, or a buffer failure mode on error - */ -ldns_status -ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode); - -/** - * Converts an ldns algorithm type to its mnemonic, and adds that - * to the output buffer - * \param[in] *output the buffer to add the data to - * \param[in] algorithm to find the string representation of - * \return LDNS_STATUS_OK on success, or a buffer failure mode on error - */ -ldns_status -ldns_algorithm2buffer_str(ldns_buffer *output, - ldns_algorithm algorithm); - -/** - * Converts an ldns certificate algorithm type to its mnemonic, - * and adds that to the output buffer - * \param[in] *output the buffer to add the data to - * \param[in] cert_algorithm to find the string representation of - * \return LDNS_STATUS_OK on success, or a buffer failure mode on error - */ -ldns_status -ldns_cert_algorithm2buffer_str(ldns_buffer *output, - ldns_cert_algorithm cert_algorithm); - - -/** - * Converts a packet opcode to its mnemonic and returns that as - * an allocated null-terminated string. - * Remember to free it. - * - * \param[in] opcode the opcode to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt_opcode2str(ldns_pkt_opcode opcode); - -/** - * Converts a packet rcode to its mnemonic and returns that as - * an allocated null-terminated string. - * Remember to free it. - * - * \param[in] rcode the rcode to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt_rcode2str(ldns_pkt_rcode rcode); - -/** - * Converts a signing algorithms to its mnemonic and returns that as - * an allocated null-terminated string. - * Remember to free it. - * - * \param[in] algorithm the algorithm to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt_algorithm2str(ldns_algorithm algorithm); - -/** - * Converts a cert algorithm to its mnemonic and returns that as - * an allocated null-terminated string. - * Remember to free it. - * - * \param[in] cert_algorithm to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm); - -/** - * Converts an LDNS_RDF_TYPE_A rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_AAAA rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_STR rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_B64 rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_B32_EXT rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_HEX rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_TYPE rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_CLASS rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_ALG rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an ldns_rr_type value to its string representation, - * and places it in the given buffer - * \param[in] *output The buffer to add the data to - * \param[in] type the ldns_rr_type to convert - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rr_type2buffer_str(ldns_buffer *output, - const ldns_rr_type type); - -/** - * Converts an ldns_rr_type value to its string representation, - * and returns that string. For unknown types, the string - * "TYPE<id>" is returned. This function allocates data that must be - * freed by the caller - * \param[in] type the ldns_rr_type to convert - * \return a newly allocated string - */ -char *ldns_rr_type2str(const ldns_rr_type type); - -/** - * Converts an ldns_rr_class value to its string representation, - * and places it in the given buffer - * \param[in] *output The buffer to add the data to - * \param[in] klass the ldns_rr_class to convert - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rr_class2buffer_str(ldns_buffer *output, - const ldns_rr_class klass); - -/** - * Converts an ldns_rr_class value to its string representation, - * and returns that string. For unknown types, the string - * "CLASS<id>" is returned. This function allocates data that must be - * freed by the caller - * \param[in] klass the ldns_rr_class to convert - * \return a newly allocated string - */ -char *ldns_rr_class2str(const ldns_rr_class klass); - - -/** - * Converts an LDNS_RDF_TYPE_CERT rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_LOC rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_UNKNOWN rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_NSAP rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_ATMA rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_WKS rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_NSEC rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_PERIOD rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_TSIGTIME rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_tsigtime(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_APL rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_INT16_DATA rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_IPSECKEY rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts the data in the rdata field to presentation - * format (as char *) and appends it to the given buffer - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] rdf the pointer to the rdafa field containing the data - * \return status - */ -ldns_status ldns_rdf2buffer_str(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts the data in the resource record to presentation - * format (as char *) and appends it to the given buffer. - * The presentation format of DNSKEY record is annotated with comments giving - * the id, type and size of the key. - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] rr the pointer to the rr field to convert - * \return status - */ -ldns_status ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr); - -/** - * Converts the data in the resource record to presentation - * format (as char *) and appends it to the given buffer. - * The presentation format is annotated with comments giving - * additional information on the record. - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] fmt how to format the textual representation of the - * resource record. - * \param[in] rr the pointer to the rr field to convert - * \return status - */ -ldns_status ldns_rr2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_rr *rr); - -/** - * Converts the data in the DNS packet to presentation - * format (as char *) and appends it to the given buffer - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] pkt the pointer to the packet to convert - * \return status - */ -ldns_status ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt); - -/** - * Converts the data in the DNS packet to presentation - * format (as char *) and appends it to the given buffer - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] fmt how to format the textual representation of the packet - * \param[in] pkt the pointer to the packet to convert - * \return status - */ -ldns_status ldns_pkt2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_pkt *pkt); - -/** - * Converts an LDNS_RDF_TYPE_NSEC3_SALT rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf); - - -/** - * Converts the data in the DNS packet to presentation - * format (as char *) and appends it to the given buffer - * - * \param[in] output pointer to the buffer to append the data to - * \param[in] k the pointer to the private key to convert - * \return status - */ -ldns_status ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k); - -/** - * Converts an LDNS_RDF_TYPE_INT8 rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_INT16 rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_INT32 rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_TIME rdata element to string format and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_ILNP64 rdata element to 4 hexadecimal numbers - * separated by colons and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_ilnp64(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_EUI48 rdata element to 6 hexadecimal numbers - * separated by dashes and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_eui48(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_EUI64 rdata element to 8 hexadecimal numbers - * separated by dashes and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_eui64(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Adds the LDNS_RDF_TYPE_TAG rdata to the output buffer, - * provided it contains only alphanumeric characters. - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_tag(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Adds the LDNS_RDF_TYPE_LONG_STR rdata to the output buffer, in-between - * double quotes and all non printable characters properly escaped. - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_long_str(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_HIP rdata element to presentation format for - * the algorithm, HIT and Public Key and adds it the output buffer . - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_hip(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Converts an LDNS_RDF_TYPE_AMTRELAY rdata element to presentation format for - * the precedence, D-bit, type and relay and adds it to the output buffer - * \param[in] *rdf The rdata to convert - * \param[in] *output The buffer to add the data to - * \return LDNS_STATUS_OK on success, and error status on failure - */ -ldns_status ldns_rdf2buffer_str_amtrelay(ldns_buffer *output, - const ldns_rdf *rdf); - - -/** - * Converts the data in the rdata field to presentation format and - * returns that as a char *. - * Remember to free it. - * - * \param[in] rdf The rdata field to convert - * \return null terminated char * data, or NULL on error - */ -char *ldns_rdf2str(const ldns_rdf *rdf); - -/** - * Converts the data in the resource record to presentation format and - * returns that as a char *. - * Remember to free it. - * - * \param[in] rr The rdata field to convert - * \return null terminated char * data, or NULL on error - */ -char *ldns_rr2str(const ldns_rr *rr); - -/** - * Converts the data in the resource record to presentation format and - * returns that as a char *. - * Remember to free it. - * - * \param[in] fmt how to format the resource record - * \param[in] rr The rdata field to convert - * \return null terminated char * data, or NULL on error - */ -char *ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr); - -/** - * Converts the data in the DNS packet to presentation format and - * returns that as a char *. - * Remember to free it. - * - * \param[in] pkt The rdata field to convert - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt2str(const ldns_pkt *pkt); - -/** - * Converts the data in the DNS packet to presentation format and - * returns that as a char *. - * Remember to free it. - * - * \param[in] fmt how to format the packet - * \param[in] pkt The rdata field to convert - * \return null terminated char * data, or NULL on error - */ -char *ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt); - -/** - * Converts a private key to the test presentation fmt and - * returns that as a char *. - * Remember to free it. - * - * \param[in] k the key to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_key2str(const ldns_key *k); - -/** - * Converts a list of resource records to presentation format - * and returns that as a char *. - * Remember to free it. - * - * \param[in] rr_list the rr_list to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_rr_list2str(const ldns_rr_list *rr_list); - -/** - * Converts a list of resource records to presentation format - * and returns that as a char *. - * Remember to free it. - * - * \param[in] fmt how to format the list of resource records - * \param[in] rr_list the rr_list to convert to text - * \return null terminated char * data, or NULL on error - */ -char *ldns_rr_list2str_fmt( - const ldns_output_format *fmt, const ldns_rr_list *rr_list); - -/** - * Returns a copy of the data in the buffer as a null terminated - * char * string. The returned string must be freed by the caller. - * The buffer must be in write modus and may thus not have been flipped. - * - * \param[in] buffer buffer containing char * data - * \return null terminated char * data, or NULL on error - */ -char *ldns_buffer2str(ldns_buffer *buffer); - -/** - * Exports and returns the data in the buffer as a null terminated - * char * string. The returned string must be freed by the caller. - * The buffer must be in write modus and may thus not have been flipped. - * The buffer is fixed after this function returns. - * - * \param[in] buffer buffer containing char * data - * \return null terminated char * data, or NULL on error - */ -char *ldns_buffer_export2str(ldns_buffer *buffer); - -/** - * Prints the data in the rdata field to the given file stream - * (in presentation format) - * - * \param[in] output the file stream to print to - * \param[in] rdf the rdata field to print - * \return void - */ -void ldns_rdf_print(FILE *output, const ldns_rdf *rdf); - -/** - * Prints the data in the resource record to the given file stream - * (in presentation format) - * - * \param[in] output the file stream to print to - * \param[in] rr the resource record to print - * \return void - */ -void ldns_rr_print(FILE *output, const ldns_rr *rr); - -/** - * Prints the data in the resource record to the given file stream - * (in presentation format) - * - * \param[in] output the file stream to print to - * \param[in] fmt format of the textual representation - * \param[in] rr the resource record to print - * \return void - */ -void ldns_rr_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_rr *rr); - -/** - * Prints the data in the DNS packet to the given file stream - * (in presentation format) - * - * \param[in] output the file stream to print to - * \param[in] pkt the packet to print - * \return void - */ -void ldns_pkt_print(FILE *output, const ldns_pkt *pkt); - -/** - * Prints the data in the DNS packet to the given file stream - * (in presentation format) - * - * \param[in] output the file stream to print to - * \param[in] fmt format of the textual representation - * \param[in] pkt the packet to print - * \return void - */ -void ldns_pkt_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_pkt *pkt); - -/** - * Converts a rr_list to presentation format and appends it to - * the output buffer - * \param[in] output the buffer to append output to - * \param[in] list the ldns_rr_list to print - * \return ldns_status - */ -ldns_status ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list); - -/** - * Converts a rr_list to presentation format and appends it to - * the output buffer - * \param[in] output the buffer to append output to - * \param[in] fmt format of the textual representation - * \param[in] list the ldns_rr_list to print - * \return ldns_status - */ -ldns_status ldns_rr_list2buffer_str_fmt(ldns_buffer *output, - const ldns_output_format *fmt, const ldns_rr_list *list); - -/** - * Converts the header of a packet to presentation format and appends it to - * the output buffer - * \param[in] output the buffer to append output to - * \param[in] pkt the packet to convert the header of - * \return ldns_status - */ -ldns_status ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt); - -/** - * print a rr_list to output - * \param[in] output the fd to print to - * \param[in] list the rr_list to print - */ -void ldns_rr_list_print(FILE *output, const ldns_rr_list *list); - -/** - * print a rr_list to output - * \param[in] output the fd to print to - * \param[in] fmt format of the textual representation - * \param[in] list the rr_list to print - */ -void ldns_rr_list_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_rr_list *list); - -/** - * Print a resolver (in sofar that is possible) state - * to output. - * \param[in] output the fd to print to - * \param[in] r the resolver to print - */ -void ldns_resolver_print(FILE *output, const ldns_resolver *r); - -/** - * Print a resolver (in sofar that is possible) state - * to output. - * \param[in] output the fd to print to - * \param[in] fmt format of the textual representation - * \param[in] r the resolver to print - */ -void ldns_resolver_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_resolver *r); - -/** - * Print a zone structure * to output. Note the SOA record - * is included in this output - * \param[in] output the fd to print to - * \param[in] z the zone to print - */ -void ldns_zone_print(FILE *output, const ldns_zone *z); - -/** - * Print a zone structure * to output. Note the SOA record - * is included in this output - * \param[in] output the fd to print to - * \param[in] fmt format of the textual representation - * \param[in] z the zone to print - */ -void ldns_zone_print_fmt(FILE *output, - const ldns_output_format *fmt, const ldns_zone *z); - -/** - * Print the ldns_rdf containing a dname to the buffer - * \param[in] output the buffer to print to - * \param[in] dname the dname to print - * \return ldns_status message if the printing succeeded - */ -ldns_status ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_HOST2STR_H */ diff --git a/ldns/ldns/host2wire.h b/ldns/ldns/host2wire.h deleted file mode 100644 index 94693cd..0000000 --- a/ldns/ldns/host2wire.h +++ /dev/null @@ -1,197 +0,0 @@ -/* - * host2wire.h - 2wire conversion routines - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains all functions to translate the main structures to wire format - */ - -#ifndef LDNS_HOST2WIRE_H -#define LDNS_HOST2WIRE_H - -#include <ldns/common.h> -#include <ldns/error.h> -#include <ldns/rr.h> -#include <ldns/rdata.h> -#include <ldns/packet.h> -#include <ldns/buffer.h> -#include <ctype.h> - -#include "ldns/util.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Copies the dname data to the buffer in wire format - * \param[out] *buffer buffer to append the result to - * \param[in] *name rdata dname to convert - * \return ldns_status - */ -ldns_status ldns_dname2buffer_wire(ldns_buffer *buffer, const ldns_rdf *name); - -/** - * Copies the dname data to the buffer in wire format - * \param[out] *buffer buffer to append the result to - * \param[in] *name rdata dname to convert - * \param[out] *compression_data data structure holding state for compression - * \return ldns_status - */ -ldns_status ldns_dname2buffer_wire_compress(ldns_buffer *buffer, const ldns_rdf *name, ldns_rbtree_t *compression_data); - -/** - * Copies the rdata data to the buffer in wire format - * \param[out] *output buffer to append the result to - * \param[in] *rdf rdata to convert - * \return ldns_status - */ -ldns_status ldns_rdf2buffer_wire(ldns_buffer *output, const ldns_rdf *rdf); - -/** - * Copies the rdata data to the buffer in wire format - * \param[out] *output buffer to append the result to - * \param[in] *rdf rdata to convert - * \param[out] *compression_data data structure holding state for compression - * \return ldns_status - */ -ldns_status ldns_rdf2buffer_wire_compress(ldns_buffer *output, const ldns_rdf *rdf, ldns_rbtree_t *compression_data); - -/** - * Copies the rdata data to the buffer in wire format - * If the rdata is a dname, the letters will be lowercased - * during the conversion - * \param[out] *output buffer to append the result to - * \param[in] *rdf rdata to convert - * \return ldns_status - */ -ldns_status ldns_rdf2buffer_wire_canonical(ldns_buffer *output, - const ldns_rdf *rdf); - -/** - * Copies the rr data to the buffer in wire format - * \param[out] *output buffer to append the result to - * \param[in] *rr resource record to convert - * \param[in] section the section in the packet this rr is supposed to be in - * (to determine whether to add rdata or not) - * \return ldns_status - */ -ldns_status ldns_rr2buffer_wire(ldns_buffer *output, - const ldns_rr *rr, - int section); - -/** - * Copies the rr data to the buffer in wire format while doing DNAME compression - * \param[out] *output buffer to append the result to - * \param[in] *rr resource record to convert - * \param[in] section the section in the packet this rr is supposed to be in - * (to determine whether to add rdata or not) - * \param[out] *compression_data data structure holding state information for compression - * \return ldns_status - */ -ldns_status ldns_rr2buffer_wire_compress(ldns_buffer *output, - const ldns_rr *rr, - int section, - ldns_rbtree_t *compression_data); - -/** - * Copies the rr data to the buffer in wire format, in canonical format - * according to RFC3597 (every dname in rdata fields of RR's mentioned in - * that RFC will be lowercased) - * \param[out] *output buffer to append the result to - * \param[in] *rr resource record to convert - * \param[in] section the section in the packet this rr is supposed to be in - * (to determine whether to add rdata or not) - * \return ldns_status - */ -ldns_status ldns_rr2buffer_wire_canonical(ldns_buffer *output, - const ldns_rr *rr, - int section); - - -/** - * Converts a rrsig to wireformat BUT EXCLUDE the rrsig rdata - * This is needed in DNSSEC verification - * \param[out] output buffer to append the result to - * \param[in] sigrr signature rr to operate on - * \return ldns_status - */ -ldns_status ldns_rrsig2buffer_wire(ldns_buffer *output, const ldns_rr *sigrr); - -/** - * Converts an rr's rdata to wireformat, while excluding - * the ownername and all the stuff before the rdata. - * This is needed in DNSSEC keytag calculation, the ds - * calcalution from the key and maybe elsewhere. - * - * \param[out] *output buffer where to put the result - * \param[in] *rr rr to operate on - * \return ldns_status - */ -ldns_status ldns_rr_rdata2buffer_wire(ldns_buffer *output, const ldns_rr *rr); - -/** - * Copies the packet data to the buffer in wire format - * \param[out] *output buffer to append the result to - * \param[in] *pkt packet to convert - * \return ldns_status - */ -ldns_status ldns_pkt2buffer_wire(ldns_buffer *output, const ldns_pkt *pkt); - -/** - * Copies the rr_list data to the buffer in wire format - * \param[out] *output buffer to append the result to - * \param[in] *rrlist rr_list to to convert - * \return ldns_status - */ -ldns_status ldns_rr_list2buffer_wire(ldns_buffer *output, const ldns_rr_list *rrlist); - -/** - * Allocates an array of uint8_t at dest, and puts the wireformat of the - * given rdf in that array. The result_size value contains the - * length of the array, if it succeeds, and 0 otherwise (in which case - * the function also returns NULL) - * - * \param[out] dest pointer to the array of bytes to be created - * \param[in] rdf the rdata field to convert - * \param[out] size the size of the converted result - */ -ldns_status ldns_rdf2wire(uint8_t **dest, const ldns_rdf *rdf, size_t *size); - -/** - * Allocates an array of uint8_t at dest, and puts the wireformat of the - * given rr in that array. The result_size value contains the - * length of the array, if it succeeds, and 0 otherwise (in which case - * the function also returns NULL) - * - * If the section argument is LDNS_SECTION_QUESTION, data like ttl and rdata - * are not put into the result - * - * \param[out] dest pointer to the array of bytes to be created - * \param[in] rr the rr to convert - * \param[in] section the rr section, determines how the rr is written. - * \param[out] size the size of the converted result - */ -ldns_status ldns_rr2wire(uint8_t **dest, const ldns_rr *rr, int section, size_t *size); - -/** - * Allocates an array of uint8_t at dest, and puts the wireformat of the - * given packet in that array. The result_size value contains the - * length of the array, if it succeeds, and 0 otherwise (in which case - * the function also returns NULL) - */ -ldns_status ldns_pkt2wire(uint8_t **dest, const ldns_pkt *p, size_t *size); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_HOST2WIRE_H */ diff --git a/ldns/ldns/keys.h b/ldns/ldns/keys.h deleted file mode 100644 index df4bb22..0000000 --- a/ldns/ldns/keys.h +++ /dev/null @@ -1,640 +0,0 @@ -/* - * - * keys.h - * - * priv key definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Addendum to \ref dnssec.h, this module contains key and algorithm definitions and functions. - */ - - -#ifndef LDNS_KEYS_H -#define LDNS_KEYS_H - -#include <ldns/common.h> -#if LDNS_BUILD_CONFIG_HAVE_SSL -#include <openssl/ssl.h> -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ -#include <ldns/util.h> -#include <errno.h> - -#ifdef __cplusplus -extern "C" { -#endif - -extern ldns_lookup_table ldns_signing_algorithms[]; - -#define LDNS_KEY_ZONE_KEY 0x0100 /* rfc 4034 */ -#define LDNS_KEY_SEP_KEY 0x0001 /* rfc 4034 */ -#define LDNS_KEY_REVOKE_KEY 0x0080 /* rfc 5011 */ - -/** - * Algorithms used in dns - */ -enum ldns_enum_algorithm -{ - LDNS_RSAMD5 = 1, /* RFC 4034,4035 */ - LDNS_DH = 2, - LDNS_DSA = 3, - LDNS_ECC = 4, - LDNS_RSASHA1 = 5, - LDNS_DSA_NSEC3 = 6, - LDNS_RSASHA1_NSEC3 = 7, - LDNS_RSASHA256 = 8, /* RFC 5702 */ - LDNS_RSASHA512 = 10, /* RFC 5702 */ - LDNS_ECC_GOST = 12, /* RFC 5933 */ - LDNS_ECDSAP256SHA256 = 13, /* RFC 6605 */ - LDNS_ECDSAP384SHA384 = 14, /* RFC 6605 */ -#ifdef USE_ED25519 - /* this ifdef is internal to ldns, because we do not want to export - * the symbol. Users can define it if they want access, - * the feature is not fully implemented at this time and openssl - * does not support it fully either (also for ED448). */ - LDNS_ED25519 = 15, /* draft-ietf-curdle-dnskey-ed25519 */ -#endif -#ifdef USE_ED448 - LDNS_ED448 = 16, /* draft-ietf-curdle-dnskey-ed448 */ -#endif - LDNS_INDIRECT = 252, - LDNS_PRIVATEDNS = 253, - LDNS_PRIVATEOID = 254 -}; -typedef enum ldns_enum_algorithm ldns_algorithm; - -/** - * Hashing algorithms used in the DS record - */ -enum ldns_enum_hash -{ - LDNS_SHA1 = 1, /* RFC 4034 */ - LDNS_SHA256 = 2, /* RFC 4509 */ - LDNS_HASH_GOST = 3, /* RFC 5933 */ - LDNS_SHA384 = 4 /* RFC 6605 */ -}; -typedef enum ldns_enum_hash ldns_hash; - -/** - * Algorithms used in dns for signing - */ -enum ldns_enum_signing_algorithm -{ - LDNS_SIGN_RSAMD5 = LDNS_RSAMD5, - LDNS_SIGN_RSASHA1 = LDNS_RSASHA1, - LDNS_SIGN_DSA = LDNS_DSA, - LDNS_SIGN_RSASHA1_NSEC3 = LDNS_RSASHA1_NSEC3, - LDNS_SIGN_RSASHA256 = LDNS_RSASHA256, - LDNS_SIGN_RSASHA512 = LDNS_RSASHA512, - LDNS_SIGN_DSA_NSEC3 = LDNS_DSA_NSEC3, - LDNS_SIGN_ECC_GOST = LDNS_ECC_GOST, - LDNS_SIGN_ECDSAP256SHA256 = LDNS_ECDSAP256SHA256, - LDNS_SIGN_ECDSAP384SHA384 = LDNS_ECDSAP384SHA384, -#ifdef USE_ED25519 - LDNS_SIGN_ED25519 = LDNS_ED25519, -#endif -#ifdef USE_ED448 - LDNS_SIGN_ED448 = LDNS_ED448, -#endif - LDNS_SIGN_HMACMD5 = 157, /* not official! This type is for TSIG, not DNSSEC */ - LDNS_SIGN_HMACSHA1 = 158, /* not official! This type is for TSIG, not DNSSEC */ - LDNS_SIGN_HMACSHA256 = 159, /* ditto */ - LDNS_SIGN_HMACSHA224 = 162, /* ditto */ - LDNS_SIGN_HMACSHA384 = 164, /* ditto */ - LDNS_SIGN_HMACSHA512 = 165 /* ditto */ -}; -typedef enum ldns_enum_signing_algorithm ldns_signing_algorithm; - -/** - * General key structure, can contain all types of keys that - * are used in DNSSEC. Mostly used to store private keys, since - * public keys can also be stored in a \ref ldns_rr with type - * \ref LDNS_RR_TYPE_DNSKEY. - * - * This structure can also store some variables that influence the - * signatures generated by signing with this key, for instance the - * inception date. - */ -struct ldns_struct_key { - ldns_signing_algorithm _alg; - /** Whether to use this key when signing */ - bool _use; - /** Storage pointers for the types of keys supported */ - /* TODO remove unions? */ - struct { -#if LDNS_BUILD_CONFIG_HAVE_SSL -#ifndef S_SPLINT_S - /* The key can be an OpenSSL EVP Key - */ - EVP_PKEY *key; -#endif -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - /** - * The key can be an HMAC key - */ - struct { - unsigned char *key; - size_t size; - } hmac; - /** the key structure can also just point to some external - * key data - */ - void *external_key; - } _key; - /** Depending on the key we can have extra data */ - union { - /** Some values that influence generated signatures */ - struct { - /** The TTL of the rrset that is currently signed */ - uint32_t orig_ttl; - /** The inception date of signatures made with this key. */ - uint32_t inception; - /** The expiration date of signatures made with this key. */ - uint32_t expiration; - /** The keytag of this key. */ - uint16_t keytag; - /** The dnssec key flags as specified in RFC4035, like ZSK and KSK */ - uint16_t flags; - } dnssec; - } _extra; - /** Owner name of the key */ - ldns_rdf *_pubkey_owner; -}; -typedef struct ldns_struct_key ldns_key; - -/** - * Same as rr_list, but now for keys - */ -struct ldns_struct_key_list -{ - size_t _key_count; - ldns_key **_keys; -}; -typedef struct ldns_struct_key_list ldns_key_list; - - -/** - * Creates a new empty key list - * \return a new ldns_key_list structure pointer - */ -ldns_key_list *ldns_key_list_new(void); - -/** - * Creates a new empty key structure - * \return a new ldns_key * structure - */ -ldns_key *ldns_key_new(void); - -/** - * Creates a new key based on the algorithm - * - * \param[in] a The algorithm to use - * \param[in] size the number of bytes for the keysize - * \return a new ldns_key structure with the key - */ -ldns_key *ldns_key_new_frm_algorithm(ldns_signing_algorithm a, uint16_t size); - -/** - * Creates a new priv key based on the - * contents of the file pointed by fp. - * - * The file should be in Private-key-format v1.x. - * - * \param[out] k the new ldns_key structure - * \param[in] fp the file pointer to use - * \return an error or LDNS_STATUS_OK - */ -ldns_status ldns_key_new_frm_fp(ldns_key **k, FILE *fp); - -/** - * Creates a new private key based on the - * contents of the file pointed by fp - * - * The file should be in Private-key-format v1.x. - * - * \param[out] k the new ldns_key structure - * \param[in] fp the file pointer to use - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return an error or LDNS_STATUS_OK - */ -ldns_status ldns_key_new_frm_fp_l(ldns_key **k, FILE *fp, int *line_nr); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Read the key with the given id from the given engine and store it - * in the given ldns_key structure. The algorithm type is set - */ -ldns_status ldns_key_new_frm_engine(ldns_key **key, ENGINE *e, char *key_id, ldns_algorithm); - - -/** - * frm_fp helper function. This function parses the - * remainder of the (RSA) priv. key file generated from bind9 - * \param[in] fp the file to parse - * \return NULL on failure otherwise a RSA structure - */ -RSA *ldns_key_new_frm_fp_rsa(FILE *fp); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * frm_fp helper function. This function parses the - * remainder of the (RSA) priv. key file generated from bind9 - * \param[in] fp the file to parse - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return NULL on failure otherwise a RSA structure - */ -RSA *ldns_key_new_frm_fp_rsa_l(FILE *fp, int *line_nr); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * frm_fp helper function. This function parses the - * remainder of the (DSA) priv. key file - * \param[in] fp the file to parse - * \return NULL on failure otherwise a RSA structure - */ -DSA *ldns_key_new_frm_fp_dsa(FILE *fp); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * frm_fp helper function. This function parses the - * remainder of the (DSA) priv. key file - * \param[in] fp the file to parse - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return NULL on failure otherwise a RSA structure - */ -DSA *ldns_key_new_frm_fp_dsa_l(FILE *fp, int *line_nr); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * frm_fp helper function. This function parses the - * remainder of the (HMAC-MD5) key file - * This function allocated a buffer that needs to be freed - * \param[in] fp the file to parse - * \param[out] hmac_size the number of bits in the resulting buffer - * \return NULL on failure otherwise a newly allocated char buffer - */ -unsigned char *ldns_key_new_frm_fp_hmac(FILE *fp, size_t *hmac_size); -#endif - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * frm_fp helper function. This function parses the - * remainder of the (HMAC-MD5) key file - * This function allocated a buffer that needs to be freed - * \param[in] fp the file to parse - * \param[in] line_nr pointer to an integer containing the current line number (for error reporting purposes) - * \param[out] hmac_size the number of bits in the resulting buffer - * \return NULL on failure otherwise a newly allocated char buffer - */ -unsigned char *ldns_key_new_frm_fp_hmac_l(FILE *fp, int *line_nr, size_t *hmac_size); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/* acces write functions */ -/** - * Set the key's algorithm - * \param[in] k the key - * \param[in] l the algorithm - */ -void ldns_key_set_algorithm(ldns_key *k, ldns_signing_algorithm l); -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Set the key's evp key - * \param[in] k the key - * \param[in] e the evp key - */ -void ldns_key_set_evp_key(ldns_key *k, EVP_PKEY *e); - -/** - * Set the key's rsa data. - * The rsa data should be freed by the user. - * \param[in] k the key - * \param[in] r the rsa data - */ -void ldns_key_set_rsa_key(ldns_key *k, RSA *r); - -/** - * Set the key's dsa data - * The dsa data should be freed by the user. - * \param[in] k the key - * \param[in] d the dsa data - */ -void ldns_key_set_dsa_key(ldns_key *k, DSA *d); - -/** - * Assign the key's rsa data - * The rsa data will be freed automatically when the key is freed. - * \param[in] k the key - * \param[in] r the rsa data - */ -void ldns_key_assign_rsa_key(ldns_key *k, RSA *r); - -/** - * Assign the key's dsa data - * The dsa data will be freed automatically when the key is freed. - * \param[in] k the key - * \param[in] d the dsa data - */ -void ldns_key_assign_dsa_key(ldns_key *k, DSA *d); - -/** - * Get the PKEY id for GOST, loads GOST into openssl as a side effect. - * Only available if GOST is compiled into the library and openssl. - * \return the gost id for EVP_CTX creation. - */ -int ldns_key_EVP_load_gost_id(void); - -/** Release the engine reference held for the GOST engine. */ -void ldns_key_EVP_unload_gost(void); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * Set the key's hmac data - * \param[in] k the key - * \param[in] hmac the raw key data - */ -void ldns_key_set_hmac_key(ldns_key *k, unsigned char *hmac); - -/** - * Set the key id data. This is used if the key points to - * some externally stored key data - * - * Only the pointer is set, the data there is not copied, - * and must be freed manually; ldns_key_deep_free() does - * *not* free this data - * \param[in] key the key - * \param[in] external_key key id data - */ -void ldns_key_set_external_key(ldns_key *key, void *external_key); - -/** - * Set the key's hmac size - * \param[in] k the key - * \param[in] hmac_size the size of the hmac data - */ -void ldns_key_set_hmac_size(ldns_key *k, size_t hmac_size); -/** - * Set the key's original ttl - * \param[in] k the key - * \param[in] t the ttl - */ -void ldns_key_set_origttl(ldns_key *k, uint32_t t); -/** - * Set the key's inception date (seconds after epoch) - * \param[in] k the key - * \param[in] i the inception - */ -void ldns_key_set_inception(ldns_key *k, uint32_t i); -/** - * Set the key's expiration date (seconds after epoch) - * \param[in] k the key - * \param[in] e the expiration - */ -void ldns_key_set_expiration(ldns_key *k, uint32_t e); -/** - * Set the key's pubkey owner - * \param[in] k the key - * \param[in] r the owner - */ -void ldns_key_set_pubkey_owner(ldns_key *k, ldns_rdf *r); -/** - * Set the key's key tag - * \param[in] k the key - * \param[in] tag the keytag - */ -void ldns_key_set_keytag(ldns_key *k, uint16_t tag); -/** - * Set the key's flags - * \param[in] k the key - * \param[in] flags the flags - */ -void ldns_key_set_flags(ldns_key *k, uint16_t flags); -/** - * Set the keylist's key count to count - * \param[in] key the key - * \param[in] count the cuont - */ -void ldns_key_list_set_key_count(ldns_key_list *key, size_t count); - -/** - * pushes a key to a keylist - * \param[in] key_list the key_list to push to - * \param[in] key the key to push - * \return false on error, otherwise true - */ -bool ldns_key_list_push_key(ldns_key_list *key_list, ldns_key *key); - -/** - * returns the number of keys in the key list - * \param[in] key_list the key_list - * \return the numbers of keys in the list - */ -size_t ldns_key_list_key_count(const ldns_key_list *key_list); - -/** - * returns a pointer to the key in the list at the given position - * \param[in] key the key - * \param[in] nr the position in the list - * \return the key - */ -ldns_key *ldns_key_list_key(const ldns_key_list *key, size_t nr); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * returns the (openssl) RSA struct contained in the key - * \param[in] k the key to look in - * \return the RSA * structure in the key - */ -RSA *ldns_key_rsa_key(const ldns_key *k); -/** - * returns the (openssl) EVP struct contained in the key - * \param[in] k the key to look in - * \return the RSA * structure in the key - */ -EVP_PKEY *ldns_key_evp_key(const ldns_key *k); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * returns the (openssl) DSA struct contained in the key - */ -#if LDNS_BUILD_CONFIG_HAVE_SSL -DSA *ldns_key_dsa_key(const ldns_key *k); -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * return the signing alg of the key - * \param[in] k the key - * \return the algorithm - */ -ldns_signing_algorithm ldns_key_algorithm(const ldns_key *k); -/** - * set the use flag - * \param[in] k the key - * \param[in] v the boolean value to set the _use field to - */ -void ldns_key_set_use(ldns_key *k, bool v); -/** - * return the use flag - * \param[in] k the key - * \return the boolean value of the _use field - */ -bool ldns_key_use(const ldns_key *k); -/** - * return the hmac key data - * \param[in] k the key - * \return the hmac key data - */ -unsigned char *ldns_key_hmac_key(const ldns_key *k); -/** - * return the key id key data - * \param[in] k the key - * \return the key id data - */ -void *ldns_key_external_key(const ldns_key *k); -/** - * return the hmac key size - * \param[in] k the key - * \return the hmac key size - */ -size_t ldns_key_hmac_size(const ldns_key *k); -/** - * return the original ttl of the key - * \param[in] k the key - * \return the original ttl - */ -uint32_t ldns_key_origttl(const ldns_key *k); -/** - * return the key's inception date - * \param[in] k the key - * \return the inception date - */ -uint32_t ldns_key_inception(const ldns_key *k); -/** - * return the key's expiration date - * \param[in] k the key - * \return the experiration date - */ -uint32_t ldns_key_expiration(const ldns_key *k); -/** - * return the keytag - * \param[in] k the key - * \return the keytag - */ -uint16_t ldns_key_keytag(const ldns_key *k); -/** - * return the public key's owner - * \param[in] k the key - * \return the owner - */ -ldns_rdf *ldns_key_pubkey_owner(const ldns_key *k); -/** - * Set the 'use' flag for all keys in the list - * \param[in] keys The key_list - * \param[in] v The value to set the use flags to - */ -void -ldns_key_list_set_use(ldns_key_list *keys, bool v); - -/** - * return the flag of the key - * \param[in] k the key - * \return the flag - */ -uint16_t ldns_key_flags(const ldns_key *k); - -/** - * pops the last rr from a keylist - * \param[in] key_list the rr_list to pop from - * \return NULL if nothing to pop. Otherwise the popped RR - */ -ldns_key *ldns_key_list_pop_key(ldns_key_list *key_list); - -/** - * converts a ldns_key to a public key rr - * If the key data exists at an external point, the corresponding - * rdata field must still be added with ldns_rr_rdf_push() to the - * result rr of this function - * - * \param[in] k the ldns_key to convert - * \return ldns_rr representation of the key - */ -ldns_rr *ldns_key2rr(const ldns_key *k); - -/** - * print a private key to the file output - * - * \param[in] output the FILE descriptor where to print to - * \param[in] k the ldns_key to print - */ -void ldns_key_print(FILE *output, const ldns_key *k); - -/** - * frees a key structure, but not its internal data structures - * - * \param[in] key the key object to free - */ -void ldns_key_free(ldns_key *key); - -/** - * frees a key structure and all its internal data structures, except - * the data set by ldns_key_set_external_key() - * - * \param[in] key the key object to free - */ -void ldns_key_deep_free(ldns_key *key); - -/** - * Frees a key list structure - * \param[in] key_list the key list object to free - */ -void ldns_key_list_free(ldns_key_list *key_list); - -/** - * Instantiates a DNSKEY or DS RR from file. - * \param[in] filename the file to read the record from - * \return the corresponding RR, or NULL if the parsing failed - */ -ldns_rr * ldns_read_anchor_file(const char *filename); - -/** - * Returns the 'default base name' for key files; - * IE. K\<zone\>+\<alg\>+\<keytag\> - * (without the .key or .private) - * The memory for this is allocated by this function, - * and should be freed by the caller - * - * \param[in] key the key to get the file name from - * \returns A string containing the file base name - */ -char *ldns_key_get_file_base_name(const ldns_key *key); - -/** - * See if a key algorithm is supported - * \param[in] algo the signing algorithm number. - * \returns true if supported. - */ -int ldns_key_algo_supported(int algo); - -/** - * Get signing algorithm by name. Comparison is case insensitive. - * \param[in] name string with the name. - * \returns 0 on parse failure or the algorithm number. - */ -ldns_signing_algorithm ldns_get_signing_algorithm_by_name(const char* name); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_KEYS_H */ diff --git a/ldns/ldns/ldns.h b/ldns/ldns/ldns.h deleted file mode 100644 index 60663ef..0000000 --- a/ldns/ldns/ldns.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * dns.h -- defines for the Domain Name System - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - * This library was created by: - * Jelte Jansen, Erik Rozendaal and Miek Gieben - * - * A bunch of defines that are used in the DNS. - */ - - -/** -\mainpage LDNS Documentation - -\section introduction Introduction - -The goal of ldns is to simplify DNS programming, it supports recent RFCs -like the DNSSEC documents, and allow developers to easily create software -conforming to current RFCs, and experimental software for current Internet -drafts. A secondary benefit of using ldns is speed, because ldns is written -in C, and although it is not optimized for performance, it should be a lot -faster than Perl. - -The first main tool to use ldns is Drill, from which part of the library was -derived. From version 1.0.0 on, drill is included in the ldns release -and will not be distributed separately anymore. The library also includes some -other examples and tools to show how it can be used. These can be found in the -examples/ directory in the tarball. - -ldns depends on OpenSSL for it's cryptographic functions. -Feature list - - - Transparent IPv4 and IPv6 support (overridable if necessary), - - TSIG support, - - DNSSEC support; signing and verification, - - small size, - - online documentation as well as manual pages. - -If you want to send us patches please use the code from git. - -\section using_ldns Using ldns - -Almost all interaction between an application and ldns goes through the ldns -data structures (\ref ldns_rr, \ref ldns_pkt, etc.). These are input or -output to the functions of ldns. For example, \ref ldns_zone_new_frm_fp -reads a zone from a \c FILE pointer, and returns an \ref ldns_zone -structure. - - -Let's use Drill as an example. Drill is a tool much like dig, whose most -basic function is to send 1 query to a nameserver and print the response. - -To be able to do this, drill uses the resolver module of ldns, which acts as -a stub resolver. The resolver module uses the net module to actually send -the query that drill requested. It then uses the wire2host module to -translate the response and place it in ldns' internal structures. These are -passed back to drill, which then uses the host2str module to print the -response in presentation format. - -\section gettingstarted Getting Started - -See the \ref design page for a very high level description of the design -choices made for ldns. - -For an overview of the functions and types ldns provides, you can check out -the \ref ldns ldns header file descriptions. - -If you want to see some libdns action, you can read our tutorials: - - \ref tutorial1_mx - - \ref tutorial2_zone - - \ref tutorial3_signzone - -Or you can just use the menu above to browse through the API docs. - -<div style="visibility:hidden;"> -\image html LogoInGradientBar2-y100.png -</div> -*/ - -/** - * \file ldns.h - * - * Including this file will include all ldns files, and define some lookup tables. - */ - -#ifndef LDNS_DNS_H -#define LDNS_DNS_H - -#include <stdio.h> -#include <stdlib.h> - -#include <ldns/util.h> -#include <ldns/buffer.h> -#include <ldns/common.h> -#include <ldns/dane.h> -#include <ldns/dname.h> -#include <ldns/dnssec.h> -#include <ldns/dnssec_verify.h> -#include <ldns/dnssec_sign.h> -#include <ldns/duration.h> -#include <ldns/error.h> -#include <ldns/higher.h> -#include <ldns/host2str.h> -#include <ldns/host2wire.h> -#include <ldns/net.h> -#include <ldns/packet.h> -#include <ldns/rdata.h> -#include <ldns/resolver.h> -#include <ldns/rr.h> -#include <ldns/str2host.h> -#include <ldns/tsig.h> -#include <ldns/update.h> -#include <ldns/wire2host.h> -#include <ldns/rr_functions.h> -#include <ldns/keys.h> -#include <ldns/parse.h> -#include <ldns/zone.h> -#include <ldns/dnssec_zone.h> -#include <ldns/radix.h> -#include <ldns/rbtree.h> -#include <ldns/sha1.h> -#include <ldns/sha2.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_IP4ADDRLEN (32/8) -#define LDNS_IP6ADDRLEN (128/8) -#define LDNS_PORT 53 -#define LDNS_ROOT_LABEL_STR "." -#define LDNS_DEFAULT_TTL 3600 - -/* lookup tables for standard DNS stuff */ - -/** Taken from RFC 2538, section 2.1. */ -extern ldns_lookup_table ldns_certificate_types[]; -/** Taken from RFC 2535, section 7. */ -extern ldns_lookup_table ldns_algorithms[]; -/** Taken from RFC 2538. */ -extern ldns_lookup_table ldns_cert_algorithms[]; -/** rr types */ -extern ldns_lookup_table ldns_rr_classes[]; -/** Response codes */ -extern ldns_lookup_table ldns_rcodes[]; -/** Operation codes */ -extern ldns_lookup_table ldns_opcodes[]; -/** EDNS flags */ -extern ldns_lookup_table ldns_edns_flags[]; - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_DNS_H */ diff --git a/ldns/ldns/net.h.in b/ldns/ldns/net.h.in deleted file mode 100644 index 2591258..0000000 --- a/ldns/ldns/net.h.in +++ /dev/null @@ -1,254 +0,0 @@ -/* - * net.h - * - * DNS Resolver definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -#ifndef LDNS_NET_H -#define LDNS_NET_H - -#include <ldns/ldns.h> -@include_sys_socket_h@ - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_DEFAULT_TIMEOUT_SEC 5 -#define LDNS_DEFAULT_TIMEOUT_USEC 0 - -/** - * \file - * - * Contains functions to send and receive packets over a network. - */ - -/** - * Sends a buffer to an ip using udp and return the respons as a ldns_pkt - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout the timeout value for the network - * \param[out] answersize size of the packet - * \param[out] result packet with the answer - * \return status - */ -ldns_status ldns_udp_send(uint8_t **result, ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout, size_t *answersize); - -/** - * Send an udp query and don't wait for an answer but return - * the socket - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout *unused*, was the timeout value for the network - * \return the socket used or -1 on failure - */ -int ldns_udp_bgsend2(ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Send an udp query and don't wait for an answer but return - * the socket - * This function has the flaw that it returns 0 on failure, but 0 could be a - * valid socket. Please use ldns_udp_bgsend2 instead of this function. - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout *unused*, was the timeout value for the network - * \return the socket used or 0 on failure - */ -int ldns_udp_bgsend(ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Send an tcp query and don't wait for an answer but return - * the socket - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout the timeout value for the connect attempt - * \return the socket used or -1 on failure - */ -int ldns_tcp_bgsend2(ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Send an tcp query and don't wait for an answer but return - * the socket - * This function has the flaw that it returns 0 on failure, but 0 could be a - * valid socket. Please use ldns_tcp_bgsend2 instead of this function. - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout the timeout value for the connect attempt - * \return the socket used or 0 on failure - */ -int ldns_tcp_bgsend(ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Sends a buffer to an ip using tcp and return the respons as a ldns_pkt - * \param[in] qbin the ldns_buffer to be send - * \param[in] qbin the ldns_buffer to be send - * \param[in] to the ip addr to send to - * \param[in] tolen length of the ip addr - * \param[in] timeout the timeout value for the network - * \param[out] answersize size of the packet - * \param[out] result packet with the answer - * \return status - */ -ldns_status ldns_tcp_send(uint8_t **result, ldns_buffer *qbin, const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout, size_t *answersize); - -/** - * Sends ptk to the nameserver at the resolver object. Returns the data - * as a ldns_pkt - * - * \param[out] pkt packet received from the nameserver - * \param[in] r the resolver to use - * \param[in] query_pkt the query to send - * \return status - */ -ldns_status ldns_send(ldns_pkt **pkt, ldns_resolver *r, const ldns_pkt *query_pkt); - -/** - * Sends and ldns_buffer (presumably containing a packet to the nameserver at the resolver object. Returns the data - * as a ldns_pkt - * - * \param[out] pkt packet received from the nameserver - * \param[in] r the resolver to use - * \param[in] qb the buffer to send - * \param[in] tsig_mac the tsig MAC to authenticate the response with (NULL to do no TSIG authentication) - * \return status - */ -ldns_status ldns_send_buffer(ldns_pkt **pkt, ldns_resolver *r, ldns_buffer *qb, ldns_rdf *tsig_mac); - -/** - * Create a tcp socket to the specified address - * \param[in] to ip and family - * \param[in] tolen length of to - * \param[in] timeout timeout for the connect attempt - * \return a socket descriptor or -1 on failure - */ -int ldns_tcp_connect2(const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Create a tcp socket to the specified address - * This function has the flaw that it returns 0 on failure, but 0 could be a - * valid socket. Please use ldns_tcp_connect2 instead of this function. - * \param[in] to ip and family - * \param[in] tolen length of to - * \param[in] timeout timeout for the connect attempt - * \return a socket descriptor or 0 on failure - */ -int ldns_tcp_connect(const struct sockaddr_storage *to, socklen_t tolen, struct timeval timeout); - -/** - * Create a udp socket to the specified address - * \param[in] to ip and family - * \param[in] timeout *unused*, was timeout for the socket - * \return a socket descriptor or -1 on failure - */ -int ldns_udp_connect2(const struct sockaddr_storage *to, struct timeval timeout); - -/** - * Create a udp socket to the specified address - * This function has the flaw that it returns 0 on failure, but 0 could be a - * valid socket. Please use ldns_udp_connect2 instead of this function. - * \param[in] to ip and family - * \param[in] timeout *unused*, was timeout for the socket - * \return a socket descriptor or 0 on failure - */ -int ldns_udp_connect(const struct sockaddr_storage *to, struct timeval timeout); - -/** - * send a query via tcp to a server. Don't want for the answer - * - * \param[in] qbin the buffer to send - * \param[in] sockfd the socket to use - * \param[in] to which ip to send it - * \param[in] tolen socketlen - * \return number of bytes sent - */ -ssize_t ldns_tcp_send_query(ldns_buffer *qbin, int sockfd, const struct sockaddr_storage *to, socklen_t tolen); - -/** - * send a query via udp to a server. Don;t want for the answer - * - * \param[in] qbin the buffer to send - * \param[in] sockfd the socket to use - * \param[in] to which ip to send it - * \param[in] tolen socketlen - * \return number of bytes sent - */ -ssize_t ldns_udp_send_query(ldns_buffer *qbin, int sockfd, const struct sockaddr_storage *to, socklen_t tolen); - -/** - * Gives back a raw packet from the wire and reads the header data from the given - * socket. Allocates the data (of size size) itself, so don't forget to free - * - * \param[in] sockfd the socket to read from - * \param[out] size the number of bytes that are read - * \param[in] timeout the time allowed between packets. - * \return the data read - */ -uint8_t *ldns_tcp_read_wire_timeout(int sockfd, size_t *size, struct timeval timeout); - -/** - * This routine may block. Use ldns_tcp_read_wire_timeout, it checks timeouts. - * Gives back a raw packet from the wire and reads the header data from the given - * socket. Allocates the data (of size size) itself, so don't forget to free - * - * \param[in] sockfd the socket to read from - * \param[out] size the number of bytes that are read - * \return the data read - */ -uint8_t *ldns_tcp_read_wire(int sockfd, size_t *size); - -/** - * Gives back a raw packet from the wire and reads the header data from the given - * socket. Allocates the data (of size size) itself, so don't forget to free - * - * \param[in] sockfd the socket to read from - * \param[in] fr the address of the client (if applicable) - * \param[in] *frlen the length of the client's addr (if applicable) - * \param[out] size the number of bytes that are read - * \return the data read - */ -uint8_t *ldns_udp_read_wire(int sockfd, size_t *size, struct sockaddr_storage *fr, socklen_t *frlen); - -/** - * returns the native sockaddr representation from the rdf. - * \param[in] rd the ldns_rdf to operate on - * \param[in] port what port to use. 0 means; use default (53) - * \param[out] size what is the size of the sockaddr_storage - * \return struct sockaddr* the address in the format so other - * functions can use it (sendto) - */ -struct sockaddr_storage * ldns_rdf2native_sockaddr_storage(const ldns_rdf *rd, uint16_t port, size_t *size); - -/** - * returns an rdf with the sockaddr info. works for ip4 and ip6 - * \param[in] sock the struct sockaddr_storage to convert - * \param[in] port what port was used. When NULL this is not set - * \return ldns_rdf* wth the address - */ -ldns_rdf * ldns_sockaddr_storage2rdf(const struct sockaddr_storage *sock, uint16_t *port); - -/** - * Prepares the resolver for an axfr query - * The query is sent and the answers can be read with ldns_axfr_next - * \param[in] resolver the resolver to use - * \param[in] domain the domain to exfr - * \param[in] c the class to use - * \return ldns_status the status of the transfer - */ -ldns_status ldns_axfr_start(ldns_resolver *resolver, const ldns_rdf *domain, ldns_rr_class c); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_NET_H */ diff --git a/ldns/ldns/packet.h b/ldns/ldns/packet.h deleted file mode 100644 index 2e5ee8b..0000000 --- a/ldns/ldns/packet.h +++ /dev/null @@ -1,905 +0,0 @@ -/* - * packet.h - * - * DNS packet definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains the definition of ldns_pkt and its parts, as well - * as functions to manipulate those. - */ - - -#ifndef LDNS_PACKET_H -#define LDNS_PACKET_H - -#define LDNS_MAX_PACKETLEN 65535 - -/* allow flags to be given to ldns_pkt_query_new */ -#define LDNS_QR 1 /* Query Response flag */ -#define LDNS_AA 2 /* Authoritative Answer - server flag */ -#define LDNS_TC 4 /* TrunCated - server flag */ -#define LDNS_RD 8 /* Recursion Desired - query flag */ -#define LDNS_CD 16 /* Checking Disabled - query flag */ -#define LDNS_RA 32 /* Recursion Available - server flag */ -#define LDNS_AD 64 /* Authenticated Data - server flag */ - -#include <ldns/error.h> -#include <ldns/common.h> -#include <ldns/rr.h> -#include <sys/time.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* opcodes for pkt's */ -enum ldns_enum_pkt_opcode { - LDNS_PACKET_QUERY = 0, - LDNS_PACKET_IQUERY = 1, - LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */ - LDNS_PACKET_NOTIFY = 4, - LDNS_PACKET_UPDATE = 5 -}; -typedef enum ldns_enum_pkt_opcode ldns_pkt_opcode; - -/* rcodes for pkts */ -enum ldns_enum_pkt_rcode { - LDNS_RCODE_NOERROR = 0, - LDNS_RCODE_FORMERR = 1, - LDNS_RCODE_SERVFAIL = 2, - LDNS_RCODE_NXDOMAIN = 3, - LDNS_RCODE_NOTIMPL = 4, - LDNS_RCODE_REFUSED = 5, - LDNS_RCODE_YXDOMAIN = 6, - LDNS_RCODE_YXRRSET = 7, - LDNS_RCODE_NXRRSET = 8, - LDNS_RCODE_NOTAUTH = 9, - LDNS_RCODE_NOTZONE = 10 -}; -typedef enum ldns_enum_pkt_rcode ldns_pkt_rcode; - -/** - * Header of a dns packet - * - * Contains the information about the packet itself, as specified in RFC1035 -<pre> -4.1.1. Header section format - -The header contains the following fields: - - 1 1 1 1 1 1 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ID | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - |QR| Opcode |AA|TC|RD|RA| Z | RCODE | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | QDCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ANCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | NSCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | ARCOUNT | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - -where: - -ID A 16 bit identifier assigned by the program that - generates any kind of query. This identifier is copied - the corresponding reply and can be used by the requester - to match up replies to outstanding queries. - -QR A one bit field that specifies whether this message is a - query (0), or a response (1). - -OPCODE A four bit field that specifies kind of query in this - message. This value is set by the originator of a query - and copied into the response. The values are: - - 0 a standard query (QUERY) - - 1 an inverse query (IQUERY) - - 2 a server status request (STATUS) - - 3-15 reserved for future use - -AA Authoritative Answer - this bit is valid in responses, - and specifies that the responding name server is an - authority for the domain name in question section. - - Note that the contents of the answer section may have - multiple owner names because of aliases. The AA bit - - corresponds to the name which matches the query name, or - the first owner name in the answer section. - -TC TrunCation - specifies that this message was truncated - due to length greater than that permitted on the - transmission channel. - -RD Recursion Desired - this bit may be set in a query and - is copied into the response. If RD is set, it directs - the name server to pursue the query recursively. - Recursive query support is optional. - -RA Recursion Available - this be is set or cleared in a - response, and denotes whether recursive query support is - available in the name server. - -Z Reserved for future use. Must be zero in all queries - and responses. - -RCODE Response code - this 4 bit field is set as part of - responses. The values have the following - interpretation: - - 0 No error condition - - 1 Format error - The name server was - unable to interpret the query. - - 2 Server failure - The name server was - unable to process this query due to a - problem with the name server. - - 3 Name Error - Meaningful only for - responses from an authoritative name - server, this code signifies that the - domain name referenced in the query does - not exist. - - 4 Not Implemented - The name server does - not support the requested kind of query. - - 5 Refused - The name server refuses to - perform the specified operation for - policy reasons. For example, a name - server may not wish to provide the - information to the particular requester, - or a name server may not wish to perform - a particular operation (e.g., zone - - transfer) for particular data. - - 6-15 Reserved for future use. - -QDCOUNT an unsigned 16 bit integer specifying the number of - entries in the question section. - -ANCOUNT an unsigned 16 bit integer specifying the number of - resource records in the answer section. - -NSCOUNT an unsigned 16 bit integer specifying the number of name - server resource records in the authority records - section. - -ARCOUNT an unsigned 16 bit integer specifying the number of - resource records in the additional records section. - -</pre> - */ -struct ldns_struct_hdr -{ - /** Id of a packet */ - uint16_t _id; - /** Query bit (0=query, 1=answer) */ - bool _qr; - /** Authoritative answer */ - bool _aa; - /** Packet truncated */ - bool _tc; - /** Recursion desired */ - bool _rd; - /** Checking disabled */ - bool _cd; - /** Recursion available */ - bool _ra; - /** Authentic data */ - bool _ad; - /** Query type */ - ldns_pkt_opcode _opcode; /* XXX 8 bits? */ - /** Response code */ - uint8_t _rcode; - /** question sec */ - uint16_t _qdcount; - /** answer sec */ - uint16_t _ancount; - /** auth sec */ - uint16_t _nscount; - /** add sec */ - uint16_t _arcount; -}; -typedef struct ldns_struct_hdr ldns_hdr; - -/** - * DNS packet - * - * This structure contains a complete DNS packet (either a query or an answer) - * - * It is the complete representation of what you actually send to a - * nameserver, and what it sends back (assuming you are the client here). - */ -struct ldns_struct_pkt -{ - /** Header section */ - ldns_hdr *_header; - /* extra items needed in a packet */ - /** an rdf (A or AAAA) with the IP address of the server it is from */ - ldns_rdf *_answerfrom; - /** Timestamp of the time the packet was sent or created */ - struct timeval timestamp; - /** The duration of the query this packet is an answer to */ - uint32_t _querytime; - /** The size of the wire format of the packet in octets */ - size_t _size; - /** Optional tsig rr */ - ldns_rr *_tsig_rr; - /** EDNS0 available buffer size, see RFC2671 */ - uint16_t _edns_udp_size; - /** EDNS0 Extended rcode */ - uint8_t _edns_extended_rcode; - /** EDNS Version */ - uint8_t _edns_version; - /* OPT pseudo-RR presence flag */ - uint8_t _edns_present; - /** Reserved EDNS data bits */ - uint16_t _edns_z; - /** Arbitrary EDNS rdata */ - ldns_rdf *_edns_data; - /** Question section */ - ldns_rr_list *_question; - /** Answer section */ - ldns_rr_list *_answer; - /** Authority section */ - ldns_rr_list *_authority; - /** Additional section */ - ldns_rr_list *_additional; -}; -typedef struct ldns_struct_pkt ldns_pkt; - -/** - * The sections of a packet - */ -enum ldns_enum_pkt_section { - LDNS_SECTION_QUESTION = 0, - LDNS_SECTION_ANSWER = 1, - LDNS_SECTION_AUTHORITY = 2, - LDNS_SECTION_ADDITIONAL = 3, - /** bogus section, if not interested */ - LDNS_SECTION_ANY = 4, - /** used to get all non-question rrs from a packet */ - LDNS_SECTION_ANY_NOQUESTION = 5 -}; -typedef enum ldns_enum_pkt_section ldns_pkt_section; - -/** - * The different types of packets - */ -enum ldns_enum_pkt_type { - LDNS_PACKET_QUESTION, - LDNS_PACKET_REFERRAL, - LDNS_PACKET_ANSWER, - LDNS_PACKET_NXDOMAIN, - LDNS_PACKET_NODATA, - LDNS_PACKET_UNKNOWN -}; -typedef enum ldns_enum_pkt_type ldns_pkt_type; - -/* prototypes */ - -/* read */ - -/** - * Read the packet id - * \param[in] p the packet - * \return the packet id - */ -uint16_t ldns_pkt_id(const ldns_pkt *p); -/** - * Read the packet's qr bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_qr(const ldns_pkt *p); -/** - * Read the packet's aa bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_aa(const ldns_pkt *p); -/** - * Read the packet's tc bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_tc(const ldns_pkt *p); -/** - * Read the packet's rd bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_rd(const ldns_pkt *p); -/** - * Read the packet's cd bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_cd(const ldns_pkt *p); -/** - * Read the packet's ra bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_ra(const ldns_pkt *p); -/** - * Read the packet's ad bit - * \param[in] p the packet - * \return value of the bit - */ -bool ldns_pkt_ad(const ldns_pkt *p); -/** - * Read the packet's code - * \param[in] p the packet - * \return the opcode - */ -ldns_pkt_opcode ldns_pkt_get_opcode(const ldns_pkt *p); -/** - * Return the packet's respons code - * \param[in] p the packet - * \return the respons code - */ -ldns_pkt_rcode ldns_pkt_get_rcode(const ldns_pkt *p); -/** - * Return the packet's qd count - * \param[in] p the packet - * \return the qd count - */ -uint16_t ldns_pkt_qdcount(const ldns_pkt *p); -/** - * Return the packet's an count - * \param[in] p the packet - * \return the an count - */ -uint16_t ldns_pkt_ancount(const ldns_pkt *p); -/** - * Return the packet's ns count - * \param[in] p the packet - * \return the ns count - */ -uint16_t ldns_pkt_nscount(const ldns_pkt *p); -/** - * Return the packet's ar count - * \param[in] p the packet - * \return the ar count - */ -uint16_t ldns_pkt_arcount(const ldns_pkt *p); - -/** - * Return the packet's answerfrom - * \param[in] p packet - * \return the name of the server - */ -ldns_rdf *ldns_pkt_answerfrom(const ldns_pkt *p); - -/** - * Return the packet's timestamp - * \param[in] p the packet - * \return the timestamp - */ -struct timeval ldns_pkt_timestamp(const ldns_pkt *p); -/** - * Return the packet's querytime - * \param[in] p the packet - * \return the querytime - */ -uint32_t ldns_pkt_querytime(const ldns_pkt *p); - -/** - * Return the packet's size in bytes - * \param[in] p the packet - * \return the size - */ -size_t ldns_pkt_size(const ldns_pkt *p); - -/** - * Return the number of RRs in the given section. - * Returns the sum of all RRs when LDNS_SECTION_ANY is given. - * Returns the sum of all non-question RRs when LDNS_SECTION_ANY_NOQUESTION - * is given. - * \param[in] p the packet - * \param[in] s the section - * \return the number of RRs in the given section - */ -uint16_t ldns_pkt_section_count(const ldns_pkt *p, ldns_pkt_section s); - -/** - * Return the packet's tsig pseudo rr's - * \param[in] p the packet - * \return the tsig rr - */ -ldns_rr *ldns_pkt_tsig(const ldns_pkt *p); - -/** - * Return the packet's question section - * \param[in] p the packet - * \return the section - */ -ldns_rr_list *ldns_pkt_question(const ldns_pkt *p); -/** - * Return the packet's answer section - * \param[in] p the packet - * \return the section - */ -ldns_rr_list *ldns_pkt_answer(const ldns_pkt *p); -/** - * Return the packet's authority section - * \param[in] p the packet - * \return the section - */ -ldns_rr_list *ldns_pkt_authority(const ldns_pkt *p); -/** - * Return the packet's additional section - * \param[in] p the packet - * \return the section - */ -ldns_rr_list *ldns_pkt_additional(const ldns_pkt *p); -/** - * Return the packet's question, answer, authority and additional sections - * concatenated, in a new rr_list clone. - * \param[in] p the packet - * \return the rrs - */ -ldns_rr_list *ldns_pkt_all(const ldns_pkt *p); -/** - * Return the packet's answer, authority and additional sections concatenated, - * in a new rr_list clone. Like ldns_pkt_all but without the questions. - * \param[in] p the packet - * \return the rrs except the question rrs - */ -ldns_rr_list *ldns_pkt_all_noquestion(const ldns_pkt *p); - -/** - * return all the rr_list's in the packet. Clone the lists, instead - * of returning pointers. - * \param[in] p the packet to look in - * \param[in] s what section(s) to return - * \return ldns_rr_list with the rr's or NULL if none were found - */ -ldns_rr_list *ldns_pkt_get_section_clone(const ldns_pkt *p, ldns_pkt_section s); - -/** - * return all the rr with a specific name from a packet. Optionally - * specify from which section in the packet - * \param[in] p the packet - * \param[in] r the name - * \param[in] s the packet's section - * \return a list with the rr's or NULL if none were found - */ -ldns_rr_list *ldns_pkt_rr_list_by_name(const ldns_pkt *p, const ldns_rdf *r, ldns_pkt_section s); -/** - * return all the rr with a specific type from a packet. Optionally - * specify from which section in the packet - * \param[in] p the packet - * \param[in] t the type - * \param[in] s the packet's section - * \return a list with the rr's or NULL if none were found - */ -ldns_rr_list *ldns_pkt_rr_list_by_type(const ldns_pkt *p, ldns_rr_type t, ldns_pkt_section s); -/** - * return all the rr with a specific type and type from a packet. Optionally - * specify from which section in the packet - * \param[in] packet the packet - * \param[in] ownername the name - * \param[in] type the type - * \param[in] sec the packet's section - * \return a list with the rr's or NULL if none were found - */ -ldns_rr_list *ldns_pkt_rr_list_by_name_and_type(const ldns_pkt *packet, const ldns_rdf *ownername, ldns_rr_type type, ldns_pkt_section sec); - - -/** - * check to see if an rr exist in the packet - * \param[in] pkt the packet to examine - * \param[in] sec in which section to look - * \param[in] rr the rr to look for - */ -bool ldns_pkt_rr(const ldns_pkt *pkt, ldns_pkt_section sec, const ldns_rr *rr); - - -/** - * sets the flags in a packet. - * \param[in] pkt the packet to operate on - * \param[in] flags ORed values: LDNS_QR| LDNS_AR for instance - * \return true on success otherwise false - */ -bool ldns_pkt_set_flags(ldns_pkt *pkt, uint16_t flags); - -/** - * Set the packet's id - * \param[in] p the packet - * \param[in] id the id to set - */ -void ldns_pkt_set_id(ldns_pkt *p, uint16_t id); -/** - * Set the packet's id to a random value - * \param[in] p the packet - */ -void ldns_pkt_set_random_id(ldns_pkt *p); -/** - * Set the packet's qr bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_qr(ldns_pkt *p, bool b); -/** - * Set the packet's aa bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_aa(ldns_pkt *p, bool b); -/** - * Set the packet's tc bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_tc(ldns_pkt *p, bool b); -/** - * Set the packet's rd bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_rd(ldns_pkt *p, bool b); -/** - * Set the packet's cd bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_cd(ldns_pkt *p, bool b); -/** - * Set the packet's ra bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_ra(ldns_pkt *p, bool b); -/** - * Set the packet's ad bit - * \param[in] p the packet - * \param[in] b the value to set (boolean) - */ -void ldns_pkt_set_ad(ldns_pkt *p, bool b); - -/** - * Set the packet's opcode - * \param[in] p the packet - * \param[in] c the opcode - */ -void ldns_pkt_set_opcode(ldns_pkt *p, ldns_pkt_opcode c); -/** - * Set the packet's respons code - * \param[in] p the packet - * \param[in] c the rcode - */ -void ldns_pkt_set_rcode(ldns_pkt *p, uint8_t c); -/** - * Set the packet's qd count - * \param[in] p the packet - * \param[in] c the count - */ -void ldns_pkt_set_qdcount(ldns_pkt *p, uint16_t c); -/** - * Set the packet's an count - * \param[in] p the packet - * \param[in] c the count - */ -void ldns_pkt_set_ancount(ldns_pkt *p, uint16_t c); -/** - * Set the packet's ns count - * \param[in] p the packet - * \param[in] c the count - */ -void ldns_pkt_set_nscount(ldns_pkt *p, uint16_t c); -/** - * Set the packet's arcount - * \param[in] p the packet - * \param[in] c the count - */ -void ldns_pkt_set_arcount(ldns_pkt *p, uint16_t c); -/** - * Set the packet's answering server - * \param[in] p the packet - * \param[in] r the address - */ -void ldns_pkt_set_answerfrom(ldns_pkt *p, ldns_rdf *r); -/** - * Set the packet's query time - * \param[in] p the packet - * \param[in] t the querytime in msec - */ -void ldns_pkt_set_querytime(ldns_pkt *p, uint32_t t); -/** - * Set the packet's size - * \param[in] p the packet - * \param[in] s the size - */ -void ldns_pkt_set_size(ldns_pkt *p, size_t s); - -/** - * Set the packet's timestamp - * \param[in] p the packet - * \param[in] timeval the timestamp - */ -void ldns_pkt_set_timestamp(ldns_pkt *p, struct timeval timeval); -/** - * Set a packet's section count to x - * \param[in] p the packet - * \param[in] s the section - * \param[in] x the section count - */ -void ldns_pkt_set_section_count(ldns_pkt *p, ldns_pkt_section s, uint16_t x); -/** - * Set the packet's tsig rr - * \param[in] p the packet - * \param[in] t the tsig rr - */ -void ldns_pkt_set_tsig(ldns_pkt *p, ldns_rr *t); - -/** - * looks inside the packet to determine - * what kind of packet it is, AUTH, NXDOMAIN, REFERRAL, etc. - * \param[in] p the packet to examine - * \return the type of packet - */ -ldns_pkt_type ldns_pkt_reply_type(const ldns_pkt *p); - -/** - * return the packet's edns udp size - * \param[in] packet the packet - * \return the size - */ -uint16_t ldns_pkt_edns_udp_size(const ldns_pkt *packet); -/** - * return the packet's edns extended rcode - * \param[in] packet the packet - * \return the rcode - */ -uint8_t ldns_pkt_edns_extended_rcode(const ldns_pkt *packet); -/** - * return the packet's edns version - * \param[in] packet the packet - * \return the version - */ -uint8_t ldns_pkt_edns_version(const ldns_pkt *packet); -/** - * return the packet's edns z value - * \param[in] packet the packet - * \return the z value - */ -uint16_t ldns_pkt_edns_z(const ldns_pkt *packet); -/** - * return the packet's edns data - * \param[in] packet the packet - * \return the data - */ -ldns_rdf *ldns_pkt_edns_data(const ldns_pkt *packet); - -/** - * return the packet's edns do bit - * \param[in] packet the packet - * \return the bit's value - */ -bool ldns_pkt_edns_do(const ldns_pkt *packet); -/** - * Set the packet's edns do bit - * \param[in] packet the packet - * \param[in] value the bit's new value - */ -void ldns_pkt_set_edns_do(ldns_pkt *packet, bool value); - -/** - * return the packet's EDNS header bits that are unassigned. - */ -uint16_t ldns_pkt_edns_unassigned(const ldns_pkt *packet); - -/** - * Set the packet's EDNS header bits that are unassigned. - * \param[in] packet the packet - * \param[in] value the value - */ -void ldns_pkt_set_edns_unassigned(ldns_pkt *packet, uint16_t value); - -/** - * returns true if this packet needs and EDNS rr to be sent. - * At the moment the only reason is an expected packet - * size larger than 512 bytes, but for instance dnssec would - * be a good reason too. - * - * \param[in] packet the packet to check - * \return true if packet needs edns rr - */ -bool ldns_pkt_edns(const ldns_pkt *packet); - -/** - * Set the packet's edns udp size - * \param[in] packet the packet - * \param[in] s the size - */ -void ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s); -/** - * Set the packet's edns extended rcode - * \param[in] packet the packet - * \param[in] c the code - */ -void ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c); -/** - * Set the packet's edns version - * \param[in] packet the packet - * \param[in] v the version - */ -void ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v); -/** - * Set the packet's edns z value - * \param[in] packet the packet - * \param[in] z the value - */ -void ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z); -/** - * Set the packet's edns data - * \param[in] packet the packet - * \param[in] data the data - */ -void ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data); - -/** - * allocates and initializes a ldns_pkt structure. - * \return pointer to the new packet - */ -ldns_pkt *ldns_pkt_new(void); - -/** - * frees the packet structure and all data that it contains. - * \param[in] packet The packet structure to free - * \return void - */ -void ldns_pkt_free(ldns_pkt *packet); - -/** - * creates a query packet for the given name, type, class. - * \param[out] p the packet to be returned - * \param[in] rr_name the name to query for (as string) - * \param[in] rr_type the type to query for - * \param[in] rr_class the class to query for - * \param[in] flags packet flags - * \return LDNS_STATUS_OK or a ldns_status mesg with the error - */ -ldns_status ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class , uint16_t flags); - -/** - * creates an IXFR request packet for the given name, class. - * adds the SOA record to the authority section. - * \param[out] p the packet to be returned - * \param[in] rr_name the name to query for (as string) - * \param[in] rr_class the class to query for - * \param[in] flags packet flags - * \param[in] soa soa record to be added to the authority section (not copied). - * \return LDNS_STATUS_OK or a ldns_status mesg with the error - */ -ldns_status ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa); - -/** - * creates a packet with a query in it for the given name, type and class. - * \param[in] rr_name the name to query for (not copied). - * The returned packet will take ownership of rr_name, so the caller should not free it. - * \param[in] rr_type the type to query for - * \param[in] rr_class the class to query for - * \param[in] flags packet flags - * \return ldns_pkt* a pointer to the new pkt - */ -ldns_pkt *ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags); - -/** - * creates an IXFR request packet for the given name, type and class. - * adds the SOA record to the authority section. - * \param[in] rr_name the name to query for (not copied). - * The returned packet will take ownership of rr_name, so the caller should not free it. - * \param[in] rr_class the class to query for - * \param[in] flags packet flags - * \param[in] soa soa record to be added to the authority section (not copied). - * \return ldns_pkt* a pointer to the new pkt - */ -ldns_pkt *ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class, uint16_t flags, ldns_rr* soa); - -/** - * clones the given packet, creating a fully allocated copy - * - * \param[in] pkt the packet to clone - * \return ldns_pkt* pointer to the new packet - */ -ldns_pkt *ldns_pkt_clone(const ldns_pkt *pkt); - -/** - * directly set the additional section - * \param[in] p packet to operate on - * \param[in] rr rrlist to set - */ -void ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr); - -/** - * directly set the answer section - * \param[in] p packet to operate on - * \param[in] rr rrlist to set - */ -void ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr); - -/** - * directly set the question section - * \param[in] p packet to operate on - * \param[in] rr rrlist to set - */ -void ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr); - -/** - * directly set the auhority section - * \param[in] p packet to operate on - * \param[in] rr rrlist to set - */ -void ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr); - -/** - * push an rr on a packet - * \param[in] packet packet to operate on - * \param[in] section where to put it - * \param[in] rr rr to push - * \return a boolean which is true when the rr was added - */ -bool ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr); - -/** - * push an rr on a packet, provided the RR is not there. - * \param[in] pkt packet to operate on - * \param[in] sec where to put it - * \param[in] rr rr to push - * \return a boolean which is true when the rr was added - */ -bool ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr); - -/** - * push a rr_list on a packet - * \param[in] packet packet to operate on - * \param[in] section where to put it - * \param[in] list the rr_list to push - * \return a boolean which is true when the rr was added - */ -bool ldns_pkt_push_rr_list(ldns_pkt *packet, ldns_pkt_section section, ldns_rr_list *list); - -/** - * push an rr_list to a packet, provided the RRs are not already there. - * \param[in] pkt packet to operate on - * \param[in] sec where to put it - * \param[in] list the rr_list to push - * \return a boolean which is true when the rr was added - */ -bool ldns_pkt_safe_push_rr_list(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr_list *list); - -/** - * check if a packet is empty - * \param[in] p packet - * \return true: empty, false: not empty - */ -bool ldns_pkt_empty(ldns_pkt *p); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_PACKET_H */ diff --git a/ldns/ldns/parse.h b/ldns/ldns/parse.h deleted file mode 100644 index 0e9034c..0000000 --- a/ldns/ldns/parse.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * parse.h - * - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ - -#ifndef LDNS_PARSE_H -#define LDNS_PARSE_H - -#include <ldns/common.h> -#include <ldns/buffer.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_PARSE_SKIP_SPACE "\f\n\r\v" -#define LDNS_PARSE_NORMAL " \f\n\r\t\v" -#define LDNS_PARSE_NO_NL " \t" -#define LDNS_MAX_LINELEN 10230 -#define LDNS_MAX_KEYWORDLEN 32 - - -/** - * \file - * - * Contains some low-level parsing functions, mostly used in the _frm_str - * family of functions. - */ - -/** - * different type of directives in zone files - * We now deal with $TTL, $ORIGIN and $INCLUDE. - * The latter is not implemented in ldns (yet) - */ -enum ldns_enum_directive -{ - LDNS_DIR_TTL, - LDNS_DIR_ORIGIN, - LDNS_DIR_INCLUDE -}; -typedef enum ldns_enum_directive ldns_directive; - -/** - * returns a token/char from the stream F. - * This function deals with ( and ) in the stream, - * and ignores them when encountered - * \param[in] *f the file to read from - * \param[out] *token the read token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 the builtin maximum is used - * \return 0 on error of EOF of the stream F. Otherwise return the length of what is read - */ -ssize_t ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit); - -/** - * returns a token/char from the stream F. - * This function deals with ( and ) in the stream, - * and ignores when it finds them. - * \param[in] *f the file to read from - * \param[out] *token the token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 use builtin maximum - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return 0 on error of EOF of F otherwise return the length of what is read - */ -ssize_t ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr); - -/** - * returns a token/char from the buffer b. - * This function deals with ( and ) in the buffer, - * and ignores when it finds them. - * \param[in] *b the buffer to read from - * \param[out] *token the token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 the builtin maximum is used - * \returns 0 on error of EOF of b. Otherwise return the length of what is read - */ -ssize_t ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit); - -/* - * searches for keyword and delim in a file. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] f file pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \return the number of character read - */ -ssize_t ldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); - -/* - * searches for keyword and delim. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] f file pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \param[in] line_nr pointer to an integer containing the current line number (for -debugging purposes) - * \return the number of character read - */ -ssize_t ldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit, int *line_nr); - -/* - * searches for keyword and delim in a buffer. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] b buffer pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \return the number of character read - */ -ssize_t ldns_bget_keyword_data(ldns_buffer *b, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); - -/** - * returns the next character from a buffer. Advances the position pointer with 1. - * When end of buffer is reached returns EOF. This is the buffer's equivalent - * for getc(). - * \param[in] *buffer buffer to read from - * \return EOF on failure otherwise return the character - */ -int ldns_bgetc(ldns_buffer *buffer); - -/** - * skips all of the characters in the given string in the buffer, moving - * the position to the first character that is not in *s. - * \param[in] *buffer buffer to use - * \param[in] *s characters to skip - * \return void - */ -void ldns_bskipcs(ldns_buffer *buffer, const char *s); - -/** - * skips all of the characters in the given string in the fp, moving - * the position to the first character that is not in *s. - * \param[in] *fp file to use - * \param[in] *s characters to skip - * \return void - */ -void ldns_fskipcs(FILE *fp, const char *s); - - -/** - * skips all of the characters in the given string in the fp, moving - * the position to the first character that is not in *s. - * \param[in] *fp file to use - * \param[in] *s characters to skip - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return void - */ -void ldns_fskipcs_l(FILE *fp, const char *s, int *line_nr); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_PARSE_H */ diff --git a/ldns/ldns/radix.h b/ldns/ldns/radix.h deleted file mode 100644 index ec70565..0000000 --- a/ldns/ldns/radix.h +++ /dev/null @@ -1,240 +0,0 @@ -/* - * radix.h -- generic radix tree - * - * Copyright (c) 2012, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * \file - * Radix tree. Implementation taken from NSD 4, adjusted for use in ldns. - * - */ - -#ifndef LDNS_RADIX_H_ -#define LDNS_RADIX_H_ - -#include <ldns/error.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef uint16_t radix_strlen_t; -typedef struct ldns_radix_array_t ldns_radix_array_t; -typedef struct ldns_radix_node_t ldns_radix_node_t; -typedef struct ldns_radix_t ldns_radix_t; - -/** Radix node select edge array */ -struct ldns_radix_array_t { - /** Additional string after the selection byte for this edge. */ - uint8_t* str; - /** Length of additional string for this edge. */ - radix_strlen_t len; - /** Node that deals with byte+str. */ - ldns_radix_node_t* edge; -}; - -/** A node in a radix tree */ -struct ldns_radix_node_t { - /** Key corresponding to this node. */ - uint8_t* key; - /** Key length corresponding to this node. */ - radix_strlen_t klen; - /** Data corresponding to this node. */ - void* data; - /** Parent node. */ - ldns_radix_node_t* parent; - /** Index in the the parent node select edge array. */ - uint8_t parent_index; - /** Length of the array. */ - uint16_t len; - /** Offset of the array. */ - uint16_t offset; - /** Capacity of the array. */ - uint16_t capacity; - /** Select edge array. */ - ldns_radix_array_t* array; -}; - -/** An entire radix tree */ -struct ldns_radix_t { - /** Root. */ - ldns_radix_node_t* root; - /** Number of nodes in tree. */ - size_t count; -}; - -/** - * Create a new radix tree. - * @return: new radix tree. - * - */ -ldns_radix_t* ldns_radix_create(void); - -/** - * Initialize radix tree. - * @param tree: uninitialized radix tree. - * - */ -void ldns_radix_init(ldns_radix_t* tree); - -/** - * Free the radix tree. - * @param tree: radix tree. - * - */ -void ldns_radix_free(ldns_radix_t* tree); - -/** - * Insert data into the tree. - * @param tree: tree to insert to. - * @param key: key. - * @param len: length of key. - * @param data: data. - * @return: status. - * - */ -ldns_status ldns_radix_insert(ldns_radix_t* tree, uint8_t* key, - radix_strlen_t len, void* data); - -/** - * Delete data from the tree. - * @param tree: tree to insert to. - * @param key: key. - * @param len: length of key. - * @return: unlinked data or NULL if not present. - * - */ -void* ldns_radix_delete(ldns_radix_t* tree, const uint8_t* key, radix_strlen_t len); - -/** - * Search data in the tree. - * @param tree: tree to insert to. - * @param key: key. - * @param len: length of key. - * @return: the radix node or NULL if not found. - * - */ -ldns_radix_node_t* ldns_radix_search(ldns_radix_t* tree, const uint8_t* key, - radix_strlen_t len); - -/** - * Search data in the tree, and if not found, find the closest smaller - * element in the tree. - * @param tree: tree to insert to. - * @param key: key. - * @param len: length of key. - * @param result: the radix node with the exact or closest match. NULL if - * the key is smaller than the smallest key in the tree. - * @return 1 if exact match, 0 otherwise. - * - */ -int ldns_radix_find_less_equal(ldns_radix_t* tree, const uint8_t* key, - radix_strlen_t len, ldns_radix_node_t** result); - -/** - * Get the first element in the tree. - * @param tree: tree. - * @return: the radix node with the first element. - * - */ -ldns_radix_node_t* ldns_radix_first(const ldns_radix_t* tree); - -/** - * Get the last element in the tree. - * @param tree: tree. - * @return: the radix node with the last element. - * - */ -ldns_radix_node_t* ldns_radix_last(const ldns_radix_t* tree); - -/** - * Next element. - * @param node: node. - * @return: node with next element. - * - */ -ldns_radix_node_t* ldns_radix_next(ldns_radix_node_t* node); - -/** - * Previous element. - * @param node: node. - * @return: node with previous element. - * - */ -ldns_radix_node_t* ldns_radix_prev(ldns_radix_node_t* node); - -/** - * Split radix tree intwo. - * @param tree1: one tree. - * @param num: number of elements to split off. - * @param tree2: another tree. - * @return: status. - * - */ -ldns_status ldns_radix_split(ldns_radix_t* tree1, size_t num, - ldns_radix_t** tree2); - -/** - * Join two radix trees. - * @param tree1: one tree. - * @param tree2: another tree. - * @return: status. - * - */ -ldns_status ldns_radix_join(ldns_radix_t* tree1, ldns_radix_t* tree2); - -/** - * Call function for all nodes in the tree, such that leaf nodes are - * called before parent nodes. - * @param node: start node. - * @param func: function. - * @param arg: user argument. - * - */ -void ldns_radix_traverse_postorder(ldns_radix_node_t* node, - void (*func)(ldns_radix_node_t*, void*), void* arg); - -/** - * Print radix tree (for debugging purposes). - * @param fd: file descriptor. - * @param tree: tree. - * - */ -void ldns_radix_printf(FILE* fd, const ldns_radix_t* tree); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RADIX_H_ */ diff --git a/ldns/ldns/rbtree.h b/ldns/ldns/rbtree.h deleted file mode 100644 index 0747a8e..0000000 --- a/ldns/ldns/rbtree.h +++ /dev/null @@ -1,230 +0,0 @@ -/* - * rbtree.h -- generic red-black tree - * - * Copyright (c) 2001-2008, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * \file - * Red black tree. Implementation taken from NSD 3.0.5, adjusted for use - * in unbound (memory allocation, logging and so on). - */ - -#ifndef LDNS_RBTREE_H_ -#define LDNS_RBTREE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * This structure must be the first member of the data structure in - * the rbtree. This allows easy casting between an rbnode_t and the - * user data (poor man's inheritance). - * Or you can use the data pointer member to get to your data item. - */ -typedef struct ldns_rbnode_t ldns_rbnode_t; -/** - * The rbnode_t struct definition. - */ -struct ldns_rbnode_t { - /** parent in rbtree, RBTREE_NULL for root */ - ldns_rbnode_t *parent; - /** left node (smaller items) */ - ldns_rbnode_t *left; - /** right node (larger items) */ - ldns_rbnode_t *right; - /** pointer to sorting key */ - const void *key; - /** pointer to data */ - const void *data; - /** colour of this node */ - uint8_t color; -}; - -/** The nullpointer, points to empty node */ -#define LDNS_RBTREE_NULL &ldns_rbtree_null_node -/** the global empty node */ -extern ldns_rbnode_t ldns_rbtree_null_node; - -/** An entire red black tree */ -typedef struct ldns_rbtree_t ldns_rbtree_t; -/** definition for tree struct */ -struct ldns_rbtree_t { - /** The root of the red-black tree */ - ldns_rbnode_t *root; - - /** The number of the nodes in the tree */ - size_t count; - - /** - * Key compare function. <0,0,>0 like strcmp. - * Return 0 on two NULL ptrs. - */ - int (*cmp) (const void *, const void *); -}; - -/** - * Create new tree (malloced) with given key compare function. - * @param cmpf: compare function (like strcmp) takes pointers to two keys. - * @return: new tree, empty. - */ -ldns_rbtree_t *ldns_rbtree_create(int (*cmpf)(const void *, const void *)); - -/** - * Free the complete tree (but not its keys) - * @param rbtree The tree to free - */ -void ldns_rbtree_free(ldns_rbtree_t *rbtree); - -/** - * Init a new tree (malloced by caller) with given key compare function. - * @param rbtree: uninitialised memory for new tree, returned empty. - * @param cmpf: compare function (like strcmp) takes pointers to two keys. - */ -void ldns_rbtree_init(ldns_rbtree_t *rbtree, int (*cmpf)(const void *, const void *)); - -/** - * Insert data into the tree. - * @param rbtree: tree to insert to. - * @param data: element to insert. - * @return: data ptr or NULL if key already present. - */ -ldns_rbnode_t *ldns_rbtree_insert(ldns_rbtree_t *rbtree, ldns_rbnode_t *data); - -/** - * Insert data into the tree (reversed arguments, for use as callback) - * \param[in] data element to insert - * \param[out] rbtree tree to insert in to - * \return data ptr or NULL if key is already present - */ -void ldns_rbtree_insert_vref(ldns_rbnode_t *data, void *rbtree); - -/** - * Delete element from tree. - * @param rbtree: tree to delete from. - * @param key: key of item to delete. - * @return: node that is now unlinked from the tree. User to delete it. - * returns 0 if node not present - */ -ldns_rbnode_t *ldns_rbtree_delete(ldns_rbtree_t *rbtree, const void *key); - -/** - * Find key in tree. Returns NULL if not found. - * @param rbtree: tree to find in. - * @param key: key that must match. - * @return: node that fits or NULL. - */ -ldns_rbnode_t *ldns_rbtree_search(ldns_rbtree_t *rbtree, const void *key); - -/** - * Find, but match does not have to be exact. - * @param rbtree: tree to find in. - * @param key: key to find position of. - * @param result: set to the exact node if present, otherwise to element that - * precedes the position of key in the tree. NULL if no smaller element. - * @return: true if exact match in result. Else result points to <= element, - * or NULL if key is smaller than the smallest key. - */ -int ldns_rbtree_find_less_equal(ldns_rbtree_t *rbtree, const void *key, - ldns_rbnode_t **result); - -/** - * Returns first (smallest) node in the tree - * @param rbtree: tree - * @return: smallest element or NULL if tree empty. - */ -ldns_rbnode_t *ldns_rbtree_first(const ldns_rbtree_t *rbtree); - -/** - * Returns last (largest) node in the tree - * @param rbtree: tree - * @return: largest element or NULL if tree empty. - */ -ldns_rbnode_t *ldns_rbtree_last(const ldns_rbtree_t *rbtree); - -/** - * Returns next larger node in the tree - * @param rbtree: tree - * @return: next larger element or NULL if no larger in tree. - */ -ldns_rbnode_t *ldns_rbtree_next(ldns_rbnode_t *rbtree); - -/** - * Returns previous smaller node in the tree - * @param rbtree: tree - * @return: previous smaller element or NULL if no previous in tree. - */ -ldns_rbnode_t *ldns_rbtree_previous(ldns_rbnode_t *rbtree); - -/** - * split off 'elements' number of elements from the start - * of the name tree and return a new tree containing those - * elements - */ -ldns_rbtree_t *ldns_rbtree_split(ldns_rbtree_t *tree, size_t elements); - -/** - * add all node from the second tree to the first (removing them from the - * second), and fix up nsec(3)s if present - */ -void ldns_rbtree_join(ldns_rbtree_t *tree1, ldns_rbtree_t *tree2); - -/** - * Call with node=variable of struct* with rbnode_t as first element. - * with type is the type of a pointer to that struct. - */ -#define LDNS_RBTREE_FOR(node, type, rbtree) \ - for(node=(type)ldns_rbtree_first(rbtree); \ - (ldns_rbnode_t*)node != LDNS_RBTREE_NULL; \ - node = (type)ldns_rbtree_next((ldns_rbnode_t*)node)) - -/** - * Call function for all elements in the redblack tree, such that - * leaf elements are called before parent elements. So that all - * elements can be safely free()d. - * Note that your function must not remove the nodes from the tree. - * Since that may trigger rebalances of the rbtree. - * @param tree: the tree - * @param func: function called with element and user arg. - * The function must not alter the rbtree. - * @param arg: user argument. - */ -void ldns_traverse_postorder(ldns_rbtree_t* tree, - void (*func)(ldns_rbnode_t*, void*), void* arg); - -#ifdef __cplusplus -} -#endif - -#endif /* UTIL_RBTREE_H_ */ diff --git a/ldns/ldns/rdata.h b/ldns/ldns/rdata.h deleted file mode 100644 index 2767e8b..0000000 --- a/ldns/ldns/rdata.h +++ /dev/null @@ -1,454 +0,0 @@ -/* - * rdata.h - * - * rdata definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - - -/** - * \file - * - * Defines ldns_rdf and functions to manipulate those. - */ - - -#ifndef LDNS_RDATA_H -#define LDNS_RDATA_H - -#include <ldns/common.h> -#include <ldns/error.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_MAX_RDFLEN 65535 - -#define LDNS_RDF_SIZE_BYTE 1 -#define LDNS_RDF_SIZE_WORD 2 -#define LDNS_RDF_SIZE_DOUBLEWORD 4 -#define LDNS_RDF_SIZE_6BYTES 6 -#define LDNS_RDF_SIZE_8BYTES 8 -#define LDNS_RDF_SIZE_16BYTES 16 - -#define LDNS_NSEC3_VARS_OPTOUT_MASK 0x01 - -/** - * The different types of RDATA fields. - */ -enum ldns_enum_rdf_type -{ - /** none */ - LDNS_RDF_TYPE_NONE, - /** domain name */ - LDNS_RDF_TYPE_DNAME, - /** 8 bits */ - LDNS_RDF_TYPE_INT8, - /** 16 bits */ - LDNS_RDF_TYPE_INT16, - /** 32 bits */ - LDNS_RDF_TYPE_INT32, - /** A record */ - LDNS_RDF_TYPE_A, - /** AAAA record */ - LDNS_RDF_TYPE_AAAA, - /** txt string */ - LDNS_RDF_TYPE_STR, - /** apl data */ - LDNS_RDF_TYPE_APL, - /** b32 string */ - LDNS_RDF_TYPE_B32_EXT, - /** b64 string */ - LDNS_RDF_TYPE_B64, - /** hex string */ - LDNS_RDF_TYPE_HEX, - /** nsec type codes */ - LDNS_RDF_TYPE_NSEC, - /** a RR type */ - LDNS_RDF_TYPE_TYPE, - /** a class */ - LDNS_RDF_TYPE_CLASS, - /** certificate algorithm */ - LDNS_RDF_TYPE_CERT_ALG, - /** a key algorithm */ - LDNS_RDF_TYPE_ALG, - /** unknown types */ - LDNS_RDF_TYPE_UNKNOWN, - /** time (32 bits) */ - LDNS_RDF_TYPE_TIME, - /** period */ - LDNS_RDF_TYPE_PERIOD, - /** tsig time 48 bits */ - LDNS_RDF_TYPE_TSIGTIME, - /** Represents the Public Key Algorithm, HIT and Public Key fields - for the HIP RR types. A HIP specific rdf type is used because of - the unusual layout in wireformat (see RFC 5205 Section 5) */ - LDNS_RDF_TYPE_HIP, - /** variable length any type rdata where the length - is specified by the first 2 bytes */ - LDNS_RDF_TYPE_INT16_DATA, - /** protocol and port bitmaps */ - LDNS_RDF_TYPE_SERVICE, - /** location data */ - LDNS_RDF_TYPE_LOC, - /** well known services */ - LDNS_RDF_TYPE_WKS, - /** NSAP */ - LDNS_RDF_TYPE_NSAP, - /** ATMA */ - LDNS_RDF_TYPE_ATMA, - /** IPSECKEY */ - LDNS_RDF_TYPE_IPSECKEY, - /** nsec3 hash salt */ - LDNS_RDF_TYPE_NSEC3_SALT, - /** nsec3 base32 string (with length byte on wire */ - LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, - - /** 4 shorts represented as 4 * 16 bit hex numbers - * separated by colons. For NID and L64. - */ - LDNS_RDF_TYPE_ILNP64, - - /** 6 * 8 bit hex numbers separated by dashes. For EUI48. */ - LDNS_RDF_TYPE_EUI48, - /** 8 * 8 bit hex numbers separated by dashes. For EUI64. */ - LDNS_RDF_TYPE_EUI64, - - /** A non-zero sequence of US-ASCII letters and numbers in lower case. - * For CAA. - */ - LDNS_RDF_TYPE_TAG, - - /** A <character-string> encoding of the value field as specified - * [RFC1035], Section 5.1., encoded as remaining rdata. - * For CAA. - */ - LDNS_RDF_TYPE_LONG_STR, - - /** Since RFC7218 TLSA records can be given with mnemonics, - * hence these rdata field types. But as with DNSKEYs, the output - * is always numeric. - */ - LDNS_RDF_TYPE_CERTIFICATE_USAGE, - LDNS_RDF_TYPE_SELECTOR, - LDNS_RDF_TYPE_MATCHING_TYPE, - - /** draft-ietf-mboned-driad-amt-discovery **/ - LDNS_RDF_TYPE_AMTRELAY, - - /* Aliases */ - LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC -}; -typedef enum ldns_enum_rdf_type ldns_rdf_type; - -/** - * algorithms used in CERT rrs - */ -enum ldns_enum_cert_algorithm -{ - LDNS_CERT_PKIX = 1, - LDNS_CERT_SPKI = 2, - LDNS_CERT_PGP = 3, - LDNS_CERT_IPKIX = 4, - LDNS_CERT_ISPKI = 5, - LDNS_CERT_IPGP = 6, - LDNS_CERT_ACPKIX = 7, - LDNS_CERT_IACPKIX = 8, - LDNS_CERT_URI = 253, - LDNS_CERT_OID = 254 -}; -typedef enum ldns_enum_cert_algorithm ldns_cert_algorithm; - - - -/** - * Resource record data field. - * - * The data is a network ordered array of bytes, which size is specified by - * the (16-bit) size field. To correctly parse it, use the type - * specified in the (16-bit) type field with a value from \ref ldns_rdf_type. - */ -struct ldns_struct_rdf -{ - /** The size of the data (in octets) */ - size_t _size; - /** The type of the data */ - ldns_rdf_type _type; - /** Pointer to the data (raw octets) */ - void *_data; -}; -typedef struct ldns_struct_rdf ldns_rdf; - -/* prototypes */ - -/* write access functions */ - -/** - * sets the size of the rdf. - * \param[in] *rd the rdf to operate on - * \param[in] size the new size - * \return void - */ -void ldns_rdf_set_size(ldns_rdf *rd, size_t size); - -/** - * sets the size of the rdf. - * \param[in] *rd the rdf to operate on - * \param[in] type the new type - * \return void - */ -void ldns_rdf_set_type(ldns_rdf *rd, ldns_rdf_type type); - -/** - * sets the size of the rdf. - * \param[in] *rd the rdf to operate on - * \param[in] *data pointer to the new data - * \return void - */ -void ldns_rdf_set_data(ldns_rdf *rd, void *data); - -/* read access */ - -/** - * returns the size of the rdf. - * \param[in] *rd the rdf to read from - * \return uint16_t with the size - */ -size_t ldns_rdf_size(const ldns_rdf *rd); - -/** - * returns the type of the rdf. We need to insert _get_ - * here to prevent conflict the the rdf_type TYPE. - * \param[in] *rd the rdf to read from - * \return ldns_rdf_type with the type - */ -ldns_rdf_type ldns_rdf_get_type(const ldns_rdf *rd); - -/** - * returns the data of the rdf. - * \param[in] *rd the rdf to read from - * - * \return uint8_t* pointer to the rdf's data - */ -uint8_t *ldns_rdf_data(const ldns_rdf *rd); - -/* creator functions */ - -/** - * allocates a new rdf structure and fills it. - * This function DOES NOT copy the contents from - * the buffer, unlinke ldns_rdf_new_frm_data() - * \param[in] type type of the rdf - * \param[in] size size of the buffer - * \param[in] data pointer to the buffer to be copied - * \return the new rdf structure or NULL on failure - */ -ldns_rdf *ldns_rdf_new(ldns_rdf_type type, size_t size, void *data); - -/** - * allocates a new rdf structure and fills it. - * This function _does_ copy the contents from - * the buffer, unlinke ldns_rdf_new() - * \param[in] type type of the rdf - * \param[in] size size of the buffer - * \param[in] data pointer to the buffer to be copied - * \return the new rdf structure or NULL on failure - */ -ldns_rdf *ldns_rdf_new_frm_data(ldns_rdf_type type, size_t size, const void *data); - -/** - * creates a new rdf from a string. - * \param[in] type type to use - * \param[in] str string to use - * \return ldns_rdf* or NULL in case of an error - */ -ldns_rdf *ldns_rdf_new_frm_str(ldns_rdf_type type, const char *str); - -/** - * creates a new rdf from a file containing a string. - * \param[out] r the new rdf - * \param[in] type type to use - * \param[in] fp the file pointer to use - * \return LDNS_STATUS_OK or the error - */ -ldns_status ldns_rdf_new_frm_fp(ldns_rdf **r, ldns_rdf_type type, FILE *fp); - -/** - * creates a new rdf from a file containing a string. - * \param[out] r the new rdf - * \param[in] type type to use - * \param[in] fp the file pointer to use - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return LDNS_STATUS_OK or the error - */ -ldns_status ldns_rdf_new_frm_fp_l(ldns_rdf **r, ldns_rdf_type type, FILE *fp, int *line_nr); - -/* destroy functions */ - -/** - * frees a rdf structure, leaving the - * data pointer intact. - * \param[in] rd the pointer to be freed - * \return void - */ -void ldns_rdf_free(ldns_rdf *rd); - -/** - * frees a rdf structure _and_ frees the - * data. rdf should be created with _new_frm_data - * \param[in] rd the rdf structure to be freed - * \return void - */ -void ldns_rdf_deep_free(ldns_rdf *rd); - -/* conversion functions */ - -/** - * returns the rdf containing the native uint8_t repr. - * \param[in] type the ldns_rdf type to use - * \param[in] value the uint8_t to use - * \return ldns_rdf* with the converted value - */ -ldns_rdf *ldns_native2rdf_int8(ldns_rdf_type type, uint8_t value); - -/** - * returns the rdf containing the native uint16_t representation. - * \param[in] type the ldns_rdf type to use - * \param[in] value the uint16_t to use - * \return ldns_rdf* with the converted value - */ -ldns_rdf *ldns_native2rdf_int16(ldns_rdf_type type, uint16_t value); - -/** - * returns an rdf that contains the given int32 value. - * - * Because multiple rdf types can contain an int32, the - * type must be specified - * \param[in] type the ldns_rdf type to use - * \param[in] value the uint32_t to use - * \return ldns_rdf* with the converted value - */ -ldns_rdf *ldns_native2rdf_int32(ldns_rdf_type type, uint32_t value); - -/** - * returns an int16_data rdf that contains the data in the - * given array, preceded by an int16 specifying the length. - * - * The memory is copied, and an LDNS_RDF_TYPE_INT16DATA is returned - * \param[in] size the size of the data - * \param[in] *data pointer to the actual data - * - * \return ldns_rd* the rdf with the data - */ -ldns_rdf *ldns_native2rdf_int16_data(size_t size, uint8_t *data); - -/** - * reverses an rdf, only actually useful for AAAA and A records. - * The returned rdf has the type LDNS_RDF_TYPE_DNAME! - * \param[in] *rd rdf to be reversed - * \return the reversed rdf (a newly created rdf) - */ -ldns_rdf *ldns_rdf_address_reverse(const ldns_rdf *rd); - -/** - * returns the native uint8_t representation from the rdf. - * \param[in] rd the ldns_rdf to operate on - * \return uint8_t the value extracted - */ -uint8_t ldns_rdf2native_int8(const ldns_rdf *rd); - -/** - * returns the native uint16_t representation from the rdf. - * \param[in] rd the ldns_rdf to operate on - * \return uint16_t the value extracted - */ -uint16_t ldns_rdf2native_int16(const ldns_rdf *rd); - -/** - * returns the native uint32_t representation from the rdf. - * \param[in] rd the ldns_rdf to operate on - * \return uint32_t the value extracted - */ -uint32_t ldns_rdf2native_int32(const ldns_rdf *rd); - -/** - * returns the native time_t representation from the rdf. - * \param[in] rd the ldns_rdf to operate on - * \return time_t the value extracted (32 bits currently) - */ -time_t ldns_rdf2native_time_t(const ldns_rdf *rd); - -/** - * converts a ttl value (like 5d2h) to a long. - * \param[in] nptr the start of the string - * \param[out] endptr points to the last char in case of error - * \return the convert duration value - */ -uint32_t ldns_str2period(const char *nptr, const char **endptr); - -/** - * removes \\DDD, \\[space] and other escapes from the input. - * See RFC 1035, section 5.1. - * \param[in] word what to check - * \param[in] length the string - * \return ldns_status mesg - */ -ldns_status ldns_octet(char *word, size_t *length); - -/** - * clones a rdf structure. The data is copied. - * \param[in] rd rdf to be copied - * \return a new rdf structure - */ -ldns_rdf *ldns_rdf_clone(const ldns_rdf *rd); - -/** - * compares two rdf's on their wire formats. - * (To order dnames according to rfc4034, use ldns_dname_compare) - * \param[in] rd1 the first one - * \param[in] rd2 the second one - * \return 0 if equal - * \return -1 if rd1 comes before rd2 - * \return +1 if rd2 comes before rd1 - */ -int ldns_rdf_compare(const ldns_rdf *rd1, const ldns_rdf *rd2); - -/** - * Gets the algorithm value, the HIT and Public Key data from the rdf with - * type LDNS_RDF_TYPE_HIP. - * \param[in] rdf the rdf with type LDNS_RDF_TYPE_HIP - * \param[out] alg the algorithm - * \param[out] hit_size the size of the HIT data - * \param[out] hit the hit data - * \param[out] pk_size the size of the Public Key data - * \param[out] pk the Public Key data - * \return LDNS_STATUS_OK on success, and the error otherwise - */ -ldns_status ldns_rdf_hip_get_alg_hit_pk(ldns_rdf *rdf, uint8_t* alg, - uint8_t *hit_size, uint8_t** hit, - uint16_t *pk_size, uint8_t** pk); - -/** - * Creates a new LDNS_RDF_TYPE_HIP rdf from given data. - * \param[out] rdf the newly created LDNS_RDF_TYPE_HIP rdf - * \param[in] alg the algorithm - * \param[in] hit_size the size of the HIT data - * \param[in] hit the hit data - * \param[in] pk_size the size of the Public Key data - * \param[in] pk the Public Key data - * \return LDNS_STATUS_OK on success, and the error otherwise - */ -ldns_status ldns_rdf_hip_new_frm_alg_hit_pk(ldns_rdf** rdf, uint8_t alg, - uint8_t hit_size, uint8_t *hit, uint16_t pk_size, uint8_t *pk); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RDATA_H */ diff --git a/ldns/ldns/resolver.h b/ldns/ldns/resolver.h deleted file mode 100644 index 84128df..0000000 --- a/ldns/ldns/resolver.h +++ /dev/null @@ -1,808 +0,0 @@ -/* - * resolver.h - * - * DNS Resolver definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Defines the ldns_resolver structure, a stub resolver that can send queries and parse answers. - * - */ - -#ifndef LDNS_RESOLVER_H -#define LDNS_RESOLVER_H - -#include <ldns/error.h> -#include <ldns/common.h> -#include <ldns/rr.h> -#include <ldns/tsig.h> -#include <ldns/rdata.h> -#include <ldns/packet.h> -#include <sys/time.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** Default location of the resolv.conf file */ -#define LDNS_RESOLV_CONF "/etc/resolv.conf" -/** Default location of the hosts file */ -#define LDNS_RESOLV_HOSTS "/etc/hosts" - -#define LDNS_RESOLV_KEYWORD -1 -#define LDNS_RESOLV_DEFDOMAIN 0 -#define LDNS_RESOLV_NAMESERVER 1 -#define LDNS_RESOLV_SEARCH 2 -#define LDNS_RESOLV_SORTLIST 3 -#define LDNS_RESOLV_OPTIONS 4 -#define LDNS_RESOLV_ANCHOR 5 -#define LDNS_RESOLV_KEYWORDS 6 - -#define LDNS_RESOLV_INETANY 0 -#define LDNS_RESOLV_INET 1 -#define LDNS_RESOLV_INET6 2 - -#define LDNS_RESOLV_RTT_INF 0 /* infinity */ -#define LDNS_RESOLV_RTT_MIN 1 /* reachable */ - -/** - * DNS stub resolver structure - */ -struct ldns_struct_resolver -{ - /** Port to send queries to */ - uint16_t _port; - - /** Array of nameservers to query (IP addresses or dnames) */ - ldns_rdf **_nameservers; - /** Number of nameservers in \c _nameservers */ - size_t _nameserver_count; /* how many do we have */ - - /** Round trip time; 0 -> infinity. Unit: ms? */ - size_t *_rtt; - - /** Whether or not to be recursive */ - bool _recursive; - - /** Print debug information */ - bool _debug; - - /** Default domain to add to non fully qualified domain names */ - ldns_rdf *_domain; - - /** Searchlist array, add the names in this array if a query cannot be found */ - ldns_rdf **_searchlist; - - /** Number of entries in the searchlist array */ - size_t _searchlist_count; - - /** Number of times to retry before giving up */ - uint8_t _retry; - /** Time to wait before retrying */ - uint8_t _retrans; - /** Use new fallback mechanism (try EDNS, then do TCP) */ - bool _fallback; - - /** Whether to do DNSSEC */ - bool _dnssec; - /** Whether to set the CD bit on DNSSEC requests */ - bool _dnssec_cd; - /** Optional trust anchors for complete DNSSEC validation */ - ldns_rr_list * _dnssec_anchors; - /** Whether to use tcp or udp (tcp if the value is true)*/ - bool _usevc; - /** Whether to ignore the tc bit */ - bool _igntc; - /** Whether to use ip6: 0->does not matter, 1 is IPv4, 2 is IPv6 */ - uint8_t _ip6; - /** If true append the default domain */ - bool _defnames; - /** If true apply the search list */ - bool _dnsrch; - /** Timeout for socket connections */ - struct timeval _timeout; - /** Only try the first nameserver, and return with an error directly if it fails */ - bool _fail; - /** Randomly choose a nameserver */ - bool _random; - /** Keep some things to make AXFR possible */ - int _socket; - /** Count the number of LDNS_RR_TYPE_SOA RRs we have seen so far - * (the second one signifies the end of the AXFR) - */ - int _axfr_soa_count; - /* when axfring we get complete packets from the server - but we want to give the caller 1 rr at a time, so - keep the current pkt */ - /** Packet currently handled when doing part of an AXFR */ - ldns_pkt *_cur_axfr_pkt; - /** Counter for within the AXFR packets */ - uint16_t _axfr_i; - /* EDNS0 available buffer size */ - uint16_t _edns_udp_size; - /* serial for IXFR */ - uint32_t _serial; - - /* Optional tsig key for signing queries, - outgoing messages are signed if and only if both are set - */ - /** Name of the key to use with TSIG, if _tsig_keyname and _tsig_keydata both contain values, outgoing messages are automatically signed with TSIG. */ - char *_tsig_keyname; - /** Secret key data to use with TSIG, if _tsig_keyname and _tsig_keydata both contain values, outgoing messages are automatically signed with TSIG. */ - char *_tsig_keydata; - /** TSIG signing algorithm */ - char *_tsig_algorithm; - - /** Source address to query from */ - ldns_rdf *_source; -}; -typedef struct ldns_struct_resolver ldns_resolver; - -/* prototypes */ -/* read access functions */ - -/** - * Get the port the resolver should use - * \param[in] r the resolver - * \return the port number - */ -uint16_t ldns_resolver_port(const ldns_resolver *r); - -/** - * Get the source address the resolver should use - * \param[in] r the resolver - * \return the source rdf - */ -ldns_rdf *ldns_resolver_source(const ldns_resolver *r); - -/** - * Is the resolver set to recurse - * \param[in] r the resolver - * \return true if so, otherwise false - */ -bool ldns_resolver_recursive(const ldns_resolver *r); - -/** - * Get the debug status of the resolver - * \param[in] r the resolver - * \return true if so, otherwise false - */ -bool ldns_resolver_debug(const ldns_resolver *r); - -/** - * Get the number of retries - * \param[in] r the resolver - * \return the number of retries - */ -uint8_t ldns_resolver_retry(const ldns_resolver *r); - -/** - * Get the retransmit interval - * \param[in] r the resolver - * \return the retransmit interval - */ -uint8_t ldns_resolver_retrans(const ldns_resolver *r); - -/** - * Get the truncation fallback status - * \param[in] r the resolver - * \return whether the truncation fallback mechanism is used - */ -bool ldns_resolver_fallback(const ldns_resolver *r); - -/** - * Does the resolver use ip6 or ip4 - * \param[in] r the resolver - * \return 0: both, 1: ip4, 2:ip6 - */ -uint8_t ldns_resolver_ip6(const ldns_resolver *r); - -/** - * Get the resolver's udp size - * \param[in] r the resolver - * \return the udp mesg size - */ -uint16_t ldns_resolver_edns_udp_size(const ldns_resolver *r); -/** - * Does the resolver use tcp or udp - * \param[in] r the resolver - * \return true: tcp, false: udp - */ -bool ldns_resolver_usevc(const ldns_resolver *r); -/** - * Does the resolver only try the first nameserver - * \param[in] r the resolver - * \return true: yes, fail, false: no, try the others - */ -bool ldns_resolver_fail(const ldns_resolver *r); -/** - * Does the resolver apply default domain name - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_defnames(const ldns_resolver *r); -/** - * Does the resolver apply search list - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_dnsrch(const ldns_resolver *r); -/** - * Does the resolver do DNSSEC - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_dnssec(const ldns_resolver *r); -/** - * Does the resolver set the CD bit - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_dnssec_cd(const ldns_resolver *r); -/** - * Get the resolver's DNSSEC anchors - * \param[in] r the resolver - * \return an rr_list containg trusted DNSSEC anchors - */ -ldns_rr_list * ldns_resolver_dnssec_anchors(const ldns_resolver *r); -/** - * Does the resolver ignore the TC bit (truncated) - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_igntc(const ldns_resolver *r); -/** - * Does the resolver randomize the nameserver before usage - * \param[in] r the resolver - * \return true: yes, false: no - */ -bool ldns_resolver_random(const ldns_resolver *r); -/** - * How many nameserver are configured in the resolver - * \param[in] r the resolver - * \return number of nameservers - */ -size_t ldns_resolver_nameserver_count(const ldns_resolver *r); -/** - * What is the default dname to add to relative queries - * \param[in] r the resolver - * \return the dname which is added - */ -ldns_rdf *ldns_resolver_domain(const ldns_resolver *r); -/** - * What is the timeout on socket connections - * \param[in] r the resolver - * \return the timeout as struct timeval - */ -struct timeval ldns_resolver_timeout(const ldns_resolver *r); -/** - * What is the searchlist as used by the resolver - * \param[in] r the resolver - * \return a ldns_rdf pointer to a list of the addresses - */ -ldns_rdf** ldns_resolver_searchlist(const ldns_resolver *r); -/** - * Return the configured nameserver ip address - * \param[in] r the resolver - * \return a ldns_rdf pointer to a list of the addresses - */ -ldns_rdf** ldns_resolver_nameservers(const ldns_resolver *r); -/** - * Return the used round trip times for the nameservers - * \param[in] r the resolver - * \return a size_t* pointer to the list. - * yet) - */ -size_t * ldns_resolver_rtt(const ldns_resolver *r); -/** - * Return the used round trip time for a specific nameserver - * \param[in] r the resolver - * \param[in] pos the index to the nameserver - * \return the rrt, 0: infinite, >0: undefined (as of * yet) - */ -size_t ldns_resolver_nameserver_rtt(const ldns_resolver *r, size_t pos); -/** - * Return the tsig keyname as used by the nameserver - * \param[in] r the resolver - * \return the name used. Still owned by the resolver - change using - * ldns_resolver_set_tsig_keyname(). - */ -const char *ldns_resolver_tsig_keyname(const ldns_resolver *r); -/** - * Return the tsig algorithm as used by the nameserver - * \param[in] r the resolver - * \return the algorithm used. Still owned by the resolver - change using - * ldns_resolver_set_tsig_algorithm(). - */ -const char *ldns_resolver_tsig_algorithm(const ldns_resolver *r); -/** - * Return the tsig keydata as used by the nameserver - * \param[in] r the resolver - * \return the keydata used. Still owned by the resolver - change using - * ldns_resolver_set_tsig_keydata(). - */ -const char *ldns_resolver_tsig_keydata(const ldns_resolver *r); -/** - * pop the last nameserver from the resolver. - * \param[in] r the resolver - * \return the popped address or NULL if empty - */ -ldns_rdf* ldns_resolver_pop_nameserver(ldns_resolver *r); - -/** - * Return the resolver's searchlist count - * \param[in] r the resolver - * \return the searchlist count - */ -size_t ldns_resolver_searchlist_count(const ldns_resolver *r); - -/* write access function */ -/** - * Set the port the resolver should use - * \param[in] r the resolver - * \param[in] p the port number - */ -void ldns_resolver_set_port(ldns_resolver *r, uint16_t p); - -/** - * Set the source rdf (address) the resolver should use - * \param[in] r the resolver - * \param[in] s the source address - */ -void ldns_resolver_set_source(ldns_resolver *r, ldns_rdf *s); - -/** - * Set the resolver recursion - * \param[in] r the resolver - * \param[in] b true: set to recurse, false: unset - */ -void ldns_resolver_set_recursive(ldns_resolver *r, bool b); - -/** - * Set the resolver debugging - * \param[in] r the resolver - * \param[in] b true: debug on: false debug off - */ -void ldns_resolver_set_debug(ldns_resolver *r, bool b); - -/** - * Incremental the resolver's nameserver count. - * \param[in] r the resolver - */ -void ldns_resolver_incr_nameserver_count(ldns_resolver *r); - -/** - * Decrement the resolver's nameserver count. - * \param[in] r the resolver - */ -void ldns_resolver_dec_nameserver_count(ldns_resolver *r); - -/** - * Set the resolver's nameserver count directly. - * \param[in] r the resolver - * \param[in] c the nameserver count - */ -void ldns_resolver_set_nameserver_count(ldns_resolver *r, size_t c); - -/** - * Set the resolver's nameserver count directly by using an rdf list - * \param[in] r the resolver - * \param[in] rd the resolver addresses - */ -void ldns_resolver_set_nameservers(ldns_resolver *r, ldns_rdf **rd); - -/** - * Set the resolver's default domain. This gets appended when no - * absolute name is given - * \param[in] r the resolver - * \param[in] rd the name to append - */ -void ldns_resolver_set_domain(ldns_resolver *r, ldns_rdf *rd); - -/** - * Set the resolver's socket time out when talking to remote hosts - * \param[in] r the resolver - * \param[in] timeout the timeout to use - */ -void ldns_resolver_set_timeout(ldns_resolver *r, struct timeval timeout); - -/** - * Push a new rd to the resolver's searchlist - * \param[in] r the resolver - * \param[in] rd to push - */ -void ldns_resolver_push_searchlist(ldns_resolver *r, ldns_rdf *rd); - -/** - * Whether the resolver uses the name set with _set_domain - * \param[in] r the resolver - * \param[in] b true: use the defaults, false: don't use them - */ -void ldns_resolver_set_defnames(ldns_resolver *r, bool b); - -/** - * Whether the resolver uses a virtual circuit (TCP) - * \param[in] r the resolver - * \param[in] b true: use TCP, false: don't use TCP - */ -void ldns_resolver_set_usevc(ldns_resolver *r, bool b); - -/** - * Whether the resolver uses the searchlist - * \param[in] r the resolver - * \param[in] b true: use the list, false: don't use the list - */ -void ldns_resolver_set_dnsrch(ldns_resolver *r, bool b); - -/** - * Whether the resolver uses DNSSEC - * \param[in] r the resolver - * \param[in] b true: use DNSSEC, false: don't use DNSSEC - */ -void ldns_resolver_set_dnssec(ldns_resolver *r, bool b); - -/** - * Whether the resolver uses the checking disable bit - * \param[in] r the resolver - * \param[in] b true: enable , false: don't use TCP - */ -void ldns_resolver_set_dnssec_cd(ldns_resolver *r, bool b); -/** - * Set the resolver's DNSSEC anchor list directly. RRs should be of type DS or DNSKEY. - * \param[in] r the resolver - * \param[in] l the list of RRs to use as trust anchors - */ -void ldns_resolver_set_dnssec_anchors(ldns_resolver *r, ldns_rr_list * l); - -/** - * Push a new trust anchor to the resolver. It must be a DS or DNSKEY rr - * \param[in] r the resolver. - * \param[in] rr the RR to add as a trust anchor. - * \return a status - */ -ldns_status ldns_resolver_push_dnssec_anchor(ldns_resolver *r, ldns_rr *rr); - -/** - * Set the resolver retrans timeout (in seconds) - * \param[in] r the resolver - * \param[in] re the retransmission interval in seconds - */ -void ldns_resolver_set_retrans(ldns_resolver *r, uint8_t re); - -/** - * Set whether the resolvers truncation fallback mechanism is used - * when ldns_resolver_query() is called. - * \param[in] r the resolver - * \param[in] fallback whether to use the fallback mechanism - */ -void ldns_resolver_set_fallback(ldns_resolver *r, bool fallback); - -/** - * Set the number of times a resolver should retry a nameserver before the - * next one is tried. - * \param[in] r the resolver - * \param[in] re the number of retries - */ -void ldns_resolver_set_retry(ldns_resolver *r, uint8_t re); - -/** - * Whether the resolver uses ip6 - * \param[in] r the resolver - * \param[in] i 0: no pref, 1: ip4, 2: ip6 - */ -void ldns_resolver_set_ip6(ldns_resolver *r, uint8_t i); - -/** - * Whether or not to fail after one failed query - * \param[in] r the resolver - * \param[in] b true: yes fail, false: continue with next nameserver - */ -void ldns_resolver_set_fail(ldns_resolver *r, bool b); - -/** - * Whether or not to ignore the TC bit - * \param[in] r the resolver - * \param[in] b true: yes ignore, false: don't ignore - */ -void ldns_resolver_set_igntc(ldns_resolver *r, bool b); - -/** - * Set maximum udp size - * \param[in] r the resolver - * \param[in] s the udp max size - */ -void ldns_resolver_set_edns_udp_size(ldns_resolver *r, uint16_t s); - -/** - * Set the tsig key name - * \param[in] r the resolver - * \param[in] tsig_keyname the tsig key name (copied into resolver) - */ -void ldns_resolver_set_tsig_keyname(ldns_resolver *r, const char *tsig_keyname); - -/** - * Set the tsig algorithm - * \param[in] r the resolver - * \param[in] tsig_algorithm the tsig algorithm (copied into resolver) - */ -void ldns_resolver_set_tsig_algorithm(ldns_resolver *r, const char *tsig_algorithm); - -/** - * Set the tsig key data - * \param[in] r the resolver - * \param[in] tsig_keydata the key data (copied into resolver) - */ -void ldns_resolver_set_tsig_keydata(ldns_resolver *r, const char *tsig_keydata); - -/** - * Set round trip time for all nameservers. Note this currently - * differentiates between: unreachable and reachable. - * \param[in] r the resolver - * \param[in] rtt a list with the times - */ -void ldns_resolver_set_rtt(ldns_resolver *r, size_t *rtt); - -/** - * Set round trip time for a specific nameserver. Note this - * currently differentiates between: unreachable and reachable. - * \param[in] r the resolver - * \param[in] pos the nameserver position - * \param[in] value the rtt - */ -void ldns_resolver_set_nameserver_rtt(ldns_resolver *r, size_t pos, size_t value); - -/** - * Should the nameserver list be randomized before each use - * \param[in] r the resolver - * \param[in] b: true: randomize, false: don't - */ -void ldns_resolver_set_random(ldns_resolver *r, bool b); - -/** - * Push a new nameserver to the resolver. It must be an IP - * address v4 or v6. - * \param[in] r the resolver - * \param[in] n the ip address - * \return ldns_status a status - */ -ldns_status ldns_resolver_push_nameserver(ldns_resolver *r, const ldns_rdf *n); - -/** - * Push a new nameserver to the resolver. It must be an - * A or AAAA RR record type - * \param[in] r the resolver - * \param[in] rr the resource record - * \return ldns_status a status - */ -ldns_status ldns_resolver_push_nameserver_rr(ldns_resolver *r, const ldns_rr *rr); - -/** - * Push a new nameserver rr_list to the resolver. - * \param[in] r the resolver - * \param[in] rrlist the rr_list to push - * \return ldns_status a status - */ -ldns_status ldns_resolver_push_nameserver_rr_list(ldns_resolver *r, const ldns_rr_list *rrlist); - -/** - * Send the query for using the resolver and take the search list into account - * The search algorithm is as follows: - * If the name is absolute, try it as-is, otherwise apply the search list - * \param[in] *r operate using this resolver - * \param[in] *rdf query for this name - * \param[in] t query for this type (may be 0, defaults to A) - * \param[in] c query for this class (may be 0, default to IN) - * \param[in] flags the query flags - * - * \return ldns_pkt* a packet with the reply from the nameserver - */ -ldns_pkt* ldns_resolver_search(const ldns_resolver *r, const ldns_rdf *rdf, ldns_rr_type t, ldns_rr_class c, uint16_t flags); - - -/** - * Send the query for using the resolver and take the search list into account - * The search algorithm is as follows: - * If the name is absolute, try it as-is, otherwise apply the search list - * \param[out] pkt a packet with the reply from the nameserver - * \param[in] *r operate using this resolver - * \param[in] *rdf query for this name - * \param[in] t query for this type (may be 0, defaults to A) - * \param[in] c query for this class (may be 0, default to IN) - * \param[in] flags the query flags - * - * \return ldns_status LDNS_STATUS_OK on success - */ -ldns_status ldns_resolver_search_status(ldns_pkt** pkt, ldns_resolver *r, const ldns_rdf *rdf, ldns_rr_type t, ldns_rr_class c, uint16_t flags); - -/** - * Form a query packet from a resolver and name/type/class combo - * \param[out] **q a pointer to a ldns_pkt pointer (initialized by this function) - * \param[in] *r operate using this resolver - * \param[in] *name query for this name - * \param[in] t query for this type (may be 0, defaults to A) - * \param[in] c query for this class (may be 0, default to IN) - * \param[in] f the query flags - * - * \return ldns_pkt* a packet with the reply from the nameserver - */ -ldns_status ldns_resolver_prepare_query_pkt(ldns_pkt **q, ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t f); - -/** - * Send the query for name as-is - * \param[out] **answer a pointer to a ldns_pkt pointer (initialized by this function) - * \param[in] *r operate using this resolver - * \param[in] *name query for this name - * \param[in] t query for this type (may be 0, defaults to A) - * \param[in] c query for this class (may be 0, default to IN) - * \param[in] flags the query flags - * - * \return ldns_status LDNS_STATUS_OK on success - */ -ldns_status ldns_resolver_send(ldns_pkt **answer, ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags); - -/** - * Send the given packet to a nameserver - * \param[out] **answer a pointer to a ldns_pkt pointer (initialized by this function) - * \param[in] *r operate using this resolver - * \param[in] *query_pkt query - */ -ldns_status ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, ldns_pkt *query_pkt); - -/** - * Send a query to a nameserver - * \param[out] pkt a packet with the reply from the nameserver - * \param[in] *r operate using this resolver - * \param[in] *name query for this name - * \param[in] *t query for this type (may be 0, defaults to A) - * \param[in] *c query for this class (may be 0, default to IN) - * \param[in] flags the query flags - * - * \return ldns_status LDNS_STATUS_OK on success - * if _defnames is true the default domain will be added - */ -ldns_status ldns_resolver_query_status(ldns_pkt** pkt, ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags); - - -/** - * Send a query to a nameserver - * \param[in] *r operate using this resolver - * (despite the const in the declaration, - * the struct is altered as a side-effect) - * \param[in] *name query for this name - * \param[in] *t query for this type (may be 0, defaults to A) - * \param[in] *c query for this class (may be 0, default to IN) - * \param[in] flags the query flags - * - * \return ldns_pkt* a packet with the reply from the nameserver - * if _defnames is true the default domain will be added - */ -ldns_pkt* ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags); - - -/** - * Create a new resolver structure - * \return ldns_resolver* pointer to new structure - */ -ldns_resolver* ldns_resolver_new(void); - -/** - * Clone a resolver - * \param[in] r the resolver to clone - * \return ldns_resolver* pointer to new structure - */ -ldns_resolver* ldns_resolver_clone(ldns_resolver *r); - -/** - * Create a resolver structure from a file like /etc/resolv.conf - * \param[out] r the new resolver - * \param[in] fp file pointer to create new resolver from - * if NULL use /etc/resolv.conf - * \return LDNS_STATUS_OK or the error - */ -ldns_status ldns_resolver_new_frm_fp(ldns_resolver **r, FILE *fp); - -/** - * Create a resolver structure from a file like /etc/resolv.conf - * \param[out] r the new resolver - * \param[in] fp file pointer to create new resolver from - * if NULL use /etc/resolv.conf - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return LDNS_STATUS_OK or the error - */ -ldns_status ldns_resolver_new_frm_fp_l(ldns_resolver **r, FILE *fp, int *line_nr); - -/** - * Configure a resolver by means of a resolv.conf file - * The file may be NULL in which case there will be - * looked the RESOLV_CONF (defaults to /etc/resolv.conf) - * \param[out] r the new resolver - * \param[in] filename the filename to use - * \return LDNS_STATUS_OK or the error - */ -ldns_status ldns_resolver_new_frm_file(ldns_resolver **r, const char *filename); - -/** - * Frees the allocated space for this resolver. Only frees the resolver pionter! You should probably be using _deep_free. - * \param res resolver to free - */ -void ldns_resolver_free(ldns_resolver *res); - -/** - * Frees the allocated space for this resolver and all it's data - * \param res resolver to free - */ -void ldns_resolver_deep_free(ldns_resolver *res); - -/** - * Get the next stream of RRs in a AXFR - * \param[in] resolver the resolver to use. First ldns_axfr_start() must be - * called - * \return ldns_rr the next RR from the AXFR stream - * After you get this returned RR (not NULL: on error), then check if - * ldns_axfr_complete() is true to see if the zone transfer has completed. - */ -ldns_rr* ldns_axfr_next(ldns_resolver *resolver); - -/** - * Abort a transfer that is in progress - * \param[in] resolver the resolver that is used - */ -void ldns_axfr_abort(ldns_resolver *resolver); - -/** - * Returns true if the axfr transfer has completed (i.e. 2 SOA RRs and no errors were encountered - * \param[in] resolver the resolver that is used - * \return bool true if axfr transfer was completed without error - */ -bool ldns_axfr_complete(const ldns_resolver *resolver); - -/** - * Returns a pointer to the last ldns_pkt that was sent by the server in the AXFR transfer - * uasable for instance to get the error code on failure - * \param[in] res the resolver that was used in the axfr transfer - * \return ldns_pkt the last packet sent - */ -ldns_pkt *ldns_axfr_last_pkt(const ldns_resolver *res); - -/** - * Get the serial for requesting IXFR. - * \param[in] r the resolver - * \param[in] serial serial - */ -void ldns_resolver_set_ixfr_serial(ldns_resolver *r, uint32_t serial); - -/** - * Get the serial for requesting IXFR. - * \param[in] res the resolver - * \return uint32_t serial - */ -uint32_t ldns_resolver_get_ixfr_serial(const ldns_resolver *res); - -/** - * Randomize the nameserver list in the resolver - * \param[in] r the resolver - */ -void ldns_resolver_nameservers_randomize(ldns_resolver *r); - -/** - * Returns true if at least one of the provided keys is a trust anchor - * \param[in] r the current resolver - * \param[in] keys the keyset to check - * \param[out] trusted_keys the subset of trusted keys in the 'keys' rrset - * \return true if at least one of the provided keys is a configured trust anchor - */ -bool ldns_resolver_trusted_key(const ldns_resolver *r, ldns_rr_list * keys, ldns_rr_list * trusted_keys); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RESOLVER_H */ diff --git a/ldns/ldns/rr.h b/ldns/ldns/rr.h deleted file mode 100644 index 89cc0b6..0000000 --- a/ldns/ldns/rr.h +++ /dev/null @@ -1,935 +0,0 @@ -/* - * rr.h - resource record definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains the definition of ldns_rr and functions to manipulate those. - */ - - -#ifndef LDNS_RR_H -#define LDNS_RR_H - -#include <ldns/common.h> -#include <ldns/rdata.h> -#include <ldns/buffer.h> -#include <ldns/error.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** Maximum length of a dname label */ -#define LDNS_MAX_LABELLEN 63 -/** Maximum length of a complete dname */ -#define LDNS_MAX_DOMAINLEN 255 -/** Maximum number of pointers in 1 dname */ -#define LDNS_MAX_POINTERS 65535 -/** The bytes TTL, CLASS and length use up in an rr */ -#define LDNS_RR_OVERHEAD 10 - - - -/** - * The different RR classes. - */ -enum ldns_enum_rr_class -{ - /** the Internet */ - LDNS_RR_CLASS_IN = 1, - /** Chaos class */ - LDNS_RR_CLASS_CH = 3, - /** Hesiod (Dyer 87) */ - LDNS_RR_CLASS_HS = 4, - /** None class, dynamic update */ - LDNS_RR_CLASS_NONE = 254, - /** Any class */ - LDNS_RR_CLASS_ANY = 255, - - LDNS_RR_CLASS_FIRST = 0, - LDNS_RR_CLASS_LAST = 65535, - LDNS_RR_CLASS_COUNT = LDNS_RR_CLASS_LAST - LDNS_RR_CLASS_FIRST + 1 -}; -typedef enum ldns_enum_rr_class ldns_rr_class; - -/** - * Used to specify whether compression is allowed. - */ -enum ldns_enum_rr_compress -{ - /** compression is allowed */ - LDNS_RR_COMPRESS, - LDNS_RR_NO_COMPRESS -}; -typedef enum ldns_enum_rr_compress ldns_rr_compress; - -/** - * The different RR types. - */ -enum ldns_enum_rr_type -{ - /** a host address */ - LDNS_RR_TYPE_A = 1, - /** an authoritative name server */ - LDNS_RR_TYPE_NS = 2, - /** a mail destination (Obsolete - use MX) */ - LDNS_RR_TYPE_MD = 3, - /** a mail forwarder (Obsolete - use MX) */ - LDNS_RR_TYPE_MF = 4, - /** the canonical name for an alias */ - LDNS_RR_TYPE_CNAME = 5, - /** marks the start of a zone of authority */ - LDNS_RR_TYPE_SOA = 6, - /** a mailbox domain name (EXPERIMENTAL) */ - LDNS_RR_TYPE_MB = 7, - /** a mail group member (EXPERIMENTAL) */ - LDNS_RR_TYPE_MG = 8, - /** a mail rename domain name (EXPERIMENTAL) */ - LDNS_RR_TYPE_MR = 9, - /** a null RR (EXPERIMENTAL) */ - LDNS_RR_TYPE_NULL = 10, - /** a well known service description */ - LDNS_RR_TYPE_WKS = 11, - /** a domain name pointer */ - LDNS_RR_TYPE_PTR = 12, - /** host information */ - LDNS_RR_TYPE_HINFO = 13, - /** mailbox or mail list information */ - LDNS_RR_TYPE_MINFO = 14, - /** mail exchange */ - LDNS_RR_TYPE_MX = 15, - /** text strings */ - LDNS_RR_TYPE_TXT = 16, - /** RFC1183 */ - LDNS_RR_TYPE_RP = 17, - /** RFC1183 */ - LDNS_RR_TYPE_AFSDB = 18, - /** RFC1183 */ - LDNS_RR_TYPE_X25 = 19, - /** RFC1183 */ - LDNS_RR_TYPE_ISDN = 20, - /** RFC1183 */ - LDNS_RR_TYPE_RT = 21, - /** RFC1706 */ - LDNS_RR_TYPE_NSAP = 22, - /** RFC1348 */ - LDNS_RR_TYPE_NSAP_PTR = 23, - /** 2535typecode */ - LDNS_RR_TYPE_SIG = 24, - /** 2535typecode */ - LDNS_RR_TYPE_KEY = 25, - /** RFC2163 */ - LDNS_RR_TYPE_PX = 26, - /** RFC1712 */ - LDNS_RR_TYPE_GPOS = 27, - /** ipv6 address */ - LDNS_RR_TYPE_AAAA = 28, - /** LOC record RFC1876 */ - LDNS_RR_TYPE_LOC = 29, - /** 2535typecode */ - LDNS_RR_TYPE_NXT = 30, - /** draft-ietf-nimrod-dns-01.txt */ - LDNS_RR_TYPE_EID = 31, - /** draft-ietf-nimrod-dns-01.txt */ - LDNS_RR_TYPE_NIMLOC = 32, - /** SRV record RFC2782 */ - LDNS_RR_TYPE_SRV = 33, - /** http://www.jhsoft.com/rfc/af-saa-0069.000.rtf */ - LDNS_RR_TYPE_ATMA = 34, - /** RFC2915 */ - LDNS_RR_TYPE_NAPTR = 35, - /** RFC2230 */ - LDNS_RR_TYPE_KX = 36, - /** RFC2538 */ - LDNS_RR_TYPE_CERT = 37, - /** RFC2874 */ - LDNS_RR_TYPE_A6 = 38, - /** RFC2672 */ - LDNS_RR_TYPE_DNAME = 39, - /** dnsind-kitchen-sink-02.txt */ - LDNS_RR_TYPE_SINK = 40, - /** Pseudo OPT record... */ - LDNS_RR_TYPE_OPT = 41, - /** RFC3123 */ - LDNS_RR_TYPE_APL = 42, - /** RFC4034, RFC3658 */ - LDNS_RR_TYPE_DS = 43, - /** SSH Key Fingerprint */ - LDNS_RR_TYPE_SSHFP = 44, /* RFC 4255 */ - /** IPsec Key */ - LDNS_RR_TYPE_IPSECKEY = 45, /* RFC 4025 */ - /** DNSSEC */ - LDNS_RR_TYPE_RRSIG = 46, /* RFC 4034 */ - LDNS_RR_TYPE_NSEC = 47, /* RFC 4034 */ - LDNS_RR_TYPE_DNSKEY = 48, /* RFC 4034 */ - - LDNS_RR_TYPE_DHCID = 49, /* RFC 4701 */ - /* NSEC3 */ - LDNS_RR_TYPE_NSEC3 = 50, /* RFC 5155 */ - LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */ - LDNS_RR_TYPE_NSEC3PARAMS = 51, - LDNS_RR_TYPE_TLSA = 52, /* RFC 6698 */ - LDNS_RR_TYPE_SMIMEA = 53, /* RFC 8162 */ - - LDNS_RR_TYPE_HIP = 55, /* RFC 5205 */ - - /** draft-reid-dnsext-zs */ - LDNS_RR_TYPE_NINFO = 56, - /** draft-reid-dnsext-rkey */ - LDNS_RR_TYPE_RKEY = 57, - /** draft-ietf-dnsop-trust-history */ - LDNS_RR_TYPE_TALINK = 58, - LDNS_RR_TYPE_CDS = 59, /* RFC 7344 */ - LDNS_RR_TYPE_CDNSKEY = 60, /* RFC 7344 */ - LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */ - LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */ - LDNS_RR_TYPE_ZONEMD = 63, /* draft-wessels-dns-zone-digest */ - - LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */ - - LDNS_RR_TYPE_UINFO = 100, - LDNS_RR_TYPE_UID = 101, - LDNS_RR_TYPE_GID = 102, - LDNS_RR_TYPE_UNSPEC = 103, - - LDNS_RR_TYPE_NID = 104, /* RFC 6742 */ - LDNS_RR_TYPE_L32 = 105, /* RFC 6742 */ - LDNS_RR_TYPE_L64 = 106, /* RFC 6742 */ - LDNS_RR_TYPE_LP = 107, /* RFC 6742 */ - - LDNS_RR_TYPE_EUI48 = 108, /* RFC 7043 */ - LDNS_RR_TYPE_EUI64 = 109, /* RFC 7043 */ - - LDNS_RR_TYPE_TKEY = 249, /* RFC 2930 */ - LDNS_RR_TYPE_TSIG = 250, - LDNS_RR_TYPE_IXFR = 251, - LDNS_RR_TYPE_AXFR = 252, - /** A request for mailbox-related records (MB, MG or MR) */ - LDNS_RR_TYPE_MAILB = 253, - /** A request for mail agent RRs (Obsolete - see MX) */ - LDNS_RR_TYPE_MAILA = 254, - /** any type (wildcard) */ - LDNS_RR_TYPE_ANY = 255, - LDNS_RR_TYPE_URI = 256, /* RFC 7553 */ - LDNS_RR_TYPE_CAA = 257, /* RFC 6844 */ - LDNS_RR_TYPE_AVC = 258, /* Cisco's DNS-AS RR, see www.dns-as.org */ - LDNS_RR_TYPE_DOA = 259, /* draft-durand-doa-over-dns */ - - /** draft-ietf-mboned-driad-amt-discovery **/ - LDNS_RR_TYPE_AMTRELAY = 260, - - /** DNSSEC Trust Authorities */ - LDNS_RR_TYPE_TA = 32768, - /* RFC 4431, 5074, DNSSEC Lookaside Validation */ - LDNS_RR_TYPE_DLV = 32769, - - /* type codes from nsec3 experimental phase - LDNS_RR_TYPE_NSEC3 = 65324, - LDNS_RR_TYPE_NSEC3PARAMS = 65325, */ - LDNS_RR_TYPE_FIRST = 0, - LDNS_RR_TYPE_LAST = 65535, - LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1 -}; -typedef enum ldns_enum_rr_type ldns_rr_type; - -/* The first fields are contiguous and can be referenced instantly */ -#define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON (LDNS_RR_TYPE_AMTRELAY + 1) - -/** - * Resource Record - * - * This is the basic DNS element that contains actual data - * - * From RFC1035: - * <pre> -3.2.1. Format - -All RRs have the same top level format shown below: - - 1 1 1 1 1 1 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | | - / / - / NAME / - | | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | TYPE | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | CLASS | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | TTL | - | | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - | RDLENGTH | - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| - / RDATA / - / / - +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - -where: - -NAME an owner name, i.e., the name of the node to which this - resource record pertains. - -TYPE two octets containing one of the RR TYPE codes. - -CLASS two octets containing one of the RR CLASS codes. - -TTL a 32 bit signed integer that specifies the time interval - that the resource record may be cached before the source - of the information should again be consulted. Zero - values are interpreted to mean that the RR can only be - used for the transaction in progress, and should not be - cached. For example, SOA records are always distributed - with a zero TTL to prohibit caching. Zero values can - also be used for extremely volatile data. - -RDLENGTH an unsigned 16 bit integer that specifies the length in - octets of the RDATA field. - -RDATA a variable length string of octets that describes the - resource. The format of this information varies - according to the TYPE and CLASS of the resource record. - * </pre> - * - * The actual amount and type of rdata fields depend on the RR type of the - * RR, and can be found by using \ref ldns_rr_descriptor functions. - */ -struct ldns_struct_rr -{ - /** Owner name, uncompressed */ - ldns_rdf *_owner; - /** Time to live */ - uint32_t _ttl; - /** Number of data fields */ - size_t _rd_count; - /** the type of the RR. A, MX etc. */ - ldns_rr_type _rr_type; - /** Class of the resource record. */ - ldns_rr_class _rr_class; - /* everything in the rdata is in network order */ - /** The array of rdata's */ - ldns_rdf **_rdata_fields; - /** question rr [it would be nicer if thous is after _rd_count] - ABI change: Fix this in next major release - */ - bool _rr_question; -}; -typedef struct ldns_struct_rr ldns_rr; - -/** - * List or Set of Resource Records - * - * Contains a list of rr's <br> - * No official RFC-like checks are made - */ -struct ldns_struct_rr_list -{ - size_t _rr_count; - size_t _rr_capacity; - ldns_rr **_rrs; -}; -typedef struct ldns_struct_rr_list ldns_rr_list; - -/** - * Contains all information about resource record types. - * - * This structure contains, for all rr types, the rdata fields that are defined. - */ -struct ldns_struct_rr_descriptor -{ - /** Type of the RR that is described here */ - ldns_rr_type _type; - /** Textual name of the RR type. */ - const char *_name; - /** Minimum number of rdata fields in the RRs of this type. */ - uint8_t _minimum; - /** Maximum number of rdata fields in the RRs of this type. */ - uint8_t _maximum; - /** Wireformat specification for the rr, i.e. the types of rdata fields in their respective order. */ - const ldns_rdf_type *_wireformat; - /** Special rdf types */ - ldns_rdf_type _variable; - /** Specifies whether compression can be used for dnames in this RR type. */ - ldns_rr_compress _compress; - /** The number of DNAMEs in the _wireformat string, for parsing. */ - uint8_t _dname_count; -}; -typedef struct ldns_struct_rr_descriptor ldns_rr_descriptor; - - -/** - * Create a rr type bitmap rdf providing enough space to set all - * known (to ldns) rr types. - * \param[out] rdf the constructed rdf - * \return LDNS_STATUS_OK if all went well. - */ -ldns_status ldns_rdf_bitmap_known_rr_types_space(ldns_rdf** rdf); - -/** - * Create a rr type bitmap rdf with at least all known (to ldns) rr types set. - * \param[out] rdf the constructed rdf - * \return LDNS_STATUS_OK if all went well. - */ -ldns_status ldns_rdf_bitmap_known_rr_types(ldns_rdf** rdf); - - -/** - * creates a new rr structure. - * \return ldns_rr * - */ -ldns_rr* ldns_rr_new(void); - -/** - * creates a new rr structure, based on the given type. - * alloc enough space to hold all the rdf's - */ -ldns_rr* ldns_rr_new_frm_type(ldns_rr_type t); - -/** - * frees an RR structure - * \param[in] *rr the RR to be freed - * \return void - */ -void ldns_rr_free(ldns_rr *rr); - -/** - * creates an rr from a string. - * The string should be a fully filled-in rr, like - * ownername <space> TTL <space> CLASS <space> - * TYPE <space> RDATA. - * \param[out] n the rr to return - * \param[in] str the string to convert - * \param[in] default_ttl default ttl value for the rr. - * If 0 DEF_TTL will be used - * \param[in] origin when the owner is relative add this. - * The caller must ldns_rdf_deep_free it. - * \param[out] prev the previous ownername. if this value is not NULL, - * the function overwrites this with the ownername found in this - * string. The caller must then ldns_rdf_deep_free it. - * \return a status msg describing an error or LDNS_STATUS_OK - */ -ldns_status ldns_rr_new_frm_str(ldns_rr **n, const char *str, - uint32_t default_ttl, const ldns_rdf *origin, - ldns_rdf **prev); - -/** - * creates an rr for the question section from a string, i.e. - * without RDATA fields - * Origin and previous RR functionality are the same as in - * ldns_rr_new_frm_str() - * \param[out] n the rr to return - * \param[in] str the string to convert - * \param[in] origin when the owner is relative add this. - * The caller must ldns_rdf_deep_free it. - * \param prev the previous ownername. the function overwrite this with - * the current found ownername. The caller must ldns_rdf_deep_free it. - * \return a status msg describing an error or LDNS_STATUS_OK - */ -ldns_status ldns_rr_new_question_frm_str(ldns_rr **n, const char *str, - const ldns_rdf *origin, ldns_rdf **prev); - -/** - * creates a new rr from a file containing a string. - * \param[out] rr the new rr - * \param[in] fp the file pointer to use - * \param[in] default_ttl pointer to a default ttl for the rr. If NULL DEF_TTL will be used - * the pointer will be updated if the file contains a $TTL directive - * \param[in] origin when the owner is relative add this - * the pointer will be updated if the file contains a $ORIGIN directive - * The caller must ldns_rdf_deep_free it. - * \param[in] prev when the owner is whitespaces use this as the * ownername - * the pointer will be updated after the call - * The caller must ldns_rdf_deep_free it. - * \return a ldns_status with an error or LDNS_STATUS_OK - */ -ldns_status ldns_rr_new_frm_fp(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev); - -/** - * creates a new rr from a file containing a string. - * \param[out] rr the new rr - * \param[in] fp the file pointer to use - * \param[in] default_ttl a default ttl for the rr. If NULL DEF_TTL will be used - * the pointer will be updated if the file contains a $TTL directive - * \param[in] origin when the owner is relative add this - * the pointer will be updated if the file contains a $ORIGIN directive - * The caller must ldns_rdf_deep_free it. - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \param[in] prev when the owner is whitespaces use this as the * ownername - * the pointer will be updated after the call - * The caller must ldns_rdf_deep_free it. - * \return a ldns_status with an error or LDNS_STATUS_OK - */ -ldns_status ldns_rr_new_frm_fp_l(ldns_rr **rr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr); - -/** - * sets the owner in the rr structure. - * \param[in] *rr rr to operate on - * \param[in] *owner set to this owner - * \return void - */ -void ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner); - -/** - * sets the question flag in the rr structure. - * \param[in] *rr rr to operate on - * \param[in] question question flag - * \return void - */ -void ldns_rr_set_question(ldns_rr *rr, bool question); - -/** - * sets the ttl in the rr structure. - * \param[in] *rr rr to operate on - * \param[in] ttl set to this ttl - * \return void - */ -void ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl); - -/** - * sets the rd_count in the rr. - * \param[in] *rr rr to operate on - * \param[in] count set to this count - * \return void - */ -void ldns_rr_set_rd_count(ldns_rr *rr, size_t count); - -/** - * sets the type in the rr. - * \param[in] *rr rr to operate on - * \param[in] rr_type set to this type - * \return void - */ -void ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type); - -/** - * sets the class in the rr. - * \param[in] *rr rr to operate on - * \param[in] rr_class set to this class - * \return void - */ -void ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class); - -/** - * sets a rdf member, it will be set on the - * position given. The old value is returned, like pop. - * \param[in] *rr the rr to operate on - * \param[in] *f the rdf to set - * \param[in] position the position the set the rdf - * \return the old value in the rr, NULL on failyre - */ -ldns_rdf* ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position); - -/** - * sets rd_field member, it will be - * placed in the next available spot. - * \param[in] *rr rr to operate on - * \param[in] *f the data field member to set - * \return bool - */ -bool ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f); - -/** - * removes a rd_field member, it will be - * popped from the last position. - * \param[in] *rr rr to operate on - * \return rdf which was popped (null if nothing) - */ -ldns_rdf* ldns_rr_pop_rdf(ldns_rr *rr); - -/** - * returns the rdata field member counter. - * \param[in] *rr rr to operate on - * \param[in] nr the number of the rdf to return - * \return ldns_rdf * - */ -ldns_rdf* ldns_rr_rdf(const ldns_rr *rr, size_t nr); - -/** - * returns the owner name of an rr structure. - * \param[in] *rr rr to operate on - * \return ldns_rdf * - */ -ldns_rdf* ldns_rr_owner(const ldns_rr *rr); - -/** - * returns the question flag of an rr structure. - * \param[in] *rr rr to operate on - * \return bool true if question - */ -bool ldns_rr_is_question(const ldns_rr *rr); - -/** - * returns the ttl of an rr structure. - * \param[in] *rr the rr to read from - * \return the ttl of the rr - */ -uint32_t ldns_rr_ttl(const ldns_rr *rr); - -/** - * returns the rd_count of an rr structure. - * \param[in] *rr the rr to read from - * \return the rd count of the rr - */ -size_t ldns_rr_rd_count(const ldns_rr *rr); - -/** - * returns the type of the rr. - * \param[in] *rr the rr to read from - * \return the type of the rr - */ -ldns_rr_type ldns_rr_get_type(const ldns_rr *rr); - -/** - * returns the class of the rr. - * \param[in] *rr the rr to read from - * \return the class of the rr - */ -ldns_rr_class ldns_rr_get_class(const ldns_rr *rr); - -/* rr_lists */ - -/** - * returns the number of rr's in an rr_list. - * \param[in] rr_list the rr_list to read from - * \return the number of rr's - */ -size_t ldns_rr_list_rr_count(const ldns_rr_list *rr_list); - -/** - * sets the number of rr's in an rr_list. - * \param[in] rr_list the rr_list to set the count on - * \param[in] count the number of rr in this list - * \return void - */ -void ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count); - -/** - * set a rr on a specific index in a ldns_rr_list - * \param[in] rr_list the rr_list to use - * \param[in] r the rr to set - * \param[in] count index into the rr_list - * \return the old rr which was stored in the rr_list, or - * NULL is the index was too large - * set a specific rr */ -ldns_rr * ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count); - -/** - * returns a specific rr of an rrlist. - * \param[in] rr_list the rr_list to read from - * \param[in] nr return this rr - * \return the rr at position nr - */ -ldns_rr* ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr); - -/** - * creates a new rr_list structure. - * \return a new rr_list structure - */ -ldns_rr_list* ldns_rr_list_new(void); - -/** - * frees an rr_list structure. - * \param[in] rr_list the list to free - */ -void ldns_rr_list_free(ldns_rr_list *rr_list); - -/** - * frees an rr_list structure and all rrs contained therein. - * \param[in] rr_list the list to free - */ -void ldns_rr_list_deep_free(ldns_rr_list *rr_list); - -/** - * concatenates two ldns_rr_lists together. This modifies - * *left (to extend it and add the pointers from *right). - * \param[in] left the leftside - * \param[in] right the rightside - * \return a left with right concatenated to it - */ -bool ldns_rr_list_cat(ldns_rr_list *left, const ldns_rr_list *right); - -/** - * concatenates two ldns_rr_lists together, but makes clones of the rr's - * (instead of pointer copying). - * \param[in] left the leftside - * \param[in] right the rightside - * \return a new rr_list with leftside/rightside concatenated - */ -ldns_rr_list* ldns_rr_list_cat_clone(const ldns_rr_list *left, const ldns_rr_list *right); - -/** - * pushes an rr to an rrlist. - * \param[in] rr_list the rr_list to push to - * \param[in] rr the rr to push - * \return false on error, otherwise true - */ -bool ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr); - -/** - * pushes an rr_list to an rrlist. - * \param[in] rr_list the rr_list to push to - * \param[in] push_list the rr_list to push - * \return false on error, otherwise true - */ -bool ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list); - -/** - * pops the last rr from an rrlist. - * \param[in] rr_list the rr_list to pop from - * \return NULL if nothing to pop. Otherwise the popped RR - */ -ldns_rr* ldns_rr_list_pop_rr(ldns_rr_list *rr_list); - -/** - * pops an rr_list of size s from an rrlist. - * \param[in] rr_list the rr_list to pop from - * \param[in] size the number of rr's to pop - * \return NULL if nothing to pop. Otherwise the popped rr_list - */ -ldns_rr_list* ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t size); - -/** - * returns true if the given rr is one of the rrs in the - * list, or if it is equal to one - * \param[in] rr_list the rr_list to check - * \param[in] rr the rr to check - * \return true if rr_list contains rr, false otherwise - */ -bool ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, const ldns_rr *rr); - -/** - * checks if an rr_list is a rrset. - * \param[in] rr_list the rr_list to check - * \return true if it is an rrset otherwise false - */ -bool ldns_is_rrset(const ldns_rr_list *rr_list); - -/** - * pushes an rr to an rrset (which really are rr_list's). - * \param[in] *rr_list the rrset to push the rr to - * \param[in] *rr the rr to push - * \return true if the push succeeded otherwise false - */ -bool ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr); - -/** - * pops the last rr from an rrset. This function is there only - * for the symmetry. - * \param[in] rr_list the rr_list to pop from - * \return NULL if nothing to pop. Otherwise the popped RR - * - */ -ldns_rr* ldns_rr_set_pop_rr(ldns_rr_list *rr_list); - -/** - * pops the first rrset from the list, - * the list must be sorted, so that all rr's from each rrset - * are next to each other - */ -ldns_rr_list *ldns_rr_list_pop_rrset(ldns_rr_list *rr_list); - - -/** - * retrieves a rrtype by looking up its name. - * \param[in] name a string with the name - * \return the type which corresponds with the name - */ -ldns_rr_type ldns_get_rr_type_by_name(const char *name); - -/** - * retrieves a class by looking up its name. - * \param[in] name string with the name - * \return the cass which corresponds with the name - */ -ldns_rr_class ldns_get_rr_class_by_name(const char *name); - -/** - * clones a rr and all its data - * \param[in] rr the rr to clone - * \return the new rr or NULL on failure - */ -ldns_rr* ldns_rr_clone(const ldns_rr *rr); - -/** - * clones an rrlist. - * \param[in] rrlist the rrlist to clone - * \return the cloned rr list - */ -ldns_rr_list* ldns_rr_list_clone(const ldns_rr_list *rrlist); - -/** - * sorts an rr_list (canonical wire format). the sorting is done inband. - * \param[in] unsorted the rr_list to be sorted - * \return void - */ -void ldns_rr_list_sort(ldns_rr_list *unsorted); - -/** - * compares two rrs. The TTL is not looked at. - * \param[in] rr1 the first one - * \param[in] rr2 the second one - * \return 0 if equal - * -1 if rr1 comes before rr2 - * +1 if rr2 comes before rr1 - */ -int ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2); - -/** - * compares two rrs, up to the rdata. - * \param[in] rr1 the first one - * \param[in] rr2 the second one - * \return 0 if equal - * -1 if rr1 comes before rr2 - * +1 if rr2 comes before rr1 - */ -int ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2); - -/** - * compares the wireformat of two rrs, contained in the given buffers. - * \param[in] rr1_buf the first one - * \param[in] rr2_buf the second one - * \return 0 if equal - * -1 if rr1_buf comes before rr2_buf - * +1 if rr2_buf comes before rr1_buf - */ -int ldns_rr_compare_wire(const ldns_buffer *rr1_buf, const ldns_buffer *rr2_buf); - -/** - * returns true of the given rr's are equal. - * Also returns true if one record is a DS that represents the - * same DNSKEY record as the other record - * \param[in] rr1 the first rr - * \param[in] rr2 the second rr - * \return true if equal otherwise false - */ -bool ldns_rr_compare_ds(const ldns_rr *rr1, const ldns_rr *rr2); - -/** - * compares two rr listss. - * \param[in] rrl1 the first one - * \param[in] rrl2 the second one - * \return 0 if equal - * -1 if rrl1 comes before rrl2 - * +1 if rrl2 comes before rrl1 - */ -int ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2); - -/** - * calculates the uncompressed size of an RR. - * \param[in] r the rr to operate on - * \return size of the rr - */ -size_t ldns_rr_uncompressed_size(const ldns_rr *r); - -/** - * converts each dname in a rr to its canonical form. - * \param[in] rr the rr to work on - * \return void - */ -void ldns_rr2canonical(ldns_rr *rr); - -/** - * converts each dname in each rr in a rr_list to its canonical form. - * \param[in] rr_list the rr_list to work on - * \return void - */ -void ldns_rr_list2canonical(const ldns_rr_list *rr_list); - -/** - * counts the number of labels of the ownername. - * \param[in] rr count the labels of this rr - * \return the number of labels - */ -uint8_t ldns_rr_label_count(const ldns_rr *rr); - -/** - * returns the resource record descriptor for the given rr type. - * - * \param[in] type the type value of the rr type - *\return the ldns_rr_descriptor for this type - */ -const ldns_rr_descriptor *ldns_rr_descript(uint16_t type); - -/** - * returns the minimum number of rdata fields of the rr type this descriptor describes. - * - * \param[in] descriptor for an rr type - * \return the minimum number of rdata fields - */ -size_t ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor); - -/** - * returns the maximum number of rdata fields of the rr type this descriptor describes. - * - * \param[in] descriptor for an rr type - * \return the maximum number of rdata fields - */ -size_t ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor); - -/** - * returns the rdf type for the given rdata field number of the rr type for the given descriptor. - * - * \param[in] descriptor for an rr type - * \param[in] field the field number - * \return the rdf type for the field - */ -ldns_rdf_type ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, size_t field); - -/** - * Return the rr_list which matches the rdf at position field. Think - * type-covered stuff for RRSIG - * - * \param[in] l the rr_list to look in - * \param[in] r the rdf to use for the comparison - * \param[in] pos at which position can we find the rdf - * - * \return a new rr list with only the RRs that match - * - */ -ldns_rr_list *ldns_rr_list_subtype_by_rdf(const ldns_rr_list *l, const ldns_rdf *r, size_t pos); - -/** - * convert an rdf of type LDNS_RDF_TYPE_TYPE to an actual - * LDNS_RR_TYPE. This is useful in the case when inspecting - * the rrtype covered field of an RRSIG. - * \param[in] rd the rdf to look at - * \return a ldns_rr_type with equivalent LDNS_RR_TYPE - * - */ -ldns_rr_type ldns_rdf2rr_type(const ldns_rdf *rd); - -/** - * Returns the type of the first element of the RR - * If there are no elements present, 0 is returned - * - * \param[in] rr_list The rr list - * \return rr_type of the first element, or 0 if the list is empty - */ -ldns_rr_type -ldns_rr_list_type(const ldns_rr_list *rr_list); - -/** - * Returns the owner domain name rdf of the first element of the RR - * If there are no elements present, NULL is returned - * - * \param[in] rr_list The rr list - * \return dname of the first element, or NULL if the list is empty - */ -ldns_rdf * -ldns_rr_list_owner(const ldns_rr_list *rr_list); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RR_H */ diff --git a/ldns/ldns/rr_functions.h b/ldns/ldns/rr_functions.h deleted file mode 100644 index 09a28dd..0000000 --- a/ldns/ldns/rr_functions.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * rr_functions.h - * - * the .h file with defs for the per rr - * functions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ -#ifndef LDNS_RR_FUNCTIONS_H -#define LDNS_RR_FUNCTIONS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \file - * - * Defines some extra convenience functions for ldns_rr structures - */ - -/* A / AAAA */ -/** - * returns the address of a LDNS_RR_TYPE_A rr - * \param[in] r the resource record - * \return a ldns_rdf* with the address or NULL on failure - */ -ldns_rdf* ldns_rr_a_address(const ldns_rr *r); - -/** - * sets the address of a LDNS_RR_TYPE_A rr - * \param[in] r the rr to use - * \param[in] f the address to set - * \return true on success, false otherwise - */ -bool ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f); - -/* NS */ -/** - * returns the name of a LDNS_RR_TYPE_NS rr - * \param[in] r the resource record - * \return a ldns_rdf* with the name or NULL on failure - */ -ldns_rdf* ldns_rr_ns_nsdname(const ldns_rr *r); - -/* MX */ -/** - * returns the mx pref. of a LDNS_RR_TYPE_MX rr - * \param[in] r the resource record - * \return a ldns_rdf* with the preference or NULL on failure - */ -ldns_rdf* ldns_rr_mx_preference(const ldns_rr *r); -/** - * returns the mx host of a LDNS_RR_TYPE_MX rr - * \param[in] r the resource record - * \return a ldns_rdf* with the name of the MX host or NULL on failure - */ -ldns_rdf* ldns_rr_mx_exchange(const ldns_rr *r); - -/* RRSIG */ -/** - * returns the type covered of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the resource record - * \return a ldns_rdf* with the type covered or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_typecovered(const ldns_rr *r); -/** - * sets the typecovered of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the typecovered to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f); -/** - * returns the algorithm of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the algorithm or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_algorithm(const ldns_rr *r); -/** - * sets the algorithm of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the algorithm to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f); -/** - * returns the number of labels of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the number of labels or NULL on failure - */ -ldns_rdf *ldns_rr_rrsig_labels(const ldns_rr *r); -/** - * sets the number of labels of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the number of labels to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f); -/** - * returns the original TTL of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the original TTL or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_origttl(const ldns_rr *r); -/** - * sets the original TTL of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the original TTL to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f); -/** - * returns the expiration time of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the expiration time or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_expiration(const ldns_rr *r); -/** - * sets the expireation date of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the expireation date to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f); -/** - * returns the inception time of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the inception time or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_inception(const ldns_rr *r); -/** - * sets the inception date of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the inception date to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f); -/** - * returns the keytag of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the keytag or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_keytag(const ldns_rr *r); -/** - * sets the keytag of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the keytag to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f); -/** - * returns the signers name of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the signers name or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_signame(const ldns_rr *r); -/** - * sets the signers name of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the signers name to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f); -/** - * returns the signature data of a LDNS_RR_TYPE_RRSIG RR - * \param[in] r the resource record - * \return a ldns_rdf* with the signature data or NULL on failure - */ -ldns_rdf* ldns_rr_rrsig_sig(const ldns_rr *r); -/** - * sets the signature data of a LDNS_RR_TYPE_RRSIG rr - * \param[in] r the rr to use - * \param[in] f the signature data to set - * \return true on success, false otherwise - */ -bool ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f); - -/* DNSKEY */ -/** - * returns the flags of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the resource record - * \return a ldns_rdf* with the flags or NULL on failure - */ -ldns_rdf* ldns_rr_dnskey_flags(const ldns_rr *r); -/** - * sets the flags of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the rr to use - * \param[in] f the flags to set - * \return true on success, false otherwise - */ -bool ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f); -/** - * returns the protocol of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the resource record - * \return a ldns_rdf* with the protocol or NULL on failure - */ -ldns_rdf* ldns_rr_dnskey_protocol(const ldns_rr *r); -/** - * sets the protocol of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the rr to use - * \param[in] f the protocol to set - * \return true on success, false otherwise - */ -bool ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f); -/** - * returns the algorithm of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the resource record - * \return a ldns_rdf* with the algorithm or NULL on failure - */ -ldns_rdf* ldns_rr_dnskey_algorithm(const ldns_rr *r); -/** - * sets the algorithm of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the rr to use - * \param[in] f the algorithm to set - * \return true on success, false otherwise - */ -bool ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f); -/** - * returns the key data of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the resource record - * \return a ldns_rdf* with the key data or NULL on failure - */ -ldns_rdf* ldns_rr_dnskey_key(const ldns_rr *r); -/** - * sets the key data of a LDNS_RR_TYPE_DNSKEY rr - * \param[in] r the rr to use - * \param[in] f the key data to set - * \return true on success, false otherwise - */ -bool ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f); - -/** - * get the length of the keydata in bits - * \param[in] keydata the raw key data - * \param[in] len the length of the keydata - * \param[in] alg the cryptographic algorithm this is a key for - * \return the keysize in bits, or 0 on error - */ -size_t ldns_rr_dnskey_key_size_raw(const unsigned char *keydata, - const size_t len, - const ldns_algorithm alg); - -/** - * get the length of the keydata in bits - * \param[in] key the key rr to use - * \return the keysize in bits - */ -size_t ldns_rr_dnskey_key_size(const ldns_rr *key); - -/** - * The type of function to be passed to ldns_rr_soa_increment_func, - * ldns_rr_soa_increment_func_data or ldns_rr_soa_increment_int. - * The function will be called with as the first argument the current serial - * number of the SOA RR to be updated, and as the second argument a value - * given when calling ldns_rr_soa_increment_func_data or - * ldns_rr_soa_increment_int. With ldns_rr_soa_increment_int the pointer - * value holds the integer value passed to ldns_rr_soa_increment_int, - * and it should be cast to intptr_t to be used as an integer by the - * serial modifying function. - */ -typedef uint32_t (*ldns_soa_serial_increment_func_t)(uint32_t, void*); - -/** - * Function to be used with dns_rr_soa_increment_func_int, to set the soa - * serial number. - * \param[in] unused the (unused) current serial number. - * \param[in] data the serial number to be set. - */ -uint32_t ldns_soa_serial_identity(uint32_t unused, void *data); - -/** - * Function to be used with dns_rr_soa_increment_func, to increment the soa - * serial number with one. - * \param[in] s the current serial number. - * \param[in] unused unused. - */ -uint32_t ldns_soa_serial_increment(uint32_t s, void *unused); - -/** - * Function to be used with dns_rr_soa_increment_func_int, to increment the soa - * serial number with a certain amount. - * \param[in] s the current serial number. - * \param[in] data the amount to add to the current serial number. - */ -uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data); - -/** - * Function to be used with ldns_rr_soa_increment_func or - * ldns_rr_soa_increment_func_int to set the soa serial to the number of - * seconds since unix epoch (1-1-1970 00:00). - * When data is given (i.e. the function is called via - * ldns_rr_soa_increment_func_int), it is used as the current time. - * When the resulting serial number is smaller than the current serial number, - * the current serial number is increased by one. - * \param[in] s the current serial number. - * \param[in] data the time in seconds since 1-1-1970 00:00 - */ -uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data); - -/** - * Function to be used with ldns_rr_soa_increment_func or - * ldns_rr_soa_increment_func_int to set the soa serial to the current date - * succeeded by a two digit iteration (datecounter). - * When data is given (i.e. the function is called via - * ldns_rr_soa_increment_func_int), it is used as the current time. - * When the resulting serial number is smaller than the current serial number, - * the current serial number is increased by one. - * \param[in] s the current serial number. - * \param[in] data the time in seconds since 1-1-1970 00:00 - */ -uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data); - -/** - * Increment the serial number of the given SOA by one. - * \param[in] soa The soa rr to be incremented - */ -void ldns_rr_soa_increment( - ldns_rr *soa); - -/** - * Increment the serial number of the given SOA with the given function. - * Included functions to be used here are: ldns_rr_soa_increment, - * ldns_soa_serial_unixtime and ldns_soa_serial_datecounter. - * \param[in] soa The soa rr to be incremented - * \param[in] f the function to use to increment the soa rr. - */ -void ldns_rr_soa_increment_func( - ldns_rr *soa, ldns_soa_serial_increment_func_t f); - -/** - * Increment the serial number of the given SOA with the given function - * passing it the given data argument. - * \param[in] soa The soa rr to be incremented - * \param[in] f the function to use to increment the soa rr. - * \param[in] data this argument will be passed to f as the second argument. - */ -void ldns_rr_soa_increment_func_data( - ldns_rr *soa, ldns_soa_serial_increment_func_t f, void *data); - -/** - * Increment the serial number of the given SOA with the given function - * using data as an argument for the function. - * Included functions to be used here are: ldns_soa_serial_identity, - * ldns_rr_soa_increment_by, ldns_soa_serial_unixtime and - * ldns_soa_serial_datecounter. - * \param[in] soa The soa rr to be incremented - * \param[in] f the function to use to increment the soa rr. - * \param[in] data this argument will be passed to f as the second argument - * (by casting it to void*). - */ -void ldns_rr_soa_increment_func_int( - ldns_rr *soa, ldns_soa_serial_increment_func_t f, int data); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RR_FUNCTIONS_H */ diff --git a/ldns/ldns/sha1.h b/ldns/ldns/sha1.h deleted file mode 100644 index d5b1082..0000000 --- a/ldns/ldns/sha1.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef LDNS_SHA1_H -#define LDNS_SHA1_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_SHA1_BLOCK_LENGTH 64 -#define LDNS_SHA1_DIGEST_LENGTH 20 - -typedef struct { - uint32_t state[5]; - uint64_t count; - unsigned char buffer[LDNS_SHA1_BLOCK_LENGTH]; -} ldns_sha1_ctx; - -void ldns_sha1_init(ldns_sha1_ctx * context); -void ldns_sha1_transform(uint32_t state[5], const unsigned char buffer[LDNS_SHA1_BLOCK_LENGTH]); -void ldns_sha1_update(ldns_sha1_ctx *context, const unsigned char *data, unsigned int len); -void ldns_sha1_final(unsigned char digest[LDNS_SHA1_DIGEST_LENGTH], ldns_sha1_ctx *context); - -/** - * Convenience function to digest a fixed block of data at once. - * - * \param[in] data the data to digest - * \param[in] data_len the length of data in bytes - * \param[out] digest the length of data in bytes - * This pointer MUST have LDNS_SHA1_DIGEST_LENGTH bytes - * available - * \return the SHA1 digest of the given data - */ -unsigned char *ldns_sha1(unsigned char *data, unsigned int data_len, unsigned char *digest); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_SHA1_H */ diff --git a/ldns/ldns/sha2.h b/ldns/ldns/sha2.h deleted file mode 100644 index 238767a..0000000 --- a/ldns/ldns/sha2.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * FILE: sha2.h - * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ - * - * Copyright (c) 2000-2001, Aaron D. Gifford - * All rights reserved. - * - * Modified by Jelte Jansen to fit in ldns, and not clash with any - * system-defined SHA code. - * Changes: - * - Renamed (external) functions and constants to fit ldns style - * - Removed uintXX vs. u_intXX smartness, since ldns needs uintXX - * anyway - * - BYTE ORDER check replaced by simple ifdef as defined or not by - * configure.ac - * - Removed _End and _Data functions - * - Added ldns_shaX(data, len, digest) functions - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ - */ - -#ifndef __LDNS_SHA2_H__ -#define __LDNS_SHA2_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -/* - * Import u_intXX_t size_t type definitions from system headers. You - * may need to change this, or define these things yourself in this - * file. - */ -#include <sys/types.h> - -#if LDNS_BUILD_CONFIG_HAVE_INTTYPES_H - -#include <inttypes.h> - -#endif /* LDNS_BUILD_CONFIG_HAVE_INTTYPES_H */ - - -/*** SHA-256/384/512 Various Length Definitions ***********************/ -#define LDNS_SHA256_BLOCK_LENGTH 64 -#define LDNS_SHA256_DIGEST_LENGTH 32 -#define LDNS_SHA256_DIGEST_STRING_LENGTH (LDNS_SHA256_DIGEST_LENGTH * 2 + 1) -#define LDNS_SHA384_BLOCK_LENGTH 128 -#define LDNS_SHA384_DIGEST_LENGTH 48 -#define LDNS_SHA384_DIGEST_STRING_LENGTH (LDNS_SHA384_DIGEST_LENGTH * 2 + 1) -#define LDNS_SHA512_BLOCK_LENGTH 128 -#define LDNS_SHA512_DIGEST_LENGTH 64 -#define LDNS_SHA512_DIGEST_STRING_LENGTH (LDNS_SHA512_DIGEST_LENGTH * 2 + 1) - - -/*** SHA-256/384/512 Context Structures *******************************/ - -typedef struct _ldns_sha256_CTX { - uint32_t state[8]; - uint64_t bitcount; - uint8_t buffer[LDNS_SHA256_BLOCK_LENGTH]; -} ldns_sha256_CTX; -typedef struct _ldns_sha512_CTX { - uint64_t state[8]; - uint64_t bitcount[2]; - uint8_t buffer[LDNS_SHA512_BLOCK_LENGTH]; -} ldns_sha512_CTX; - -typedef ldns_sha512_CTX ldns_sha384_CTX; - - -/*** SHA-256/384/512 Function Prototypes ******************************/ -void ldns_sha256_init(ldns_sha256_CTX *); -void ldns_sha256_update(ldns_sha256_CTX*, const uint8_t*, size_t); -void ldns_sha256_final(uint8_t[LDNS_SHA256_DIGEST_LENGTH], ldns_sha256_CTX*); - -void ldns_sha384_init(ldns_sha384_CTX*); -void ldns_sha384_update(ldns_sha384_CTX*, const uint8_t*, size_t); -void ldns_sha384_final(uint8_t[LDNS_SHA384_DIGEST_LENGTH], ldns_sha384_CTX*); - -void ldns_sha512_init(ldns_sha512_CTX*); -void ldns_sha512_update(ldns_sha512_CTX*, const uint8_t*, size_t); -void ldns_sha512_final(uint8_t[LDNS_SHA512_DIGEST_LENGTH], ldns_sha512_CTX*); - -/** - * Convenience function to digest a fixed block of data at once. - * - * \param[in] data the data to digest - * \param[in] data_len the length of data in bytes - * \param[out] digest the length of data in bytes - * This pointer MUST have LDNS_SHA256_DIGEST_LENGTH bytes - * available - * \return the SHA1 digest of the given data - */ -unsigned char *ldns_sha256(unsigned char *data, unsigned int data_len, unsigned char *digest); - -/** - * Convenience function to digest a fixed block of data at once. - * - * \param[in] data the data to digest - * \param[in] data_len the length of data in bytes - * \param[out] digest the length of data in bytes - * This pointer MUST have LDNS_SHA384_DIGEST_LENGTH bytes - * available - * \return the SHA1 digest of the given data - */ -unsigned char *ldns_sha384(unsigned char *data, unsigned int data_len, unsigned char *digest); - -/** - * Convenience function to digest a fixed block of data at once. - * - * \param[in] data the data to digest - * \param[in] data_len the length of data in bytes - * \param[out] digest the length of data in bytes - * This pointer MUST have LDNS_SHA512_DIGEST_LENGTH bytes - * available - * \return the SHA1 digest of the given data - */ -unsigned char *ldns_sha512(unsigned char *data, unsigned int data_len, unsigned char *digest); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __LDNS_SHA2_H__ */ diff --git a/ldns/ldns/str2host.h b/ldns/ldns/str2host.h deleted file mode 100644 index e6f7004..0000000 --- a/ldns/ldns/str2host.h +++ /dev/null @@ -1,329 +0,0 @@ -/** - * str2host.h - conversion from str to the host fmt - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -#ifndef LDNS_2HOST_H -#define LDNS_2HOST_H - -#include <ldns/common.h> -#include <ldns/error.h> -#include <ldns/rr.h> -#include <ldns/rdata.h> -#include <ldns/packet.h> -#include <ldns/buffer.h> -#include <ctype.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \file - * - * Defines functions to convert dns data in presentation format or text files - * to internal structures. - */ - -/** - * convert a byte into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] bytestr the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_int8(ldns_rdf **rd, const char *bytestr); - -/** - * convert a string to a int16 in wireformat - * \param[in] rd the rdf where to put the data - * \param[in] shortstr the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_int16(ldns_rdf **rd, const char *shortstr); - -/** - * convert a strings into a 4 byte int in wireformat - * \param[in] rd the rdf where to put the data - * \param[in] longstr the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_int32(ldns_rdf **rd, const char *longstr); - -/** - * convert a time string to a time value in wireformat - * \param[in] rd the rdf where to put the data - * \param[in] time the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_time(ldns_rdf **rd, const char *time); - -/* convert string with NSEC3 salt to wireformat) - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * return ldns_status - */ -ldns_status ldns_str2rdf_nsec3_salt(ldns_rdf **rd, const char *nsec3_salt); - -/* convert a time period (think TTL's) to wireformat) - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * return ldns_status - */ -ldns_status ldns_str2rdf_period(ldns_rdf **rd, const char *str); - -/** - * convert str with an A record into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_a(ldns_rdf **rd, const char *str); - -/** - * convert the str with an AAAA record into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_aaaa(ldns_rdf **rd, const char *str); - -/** - * convert a string into wireformat (think txt record) - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted (NULL terminated) - * \return ldns_status - */ -ldns_status ldns_str2rdf_str(ldns_rdf **rd, const char *str); - -/** - * convert str with the apl record into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_apl(ldns_rdf **rd, const char *str); - -/** - * convert the string with the b64 data into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_b64(ldns_rdf **rd, const char *str); - -/** - * convert the string with the b32 ext hex data into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_b32_ext(ldns_rdf **rd, const char *str); - -/** - * convert a hex value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_hex(ldns_rdf **rd, const char *str); - -/** - * convert string with nsec into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_nsec(ldns_rdf **rd, const char *str); - -/** - * convert a rrtype into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_type(ldns_rdf **rd, const char *str); - -/** - * convert string with a classname into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_class(ldns_rdf **rd, const char *str); - -/** - * convert an certificate algorithm value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_cert_alg(ldns_rdf **rd, const char *str); - -/** - * convert an algorithm value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_alg(ldns_rdf **rd, const char *str); - -/** - * convert a tlsa certificate usage value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_certificate_usage(ldns_rdf **rd, const char *str); - -/** - * convert a tlsa selector value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_selector(ldns_rdf **rd, const char *str); - -/** - * convert a tlsa matching type value into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_matching_type(ldns_rdf **rd, const char *str); - -/** - * convert a string with a unknown RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_unknown(ldns_rdf **rd, const char *str); - -/** - * convert string with a protocol service into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_service(ldns_rdf **rd, const char *str); - -/** - * convert a string with a LOC RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_loc(ldns_rdf **rd, const char *str); - -/** - * convert string with a WKS RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_wks(ldns_rdf **rd, const char *str); - -/** - * convert a str with a NSAP RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_nsap(ldns_rdf **rd, const char *str); - -/** - * convert a str with a ATMA RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_atma(ldns_rdf **rd, const char *str); - -/** - * convert a str with a IPSECKEY RR into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_ipseckey(ldns_rdf **rd, const char *str); - -/** - * convert a dname string into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_dname(ldns_rdf **rd, const char *str); - -/** - * convert 4 * 16bit hex separated by colons into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_ilnp64(ldns_rdf **rd, const char *str); - -/** - * convert 6 hex bytes separated by dashes into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_eui48(ldns_rdf **rd, const char *str); - -/** - * convert 8 hex bytes separated by dashes into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_eui64(ldns_rdf **rd, const char *str); - -/** - * Convert a non-zero sequence of US-ASCII letters and numbers into wireformat - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_tag(ldns_rdf **rd, const char *str); - -/** - * Convert a <character-string> encoding of the value field as specified - * [RFC1035], Section 5.1., encoded as one bug chunk of data. - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_long_str(ldns_rdf **rd, const char *str); - -/** - * Convert a "<algorithm> <hit> <pk>" encoding of the value field as specified - * in Section 6. of [RFC5205], encoded as wireformat as specified in Section 5. - * of [RFC5205]. - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_hip(ldns_rdf **rd, const char *str); - -/** - * Concert a"<precedence> <D-bit> <type> <relay>" encoding - * of the value field as specified in Section 4.3.1 of - * [draft-ietf-mboned-driad-amt-discovery], encoded as wireformat as specified in - * ection 4.2 of [draft-ietf-mboned-driad-amt-discovery] - * \param[in] rd the rdf where to put the data - * \param[in] str the string to be converted - * \return ldns_status - */ -ldns_status ldns_str2rdf_amtrelay(ldns_rdf **rd, const char *str); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_2HOST_H */ diff --git a/ldns/ldns/tsig.h b/ldns/ldns/tsig.h deleted file mode 100644 index bba06ea..0000000 --- a/ldns/ldns/tsig.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * tsig.h -- defines for TSIG [RFC2845] - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - */ - -#ifndef LDNS_TSIG_H -#define LDNS_TSIG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \file - * - * Defines functions for TSIG usage - */ - - -/** - * Contains credentials for TSIG -*/ -typedef struct ldns_tsig_credentials_struct -{ - const char *algorithm; - const char *keyname; - const char *keydata; - /* XXX More eventually. */ -} ldns_tsig_credentials; - -const char *ldns_tsig_algorithm(const ldns_tsig_credentials *); -const char *ldns_tsig_keyname(const ldns_tsig_credentials *); -const char *ldns_tsig_keydata(const ldns_tsig_credentials *); -char *ldns_tsig_keyname_clone(const ldns_tsig_credentials *); -char *ldns_tsig_keydata_clone(const ldns_tsig_credentials *); - -/** - * verifies the tsig rr for the given packet and key. - * The wire must be given too because tsig does not sign normalized packets. - * \param[in] pkt the packet to verify - * \param[in] wire needed to verify the mac - * \param[in] wire_size size of wire - * \param[in] key_name the name of the shared key - * \param[in] key_data the key in base 64 format - * \param[in] mac original mac - * \return true if tsig is correct, false if not, or if tsig is not set - */ -bool ldns_pkt_tsig_verify(ldns_pkt *pkt, const uint8_t *wire, size_t wire_size, const char *key_name, const char *key_data, const ldns_rdf *mac); - -/** - * verifies the tsig rr for the given packet and key. - * The wire must be given too because tsig does not sign normalized packets. - * \param[in] pkt the packet to verify - * \param[in] wire needed to verify the mac - * \param[in] wire_size size of wire - * \param[in] key_name the name of the shared key - * \param[in] key_data the key in base 64 format - * \param[in] mac original mac - * \param[in] tsig_timers_only must be zero for the first packet and positive for subsequent packets. If zero, all digest - components are used to verify the _mac. If non-zero, only the TSIG timers are used to verify the mac. - * \return true if tsig is correct, false if not, or if tsig is not set - */ -bool ldns_pkt_tsig_verify_next(ldns_pkt *pkt, const uint8_t *wire, size_t wire_size, const char *key_name, const char *key_data, const ldns_rdf *mac, - int tsig_timers_only); - -/** - * creates a tsig rr for the given packet and key. - * \param[in] pkt the packet to sign - * \param[in] key_name the name of the shared key - * \param[in] key_data the key in base 64 format - * \param[in] fudge seconds of error permitted in time signed - * \param[in] algorithm_name the name of the algorithm used - * \param[in] query_mac is added to the digest if not NULL (so NULL is for signing queries, not NULL is for signing answers) - * \return status (OK if success) - */ -ldns_status ldns_pkt_tsig_sign(ldns_pkt *pkt, const char *key_name, const char *key_data, uint16_t fudge, - const char *algorithm_name, const ldns_rdf *query_mac); - -/** - * creates a tsig rr for the given packet and key. - * \param[in] pkt the packet to sign - * \param[in] key_name the name of the shared key - * \param[in] key_data the key in base 64 format - * \param[in] fudge seconds of error permitted in time signed - * \param[in] algorithm_name the name of the algorithm used - * \param[in] query_mac is added to the digest if not NULL (so NULL is for signing queries, not NULL is for signing answers) - * \param[in] tsig_timers_only must be zero for the first packet and positive for subsequent packets. If zero, all digest - components are used to create the query_mac. If non-zero, only the TSIG timers are used to create the query_mac. - * \return status (OK if success) - */ -ldns_status ldns_pkt_tsig_sign_next(ldns_pkt *pkt, const char *key_name, const char *key_data, uint16_t fudge, - const char *algorithm_name, const ldns_rdf *query_mac, int tsig_timers_only); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_TSIG_H */ diff --git a/ldns/ldns/update.h b/ldns/ldns/update.h deleted file mode 100644 index 8840d38..0000000 --- a/ldns/ldns/update.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * update.h - * - * Functions for RFC 2136 Dynamic Update - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - */ - -/** - * \file - * - * Defines functions to perform UPDATE queries - */ - - -#ifndef LDNS_UPDATE_H -#define LDNS_UPDATE_H - -#include <ldns/resolver.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * create an update packet from zone name, class and the rr lists - * \param[in] zone_rdf name of the zone - * The returned packet will take ownership of zone_rdf, so the caller should not free it - * \param[in] clas zone class - * \param[in] pr_rrlist list of Prerequisite Section RRs - * \param[in] up_rrlist list of Updates Section RRs - * \param[in] ad_rrlist list of Additional Data Section RRs (currently unused) - * \return the new packet - */ -ldns_pkt *ldns_update_pkt_new(ldns_rdf *zone_rdf, ldns_rr_class clas, const ldns_rr_list *pr_rrlist, const ldns_rr_list *up_rrlist, const ldns_rr_list *ad_rrlist); - -/** - * add tsig credentials to - * a packet from a resolver - * \param[in] p packet to copy to - * \param[in] r resolver to copy from - * - * \return status whether successful or not - */ -ldns_status ldns_update_pkt_tsig_add(ldns_pkt *p, const ldns_resolver *r); - -/* access functions */ - -/** - * Get the zo count - * \param[in] p the packet - * \return the zo count - */ -uint16_t ldns_update_zocount(const ldns_pkt *p); -/** - * Get the zo count - * \param[in] p the packet - * \return the pr count - */ -uint16_t ldns_update_prcount(const ldns_pkt *p); -/** - * Get the zo count - * \param[in] p the packet - * \return the up count - */ -uint16_t ldns_update_upcount(const ldns_pkt *p); -/** - * Get the zo count - * \param[in] p the packet - * \return the ad count - */ -uint16_t ldns_update_ad(const ldns_pkt *p); -/** - * Set the zo count - * \param[in] p the packet - * \param[in] c the zo count to set - */ -void ldns_update_set_zo(ldns_pkt *p, uint16_t c); -/** - * Set the pr count - * \param[in] p the packet - * \param[in] c the pr count to set - */ -void ldns_update_set_prcount(ldns_pkt *p, uint16_t c); -/** - * Set the up count - * \param[in] p the packet - * \param[in] c the up count to set - */ -void ldns_update_set_upcount(ldns_pkt *p, uint16_t c); -/** - * Set the ad count - * \param[in] p the packet - * \param[in] c the ad count to set - */ -void ldns_update_set_adcount(ldns_pkt *p, uint16_t c); - -/* soa functions that need to be configured */ -/* - * Not sure if we want to keep these like this, therefore - * not documented - */ -ldns_status ldns_update_soa_mname(ldns_rdf *zone, ldns_resolver *r, ldns_rr_class c, ldns_rdf **mname); -/* - * Not sure if we want to keep these like this, therefore - * not documented - */ -ldns_status ldns_update_soa_zone_mname(const char *fqdn, ldns_resolver *r, ldns_rr_class c, ldns_rdf **zone_rdf, ldns_rdf **mname_rdf); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_UPDATE_H */ diff --git a/ldns/ldns/util.h.in b/ldns/ldns/util.h.in deleted file mode 100644 index 514fcf3..0000000 --- a/ldns/ldns/util.h.in +++ /dev/null @@ -1,393 +0,0 @@ -/* - * util.h - * - * helper function header file - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004 - * - * See the file LICENSE for the license - */ - -#ifndef _UTIL_H -#define _UTIL_H - -@include_inttypes_h@ -@include_systypes_h@ -@include_unistd_h@ -#include <ldns/common.h> -#include <time.h> -#include <stdio.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#define dprintf(X,Y) fprintf(stderr, (X), (Y)) -/* #define dprintf(X, Y) */ - -#define LDNS_VERSION "@PACKAGE_VERSION@" -#define LDNS_REVISION ((@LDNS_VERSION_MAJOR@<<16)|(@LDNS_VERSION_MINOR@<<8)|(@LDNS_VERSION_MICRO@)) - -/** - * splint static inline workaround - */ -#ifdef S_SPLINT_S -# define INLINE -#else -# ifdef SWIG -# define INLINE static -# else -# define INLINE static inline -# endif -#endif - -/** - * Memory management macros - */ -#define LDNS_MALLOC(type) LDNS_XMALLOC(type, 1) - -#define LDNS_XMALLOC(type, count) ((type *) malloc((count) * sizeof(type))) - -#define LDNS_CALLOC(type, count) ((type *) calloc((count), sizeof(type))) - -#define LDNS_REALLOC(ptr, type) LDNS_XREALLOC((ptr), type, 1) - -#define LDNS_XREALLOC(ptr, type, count) \ - ((type *) realloc((ptr), (count) * sizeof(type))) - -#define LDNS_FREE(ptr) \ - do { free((ptr)); (ptr) = NULL; } while (0) - -#define LDNS_DEP printf("DEPRECATED FUNCTION!\n"); - -/* - * Copy data allowing for unaligned accesses in network byte order - * (big endian). - */ -INLINE uint16_t -ldns_read_uint16(const void *src) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - return ntohs(*(const uint16_t *) src); -#else - const uint8_t *p = (const uint8_t *) src; - return ((uint16_t) p[0] << 8) | (uint16_t) p[1]; -#endif -} - -INLINE uint32_t -ldns_read_uint32(const void *src) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - return ntohl(*(const uint32_t *) src); -#else - const uint8_t *p = (const uint8_t *) src; - return ( ((uint32_t) p[0] << 24) - | ((uint32_t) p[1] << 16) - | ((uint32_t) p[2] << 8) - | (uint32_t) p[3]); -#endif -} - -/* - * Copy data allowing for unaligned accesses in network byte order - * (big endian). - */ -INLINE void -ldns_write_uint16(void *dst, uint16_t data) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - * (uint16_t *) dst = htons(data); -#else - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 8) & 0xff); - p[1] = (uint8_t) (data & 0xff); -#endif -} - -INLINE void -ldns_write_uint32(void *dst, uint32_t data) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - * (uint32_t *) dst = htonl(data); -#else - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 24) & 0xff); - p[1] = (uint8_t) ((data >> 16) & 0xff); - p[2] = (uint8_t) ((data >> 8) & 0xff); - p[3] = (uint8_t) (data & 0xff); -#endif -} - -/* warning. */ -INLINE void -ldns_write_uint64_as_uint48(void *dst, uint64_t data) -{ - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 40) & 0xff); - p[1] = (uint8_t) ((data >> 32) & 0xff); - p[2] = (uint8_t) ((data >> 24) & 0xff); - p[3] = (uint8_t) ((data >> 16) & 0xff); - p[4] = (uint8_t) ((data >> 8) & 0xff); - p[5] = (uint8_t) (data & 0xff); -} - - -/** - * Structure to do a Schwartzian-like transformation, for instance when - * sorting. If you need a transformation on the objects that are sorted, - * you can sue this to store the transformed values, so you do not - * need to do the transformation again for each comparison - */ -struct ldns_schwartzian_compare_struct { - void *original_object; - void *transformed_object; -}; - -/** A general purpose lookup table - * - * Lookup tables are arrays of (id, name) pairs, - * So you can for instance lookup the RCODE 3, which is "NXDOMAIN", - * and vice versa. The lookup tables themselves are defined wherever needed, - * for instance in \ref host2str.c - */ -struct ldns_struct_lookup_table { - int id; - const char *name; -}; -typedef struct ldns_struct_lookup_table ldns_lookup_table; - -/** - * Looks up the table entry by name, returns NULL if not found. - * \param[in] table the lookup table to search in - * \param[in] name what to search for - * \return the item found - */ -ldns_lookup_table *ldns_lookup_by_name(ldns_lookup_table table[], - const char *name); - -/** - * Looks up the table entry by id, returns NULL if not found. - * \param[in] table the lookup table to search in - * \param[in] id what to search for - * \return the item found - */ -ldns_lookup_table *ldns_lookup_by_id(ldns_lookup_table table[], int id); - -/** - * Returns the value of the specified bit - * The bits are counted from left to right, so bit #0 is the - * left most bit. - * \param[in] bits array holding the bits - * \param[in] index to the wanted bit - * \return - */ -int ldns_get_bit(uint8_t bits[], size_t index); - - -/** - * Returns the value of the specified bit - * The bits are counted from right to left, so bit #0 is the - * right most bit. - * \param[in] bits array holding the bits - * \param[in] index to the wanted bit - * \return 1 or 0 depending no the bit state - */ -int ldns_get_bit_r(uint8_t bits[], size_t index); - -/** - * sets the specified bit in the specified byte to - * 1 if value is true, 0 if false - * The bits are counted from right to left, so bit #0 is the - * right most bit. - * \param[in] byte the bit to set the bit in - * \param[in] bit_nr the bit to set (0 <= n <= 7) - * \param[in] value whether to set the bit to 1 or 0 - * \return 1 or 0 depending no the bit state - */ -void ldns_set_bit(uint8_t *byte, int bit_nr, bool value); - -/** - * Returns the value of a to the power of b - * (or 1 of b < 1) - */ -/*@unused@*/ -INLINE long -ldns_power(long a, long b) { - long result = 1; - while (b > 0) { - if (b & 1) { - result *= a; - if (b == 1) { - return result; - } - } - a *= a; - b /= 2; - } - return result; -} - -/** - * Returns the int value of the given (hex) digit - * \param[in] ch the hex char to convert - * \return the converted decimal value - */ -int ldns_hexdigit_to_int(char ch); - -/** - * Returns the char (hex) representation of the given int - * \param[in] ch the int to convert - * \return the converted hex char - */ -char ldns_int_to_hexdigit(int ch); - -/** - * Converts a hex string to binary data - * - * \param[out] data The binary result is placed here. - * At least strlen(str)/2 bytes should be allocated - * \param[in] str The hex string to convert. - * This string should not contain spaces - * \return The number of bytes of converted data, or -1 if one of the arguments * is NULL, or -2 if the string length is not an even number - */ -int -ldns_hexstring_to_data(uint8_t *data, const char *str); - -/** - * Show the internal library version - * \return a string with the version in it - */ -const char * ldns_version(void); - -/** - * Convert TM to seconds since epoch (midnight, January 1st, 1970). - * Like timegm(3), which is not always available. - * \param[in] tm a struct tm* with the date - * \return the seconds since epoch - */ -time_t ldns_mktime_from_utc(const struct tm *tm); - -time_t mktime_from_utc(const struct tm *tm); - -/** - * The function interprets time as the number of seconds since epoch - * with respect to now using serial arithmitics (rfc1982). - * That number of seconds is then converted to broken-out time information. - * This is especially useful when converting the inception and expiration - * fields of RRSIG records. - * - * \param[in] time number of seconds since epoch (midnight, January 1st, 1970) - * to be intepreted as a serial arithmitics number relative to now. - * \param[in] now number of seconds since epoch (midnight, January 1st, 1970) - * to which the time value is compared to determine the final value. - * \param[out] result the struct with the broken-out time information - * \return result on success or NULL on error - */ -struct tm * ldns_serial_arithmitics_gmtime_r(int32_t time, time_t now, struct tm *result); - -/** - * Seed the random function. - * If the file descriptor is specified, the random generator is seeded with - * data from that file. If not, /dev/urandom is used. - * - * applications should call this if they need entropy data within ldns - * If openSSL is available, it is automatically seeded from /dev/urandom - * or /dev/random. - * - * If you need more entropy, or have no openssl available, this function - * MUST be called at the start of the program - * - * If openssl *is* available, this function just adds more entropy - * - * \param[in] fd a file providing entropy data for the seed - * \param[in] size the number of bytes to use as entropy data. If this is 0, - * only the minimal amount is taken (usually 4 bytes) - * \return 0 if seeding succeeds, 1 if it fails - */ -int ldns_init_random(FILE *fd, unsigned int size); - -/** - * Get random number. - * \return random number. - * - */ -uint16_t ldns_get_random(void); - -/** - * Encode data as BubbleBabble - * - * \param[in] data a pointer to data to be encoded - * \param[in] len size the number of bytes of data - * \return a string of BubbleBabble - */ -char *ldns_bubblebabble(uint8_t *data, size_t len); - - -INLINE time_t ldns_time(time_t *t) { return time(t); } - - -/** - * calculates the size needed to store the result of b32_ntop - */ -/*@unused@*/ -INLINE size_t ldns_b32_ntop_calculate_size(size_t src_data_length) -{ - return src_data_length == 0 ? 0 : ((src_data_length - 1) / 5 + 1) * 8; -} - -INLINE size_t ldns_b32_ntop_calculate_size_no_padding(size_t src_data_length) -{ - return ((src_data_length + 3) * 8 / 5) - 4; -} - -int ldns_b32_ntop(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -int ldns_b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -#if ! LDNS_BUILD_CONFIG_HAVE_B32_NTOP - -int b32_ntop(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -int b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -#endif /* ! LDNS_BUILD_CONFIG_HAVE_B32_NTOP */ - - -/** - * calculates the size needed to store the result of b32_pton - */ -/*@unused@*/ -INLINE size_t ldns_b32_pton_calculate_size(size_t src_text_length) -{ - return src_text_length * 5 / 8; -} - -int ldns_b32_pton(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -int ldns_b32_pton_extended_hex(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -#if ! LDNS_BUILD_CONFIG_HAVE_B32_PTON - -int b32_pton(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -int b32_pton_extended_hex(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -#endif /* ! LDNS_BUILD_CONFIG_HAVE_B32_PTON */ - - -#ifdef __cplusplus -} -#endif - -#endif /* !_UTIL_H */ diff --git a/ldns/ldns/wire2host.h b/ldns/ldns/wire2host.h deleted file mode 100644 index 6a7999c..0000000 --- a/ldns/ldns/wire2host.h +++ /dev/null @@ -1,194 +0,0 @@ -/* - * wire2host.h - from wire conversion routines - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains functions that translate dns data from the wire format (as sent - * by servers and clients) to the internal structures. - */ - -#ifndef LDNS_WIRE2HOST_H -#define LDNS_WIRE2HOST_H - -#include <ldns/rdata.h> -#include <ldns/common.h> -#include <ldns/error.h> -#include <ldns/rr.h> -#include <ldns/packet.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* The length of the header */ -#define LDNS_HEADER_SIZE 12 - -/* First octet of flags */ -#define LDNS_RD_MASK 0x01U -#define LDNS_RD_SHIFT 0 -#define LDNS_RD_WIRE(wirebuf) (*(wirebuf+2) & LDNS_RD_MASK) -#define LDNS_RD_SET(wirebuf) (*(wirebuf+2) |= LDNS_RD_MASK) -#define LDNS_RD_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_RD_MASK) - -#define LDNS_TC_MASK 0x02U -#define LDNS_TC_SHIFT 1 -#define LDNS_TC_WIRE(wirebuf) (*(wirebuf+2) & LDNS_TC_MASK) -#define LDNS_TC_SET(wirebuf) (*(wirebuf+2) |= LDNS_TC_MASK) -#define LDNS_TC_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_TC_MASK) - -#define LDNS_AA_MASK 0x04U -#define LDNS_AA_SHIFT 2 -#define LDNS_AA_WIRE(wirebuf) (*(wirebuf+2) & LDNS_AA_MASK) -#define LDNS_AA_SET(wirebuf) (*(wirebuf+2) |= LDNS_AA_MASK) -#define LDNS_AA_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_AA_MASK) - -#define LDNS_OPCODE_MASK 0x78U -#define LDNS_OPCODE_SHIFT 3 -#define LDNS_OPCODE_WIRE(wirebuf) ((*(wirebuf+2) & LDNS_OPCODE_MASK) >> LDNS_OPCODE_SHIFT) -#define LDNS_OPCODE_SET(wirebuf, opcode) \ - (*(wirebuf+2) = ((*(wirebuf+2)) & ~LDNS_OPCODE_MASK) | ((opcode) << LDNS_OPCODE_SHIFT)) - -#define LDNS_QR_MASK 0x80U -#define LDNS_QR_SHIFT 7 -#define LDNS_QR_WIRE(wirebuf) (*(wirebuf+2) & LDNS_QR_MASK) -#define LDNS_QR_SET(wirebuf) (*(wirebuf+2) |= LDNS_QR_MASK) -#define LDNS_QR_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_QR_MASK) - -/* Second octet of flags */ -#define LDNS_RCODE_MASK 0x0fU -#define LDNS_RCODE_SHIFT 0 -#define LDNS_RCODE_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RCODE_MASK) -#define LDNS_RCODE_SET(wirebuf, rcode) \ - (*(wirebuf+3) = ((*(wirebuf+3)) & ~LDNS_RCODE_MASK) | (rcode)) - -#define LDNS_CD_MASK 0x10U -#define LDNS_CD_SHIFT 4 -#define LDNS_CD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_CD_MASK) -#define LDNS_CD_SET(wirebuf) (*(wirebuf+3) |= LDNS_CD_MASK) -#define LDNS_CD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_CD_MASK) - -#define LDNS_AD_MASK 0x20U -#define LDNS_AD_SHIFT 5 -#define LDNS_AD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_AD_MASK) -#define LDNS_AD_SET(wirebuf) (*(wirebuf+3) |= LDNS_AD_MASK) -#define LDNS_AD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_AD_MASK) - -#define LDNS_Z_MASK 0x40U -#define LDNS_Z_SHIFT 6 -#define LDNS_Z_WIRE(wirebuf) (*(wirebuf+3) & LDNS_Z_MASK) -#define LDNS_Z_SET(wirebuf) (*(wirebuf+3) |= LDNS_Z_MASK) -#define LDNS_Z_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_Z_MASK) - -#define LDNS_RA_MASK 0x80U -#define LDNS_RA_SHIFT 7 -#define LDNS_RA_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RA_MASK) -#define LDNS_RA_SET(wirebuf) (*(wirebuf+3) |= LDNS_RA_MASK) -#define LDNS_RA_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_RA_MASK) - -/* Query ID */ -#define LDNS_ID_WIRE(wirebuf) (ldns_read_uint16(wirebuf)) -#define LDNS_ID_SET(wirebuf, id) (ldns_write_uint16(wirebuf, id)) - -/* Counter of the question section */ -#define LDNS_QDCOUNT_OFF 4 -#define LDNS_QDCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_QDCOUNT_OFF)) - -/* Counter of the answer section */ -#define LDNS_ANCOUNT_OFF 6 -#define LDNS_ANCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_ANCOUNT_OFF)) - -/* Counter of the authority section */ -#define LDNS_NSCOUNT_OFF 8 -#define LDNS_NSCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_NSCOUNT_OFF)) - -/* Counter of the additional section */ -#define LDNS_ARCOUNT_OFF 10 -#define LDNS_ARCOUNT(wirebuf) (ldns_read_uint16(wirebuf+LDNS_ARCOUNT_OFF)) - -/** - * converts the data on the uint8_t bytearray (in wire format) to a DNS packet. - * This function will initialize and allocate memory space for the packet - * structure. - * - * \param[in] packet pointer to the structure to hold the packet - * \param[in] data pointer to the buffer with the data - * \param[in] len the length of the data buffer (in bytes) - * \return LDNS_STATUS_OK if everything succeeds, error otherwise - */ -ldns_status ldns_wire2pkt(ldns_pkt **packet, const uint8_t *data, size_t len); - -/** - * converts the data in the ldns_buffer (in wire format) to a DNS packet. - * This function will initialize and allocate memory space for the packet - * structure. - * - * \param[in] packet pointer to the structure to hold the packet - * \param[in] buffer the buffer with the data - * \return LDNS_STATUS_OK if everything succeeds, error otherwise - */ -ldns_status ldns_buffer2pkt_wire(ldns_pkt **packet, const ldns_buffer *buffer); - -/** - * converts the data on the uint8_t bytearray (in wire format) to a DNS - * dname rdata field. This function will initialize and allocate memory - * space for the dname structure. The length of the wiredata of this rdf - * is added to the *pos value. - * - * \param[in] dname pointer to the structure to hold the rdata value - * \param[in] wire pointer to the buffer with the data - * \param[in] max the length of the data buffer (in bytes) - * \param[in] pos the position of the rdf in the buffer (ie. the number of bytes - * from the start of the buffer) - * \return LDNS_STATUS_OK if everything succeeds, error otherwise - */ -ldns_status ldns_wire2dname(ldns_rdf **dname, const uint8_t *wire, size_t max, size_t *pos); - -/** - * converts the data on the uint8_t bytearray (in wire format) to DNS - * rdata fields, and adds them to the list of rdfs of the given rr. - * This function will initialize and allocate memory space for the dname - * structures. - * The length of the wiredata of these rdfs is added to the *pos value. - * - * All rdfs belonging to the RR are read; the rr should have no rdfs - * yet. An error is returned if the format cannot be parsed. - * - * \param[in] rr pointer to the ldns_rr structure to hold the rdata value - * \param[in] wire pointer to the buffer with the data - * \param[in] max the length of the data buffer (in bytes) - * \param[in] pos the position of the rdf in the buffer (ie. the number of bytes - * from the start of the buffer) - * \return LDNS_STATUS_OK if everything succeeds, error otherwise - */ -ldns_status ldns_wire2rdf(ldns_rr *rr, const uint8_t *wire, size_t max, size_t *pos); - -/** - * converts the data on the uint8_t bytearray (in wire format) to a DNS - * resource record. - * This function will initialize and allocate memory space for the rr - * structure. - * The length of the wiredata of this rr is added to the *pos value. - * - * \param[in] rr pointer to the structure to hold the rdata value - * \param[in] wire pointer to the buffer with the data - * \param[in] max the length of the data buffer (in bytes) - * \param[in] pos the position of the rr in the buffer (ie. the number of bytes - * from the start of the buffer) - * \param[in] section the section in the packet the rr is meant for - * \return LDNS_STATUS_OK if everything succeeds, error otherwise - */ -ldns_status ldns_wire2rr(ldns_rr **rr, const uint8_t *wire, size_t max, size_t *pos, ldns_pkt_section section); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_WIRE2HOST_H */ diff --git a/ldns/ldns/zone.h b/ldns/ldns/zone.h deleted file mode 100644 index f30d7c4..0000000 --- a/ldns/ldns/zone.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * zone.h - * - * zone definitions - * - what is it - * - get_glue function - * - search etc - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Defines the ldns_zone structure and functions to manipulate it. - */ - - -#ifndef LDNS_ZONE_H -#define LDNS_ZONE_H - -#include <ldns/common.h> -#include <ldns/rdata.h> -#include <ldns/rr.h> -#include <ldns/error.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * DNS Zone - * - * A list of RR's with some - * extra information which comes from the SOA RR - * Note: nothing has been done to make this efficient (yet). - */ -struct ldns_struct_zone -{ - /** the soa defines a zone */ - ldns_rr *_soa; - /* basically a zone is a list of rr's */ - ldns_rr_list *_rrs; - /* we could change this to be a b-tree etc etc todo */ -}; -typedef struct ldns_struct_zone ldns_zone; - -/** - * create a new ldns_zone structure - * \return a pointer to a ldns_zone structure - */ -ldns_zone * ldns_zone_new(void); - -/** - * Return the soa record of a zone - * \param[in] z the zone to read from - * \return the soa record in the zone - */ -ldns_rr * ldns_zone_soa(const ldns_zone *z); - -/** - * Returns the number of resource records in the zone, NOT counting the SOA record - * \param[in] z the zone to read from - * \return the number of rr's in the zone - */ -size_t ldns_zone_rr_count(const ldns_zone *z); - -/** - * Set the zone's soa record - * \param[in] z the zone to put the new soa in - * \param[in] soa the soa to set - */ -void ldns_zone_set_soa(ldns_zone *z, ldns_rr *soa); - -/** - * Get a list of a zone's content. Note that the SOA - * isn't included in this list. You need to get the - * with ldns_zone_soa. - * \param[in] z the zone to read from - * \return the rrs from this zone - */ -ldns_rr_list * ldns_zone_rrs(const ldns_zone *z); - -/** - * Set the zone's contents - * \param[in] z the zone to put the new soa in - * \param[in] rrlist the rrlist to use - */ -void ldns_zone_set_rrs(ldns_zone *z, ldns_rr_list *rrlist); - -/** - * push an rrlist to a zone structure. This function use pointer - * copying, so the rr_list structure inside z is modified! - * \param[in] z the zone to add to - * \param[in] list the list to add - * \return a true on succes otherwise falsed - */ -bool ldns_zone_push_rr_list(ldns_zone *z, const ldns_rr_list *list); - -/** - * push an single rr to a zone structure. This function use pointer - * copying, so the rr_list structure inside z is modified! - * \param[in] z the zone to add to - * \param[in] rr the rr to add - * \return a true on succes otherwise falsed - */ -bool ldns_zone_push_rr(ldns_zone *z, ldns_rr *rr); - -/** - * Retrieve all resource records from the zone that are glue - * records. The resulting list does are pointer references - * to the zone's data. - * - * Due to the current zone implementation (as a list of rr's), this - * function is extremely slow. Another (probably better) way to do this - * is to use an ldns_dnssec_zone structure and the - * ldns_dnssec_mark_and_get_glue() function. - * - * \param[in] z the zone to look for glue - * \return the rr_list with the glue - */ -ldns_rr_list *ldns_zone_glue_rr_list(const ldns_zone *z); - -/** - * Create a new zone from a file - * \param[out] z the new zone - * \param[in] *fp the filepointer to use - * \param[in] *origin the zones' origin - * \param[in] ttl default ttl to use - * \param[in] c default class to use (IN) - * - * \return ldns_status mesg with an error or LDNS_STATUS_OK - */ -ldns_status ldns_zone_new_frm_fp(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, ldns_rr_class c); - -/** - * Create a new zone from a file, keep track of the line numbering - * \param[out] z the new zone - * \param[in] *fp the filepointer to use - * \param[in] *origin the zones' origin - * \param[in] ttl default ttl to use - * \param[in] c default class to use (IN) - * \param[out] line_nr used for error msg, to get to the line number - * - * \return ldns_status mesg with an error or LDNS_STATUS_OK - */ -ldns_status ldns_zone_new_frm_fp_l(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, ldns_rr_class c, int *line_nr); - -/** - * Frees the allocated memory for the zone, and the rr_list structure in it - * \param[in] zone the zone to free - */ -void ldns_zone_free(ldns_zone *zone); - -/** - * Frees the allocated memory for the zone, the soa rr in it, - * and the rr_list structure in it, including the rr's in that. etc. - * \param[in] zone the zone to free - */ -void ldns_zone_deep_free(ldns_zone *zone); - -/** - * Sort the rrs in a zone, with the current impl. this is slow - * \param[in] zone the zone to sort - */ -void ldns_zone_sort(ldns_zone *zone); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_ZONE_H */ diff --git a/ldns/ltmain.sh b/ldns/ltmain.sh deleted file mode 100644 index 2a50d7f..0000000 --- a/ldns/ltmain.sh +++ /dev/null @@ -1,11436 +0,0 @@ -#! /usr/bin/env sh -## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2019-02-19.15 - -# libtool (GNU libtool) 2.4.7 -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 - -# Copyright (C) 1996-2019, 2021-2022 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - - -PROGRAM=libtool -PACKAGE=libtool -VERSION=2.4.7 -package_revision=2.4.7 - - -## ------ ## -## Usage. ## -## ------ ## - -# Run './libtool --help' for help with using this script from the -# command line. - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# After configure completes, it has a better idea of some of the -# shell tools we need than the defaults used by the functions shared -# with bootstrap, so set those here where they can still be over- -# ridden by the user, but otherwise take precedence. - -: ${AUTOCONF="autoconf"} -: ${AUTOMAKE="automake"} - - -## -------------------------- ## -## Source external libraries. ## -## -------------------------- ## - -# Much of our low-level functionality needs to be sourced from external -# libraries, which are installed to $pkgauxdir. - -# Set a version string for this script. -scriptversion=2019-02-19.15; # UTC - -# General shell script boiler plate, and helper functions. -# Written by Gary V. Vaughan, 2004 - -# This is free software. There is NO warranty; not even for -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# Copyright (C) 2004-2019, 2021 Bootstrap Authors -# -# This file is dual licensed under the terms of the MIT license -# <https://opensource.org/license/MIT>, and GPL version 2 or later -# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of -# these licenses when using or redistributing this software or any of -# the files within it. See the URLs above, or the file `LICENSE` -# included in the Bootstrap distribution for the full license texts. - -# Please report bugs or propose patches to: -# <https://github.com/gnulib-modules/bootstrap/issues> - - -## ------ ## -## Usage. ## -## ------ ## - -# Evaluate this file near the top of your script to gain access to -# the functions and variables defined here: -# -# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh -# -# If you need to override any of the default environment variable -# settings, do that before evaluating this file. - - -## -------------------- ## -## Shell normalisation. ## -## -------------------- ## - -# Some shells need a little help to be as Bourne compatible as possible. -# Before doing anything else, make sure all that help has been provided! - -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac -fi - -# NLS nuisances: We save the old values in case they are required later. -_G_user_locale= -_G_safe_locale= -for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test set = \"\${$_G_var+set}\"; then - save_$_G_var=\$$_G_var - $_G_var=C - export $_G_var - _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" - _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" - fi" -done -# These NLS vars are set unconditionally (bootstrap issue #24). Unset those -# in case the environment reset is needed later and the $save_* variant is not -# defined (see the code above). -LC_ALL=C -LANGUAGE=C -export LANGUAGE LC_ALL - -# Make sure IFS has a sensible default -sp=' ' -nl=' -' -IFS="$sp $nl" - -# There are apparently some retarded systems that use ';' as a PATH separator! -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# func_unset VAR -# -------------- -# Portably unset VAR. -# In some shells, an 'unset VAR' statement leaves a non-zero return -# status if VAR is already unset, which might be problematic if the -# statement is used at the end of a function (thus poisoning its return -# value) or when 'set -e' is active (causing even a spurious abort of -# the script in this case). -func_unset () -{ - { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } -} - - -# Make sure CDPATH doesn't cause `cd` commands to output the target dir. -func_unset CDPATH - -# Make sure ${,E,F}GREP behave sanely. -func_unset GREP_OPTIONS - - -## ------------------------- ## -## Locate command utilities. ## -## ------------------------- ## - - -# func_executable_p FILE -# ---------------------- -# Check that FILE is an executable regular file. -func_executable_p () -{ - test -f "$1" && test -x "$1" -} - - -# func_path_progs PROGS_LIST CHECK_FUNC [PATH] -# -------------------------------------------- -# Search for either a program that responds to --version with output -# containing "GNU", or else returned by CHECK_FUNC otherwise, by -# trying all the directories in PATH with each of the elements of -# PROGS_LIST. -# -# CHECK_FUNC should accept the path to a candidate program, and -# set $func_check_prog_result if it truncates its output less than -# $_G_path_prog_max characters. -func_path_progs () -{ - _G_progs_list=$1 - _G_check_func=$2 - _G_PATH=${3-"$PATH"} - - _G_path_prog_max=0 - _G_path_prog_found=false - _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} - for _G_dir in $_G_PATH; do - IFS=$_G_save_IFS - test -z "$_G_dir" && _G_dir=. - for _G_prog_name in $_G_progs_list; do - for _exeext in '' .EXE; do - _G_path_prog=$_G_dir/$_G_prog_name$_exeext - func_executable_p "$_G_path_prog" || continue - case `"$_G_path_prog" --version 2>&1` in - *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; - *) $_G_check_func $_G_path_prog - func_path_progs_result=$func_check_prog_result - ;; - esac - $_G_path_prog_found && break 3 - done - done - done - IFS=$_G_save_IFS - test -z "$func_path_progs_result" && { - echo "no acceptable sed could be found in \$PATH" >&2 - exit 1 - } -} - - -# We want to be able to use the functions in this file before configure -# has figured out where the best binaries are kept, which means we have -# to search for them ourselves - except when the results are already set -# where we skip the searches. - -# Unless the user overrides by setting SED, search the path for either GNU -# sed, or the sed that truncates its output the least. -test -z "$SED" && { - _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for _G_i in 1 2 3 4 5 6 7; do - _G_sed_script=$_G_sed_script$nl$_G_sed_script - done - echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed - _G_sed_script= - - func_check_prog_sed () - { - _G_path_prog=$1 - - _G_count=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo '' >> conftest.nl - "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" - rm -f conftest.sed - SED=$func_path_progs_result -} - - -# Unless the user overrides by setting GREP, search the path for either GNU -# grep, or the grep that truncates its output the least. -test -z "$GREP" && { - func_check_prog_grep () - { - _G_path_prog=$1 - - _G_count=0 - _G_path_prog_max=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo 'GREP' >> conftest.nl - "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" - GREP=$func_path_progs_result -} - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# All uppercase variable names are used for environment variables. These -# variables can be overridden by the user before calling a script that -# uses them if a suitable command of that name is not already available -# in the command search PATH. - -: ${CP="cp -f"} -: ${ECHO="printf %s\n"} -: ${EGREP="$GREP -E"} -: ${FGREP="$GREP -F"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} - - -## -------------------- ## -## Useful sed snippets. ## -## -------------------- ## - -sed_dirname='s|/[^/]*$||' -sed_basename='s|^.*/||' - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s|\([`"$\\]\)|\\\1|g' - -# Same as above, but do not quote variable references. -sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' - -# Sed substitution that converts a w32 file name or path -# that contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-'\' parameter expansions in output of sed_double_quote_subst that -# were '\'-ed in input to the same. If an odd number of '\' preceded a -# '$' in input to sed_double_quote_subst, that '$' was protected from -# expansion. Since each input '\' is now two '\'s, look for any number -# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. -_G_bs='\\' -_G_bs2='\\\\' -_G_bs4='\\\\\\\\' -_G_dollar='\$' -sed_double_backslash="\ - s/$_G_bs4/&\\ -/g - s/^$_G_bs2$_G_dollar/$_G_bs&/ - s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g - s/\n//g" - -# require_check_ifs_backslash -# --------------------------- -# Check if we can use backslash as IFS='\' separator, and set -# $check_ifs_backshlash_broken to ':' or 'false'. -require_check_ifs_backslash=func_require_check_ifs_backslash -func_require_check_ifs_backslash () -{ - _G_save_IFS=$IFS - IFS='\' - _G_check_ifs_backshlash='a\\b' - for _G_i in $_G_check_ifs_backshlash - do - case $_G_i in - a) - check_ifs_backshlash_broken=false - ;; - '') - break - ;; - *) - check_ifs_backshlash_broken=: - break - ;; - esac - done - IFS=$_G_save_IFS - require_check_ifs_backslash=: -} - - -## ----------------- ## -## Global variables. ## -## ----------------- ## - -# Except for the global variables explicitly listed below, the following -# functions in the '^func_' namespace, and the '^require_' namespace -# variables initialised in the 'Resource management' section, sourcing -# this file will not pollute your global namespace with anything -# else. There's no portable way to scope variables in Bourne shell -# though, so actually running these functions will sometimes place -# results into a variable named after the function, and often use -# temporary variables in the '^_G_' namespace. If you are careful to -# avoid using those namespaces casually in your sourcing script, things -# should continue to work as you expect. And, of course, you can freely -# overwrite any of the functions or variables defined here before -# calling anything to customize them. - -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. -EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. - -# Allow overriding, eg assuming that you follow the convention of -# putting '$debug_cmd' at the start of all your functions, you can get -# bash to show function call trace with: -# -# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name -debug_cmd=${debug_cmd-":"} -exit_cmd=: - -# By convention, finish your script with: -# -# exit $exit_status -# -# so that you can set exit_status to non-zero if you want to indicate -# something went wrong during execution without actually bailing out at -# the point of failure. -exit_status=$EXIT_SUCCESS - -# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh -# is ksh but when the shell is invoked as "sh" and the current value of -# the _XPG environment variable is not equal to 1 (one), the special -# positional parameter $0, within a function call, is the name of the -# function. -progpath=$0 - -# The name of this program. -progname=`$ECHO "$progpath" |$SED "$sed_basename"` - -# Make sure we have an absolute progpath for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` - progdir=`cd "$progdir" && pwd` - progpath=$progdir/$progname - ;; - *) - _G_IFS=$IFS - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS=$_G_IFS - test -x "$progdir/$progname" && break - done - IFS=$_G_IFS - test -n "$progdir" || progdir=`pwd` - progpath=$progdir/$progname - ;; -esac - - -## ----------------- ## -## Standard options. ## -## ----------------- ## - -# The following options affect the operation of the functions defined -# below, and should be set appropriately depending on run-time para- -# meters passed on the command line. - -opt_dry_run=false -opt_quiet=false -opt_verbose=false - -# Categories 'all' and 'none' are always available. Append any others -# you will pass as the first argument to func_warning from your own -# code. -warning_categories= - -# By default, display warnings according to 'opt_warning_types'. Set -# 'warning_func' to ':' to elide all warnings, or func_fatal_error to -# treat the next displayed warning as a fatal error. -warning_func=func_warn_and_continue - -# Set to 'all' to display all warnings, 'none' to suppress all -# warnings, or a space delimited list of some subset of -# 'warning_categories' to display only the listed warnings. -opt_warning_types=all - - -## -------------------- ## -## Resource management. ## -## -------------------- ## - -# This section contains definitions for functions that each ensure a -# particular resource (a file, or a non-empty configuration variable for -# example) is available, and if appropriate to extract default values -# from pertinent package files. Call them using their associated -# 'require_*' variable to ensure that they are executed, at most, once. -# -# It's entirely deliberate that calling these functions can set -# variables that don't obey the namespace limitations obeyed by the rest -# of this file, in order that that they be as useful as possible to -# callers. - - -# require_term_colors -# ------------------- -# Allow display of bold text on terminals that support it. -require_term_colors=func_require_term_colors -func_require_term_colors () -{ - $debug_cmd - - test -t 1 && { - # COLORTERM and USE_ANSI_COLORS environment variables take - # precedence, because most terminfo databases neglect to describe - # whether color sequences are supported. - test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} - - if test 1 = "$USE_ANSI_COLORS"; then - # Standard ANSI escape sequences - tc_reset='[0m' - tc_bold='[1m'; tc_standout='[7m' - tc_red='[31m'; tc_green='[32m' - tc_blue='[34m'; tc_cyan='[36m' - else - # Otherwise trust the terminfo database after all. - test -n "`tput sgr0 2>/dev/null`" && { - tc_reset=`tput sgr0` - test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` - tc_standout=$tc_bold - test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` - test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` - test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` - test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` - test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` - } - fi - } - - require_term_colors=: -} - - -## ----------------- ## -## Function library. ## -## ----------------- ## - -# This section contains a variety of useful functions to call in your -# scripts. Take note of the portable wrappers for features provided by -# some modern shells, which will fall back to slower equivalents on -# less featureful shells. - - -# func_append VAR VALUE -# --------------------- -# Append VALUE onto the existing contents of VAR. - - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - - # _G_HAVE_PLUSEQ_OP - # Can be empty, in which case the shell is probed, "yes" if += is - # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes - -if test yes = "$_G_HAVE_PLUSEQ_OP" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_append () - { - $debug_cmd - - eval "$1+=\$2" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_append () - { - $debug_cmd - - eval "$1=\$$1\$2" - } -fi - - -# func_append_quoted VAR VALUE -# ---------------------------- -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -if test yes = "$_G_HAVE_PLUSEQ_OP"; then - eval 'func_append_quoted () - { - $debug_cmd - - func_quote_arg pretty "$2" - eval "$1+=\\ \$func_quote_arg_result" - }' -else - func_append_quoted () - { - $debug_cmd - - func_quote_arg pretty "$2" - eval "$1=\$$1\\ \$func_quote_arg_result" - } -fi - - -# func_append_uniq VAR VALUE -# -------------------------- -# Append unique VALUE onto the existing contents of VAR, assuming -# entries are delimited by the first character of VALUE. For example: -# -# func_append_uniq options " --another-option option-argument" -# -# will only append to $options if " --another-option option-argument " -# is not already present somewhere in $options already (note spaces at -# each end implied by leading space in second argument). -func_append_uniq () -{ - $debug_cmd - - eval _G_current_value='`$ECHO $'$1'`' - _G_delim=`expr "$2" : '\(.\)'` - - case $_G_delim$_G_current_value$_G_delim in - *"$2$_G_delim"*) ;; - *) func_append "$@" ;; - esac -} - - -# func_arith TERM... -# ------------------ -# Set func_arith_result to the result of evaluating TERMs. - test -z "$_G_HAVE_ARITH_OP" \ - && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ - && _G_HAVE_ARITH_OP=yes - -if test yes = "$_G_HAVE_ARITH_OP"; then - eval 'func_arith () - { - $debug_cmd - - func_arith_result=$(( $* )) - }' -else - func_arith () - { - $debug_cmd - - func_arith_result=`expr "$@"` - } -fi - - -# func_basename FILE -# ------------------ -# Set func_basename_result to FILE with everything up to and including -# the last / stripped. -if test yes = "$_G_HAVE_XSI_OPS"; then - # If this shell supports suffix pattern removal, then use it to avoid - # forking. Hide the definitions single quotes in case the shell chokes - # on unsupported syntax... - _b='func_basename_result=${1##*/}' - _d='case $1 in - */*) func_dirname_result=${1%/*}$2 ;; - * ) func_dirname_result=$3 ;; - esac' - -else - # ...otherwise fall back to using sed. - _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' - _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` - if test "X$func_dirname_result" = "X$1"; then - func_dirname_result=$3 - else - func_append func_dirname_result "$2" - fi' -fi - -eval 'func_basename () -{ - $debug_cmd - - '"$_b"' -}' - - -# func_dirname FILE APPEND NONDIR_REPLACEMENT -# ------------------------------------------- -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -eval 'func_dirname () -{ - $debug_cmd - - '"$_d"' -}' - - -# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT -# -------------------------------------------------------- -# Perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# For efficiency, we do not delegate to the functions above but instead -# duplicate the functionality here. -eval 'func_dirname_and_basename () -{ - $debug_cmd - - '"$_b"' - '"$_d"' -}' - - -# func_echo ARG... -# ---------------- -# Echo program name prefixed message. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_echo_all ARG... -# -------------------- -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - - -# func_echo_infix_1 INFIX ARG... -# ------------------------------ -# Echo program name, followed by INFIX on the first line, with any -# additional lines not showing INFIX. -func_echo_infix_1 () -{ - $debug_cmd - - $require_term_colors - - _G_infix=$1; shift - _G_indent=$_G_infix - _G_prefix="$progname: $_G_infix: " - _G_message=$* - - # Strip color escape sequences before counting printable length - for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" - do - test -n "$_G_tc" && { - _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` - _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` - } - done - _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes - - func_echo_infix_1_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_infix_1_IFS - $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 - _G_prefix=$_G_indent - done - IFS=$func_echo_infix_1_IFS -} - - -# func_error ARG... -# ----------------- -# Echo program name prefixed message to standard error. -func_error () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 -} - - -# func_fatal_error ARG... -# ----------------------- -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - $debug_cmd - - func_error "$*" - exit $EXIT_FAILURE -} - - -# func_grep EXPRESSION FILENAME -# ----------------------------- -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $debug_cmd - - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_len STRING -# --------------- -# Set func_len_result to the length of STRING. STRING may not -# start with a hyphen. - test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_len () - { - $debug_cmd - - func_len_result=${#1} - }' -else - func_len () - { - $debug_cmd - - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` - } -fi - - -# func_mkdir_p DIRECTORY-PATH -# --------------------------- -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - $debug_cmd - - _G_directory_path=$1 - _G_dir_list= - - if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then - - # Protect directory names starting with '-' - case $_G_directory_path in - -*) _G_directory_path=./$_G_directory_path ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$_G_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - _G_dir_list=$_G_directory_path:$_G_dir_list - - # If the last portion added has no slash in it, the list is done - case $_G_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` - done - _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` - - func_mkdir_p_IFS=$IFS; IFS=: - for _G_dir in $_G_dir_list; do - IFS=$func_mkdir_p_IFS - # mkdir can fail with a 'File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$_G_dir" 2>/dev/null || : - done - IFS=$func_mkdir_p_IFS - - # Bail out if we (or some other process) failed to create a directory. - test -d "$_G_directory_path" || \ - func_fatal_error "Failed to create '$1'" - fi -} - - -# func_mktempdir [BASENAME] -# ------------------------- -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, BASENAME is the basename for that directory. -func_mktempdir () -{ - $debug_cmd - - _G_template=${TMPDIR-/tmp}/${1-$progname} - - if test : = "$opt_dry_run"; then - # Return a directory name, but don't create it in dry-run mode - _G_tmpdir=$_G_template-$$ - else - - # If mktemp works, use that first and foremost - _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - - if test ! -d "$_G_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - _G_tmpdir=$_G_template-${RANDOM-0}$$ - - func_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$_G_tmpdir" - umask $func_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$_G_tmpdir" || \ - func_fatal_error "cannot create temporary directory '$_G_tmpdir'" - fi - - $ECHO "$_G_tmpdir" -} - - -# func_normal_abspath PATH -# ------------------------ -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -func_normal_abspath () -{ - $debug_cmd - - # These SED scripts presuppose an absolute path with a trailing slash. - _G_pathcar='s|^/\([^/]*\).*$|\1|' - _G_pathcdr='s|^/[^/]*||' - _G_removedotparts=':dotsl - s|/\./|/|g - t dotsl - s|/\.$|/|' - _G_collapseslashes='s|/\{1,\}|/|g' - _G_finalslash='s|/*$|/|' - - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` - while :; do - # Processed it all yet? - if test / = "$func_normal_abspath_tpath"; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result"; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - - -# func_notquiet ARG... -# -------------------- -# Echo program name prefixed message only when not in quiet mode. -func_notquiet () -{ - $debug_cmd - - $opt_quiet || func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - - -# func_relative_path SRCDIR DSTDIR -# -------------------------------- -# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. -func_relative_path () -{ - $debug_cmd - - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=$func_dirname_result - if test -z "$func_relative_path_tlibdir"; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test -n "$func_stripname_result"; then - func_append func_relative_path_result "/$func_stripname_result" - fi - - # Normalisation. If bindir is libdir, return '.' else relative path. - if test -n "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - fi - - test -n "$func_relative_path_result" || func_relative_path_result=. - - : -} - - -# func_quote_portable EVAL ARG -# ---------------------------- -# Internal function to portably implement func_quote_arg. Note that we still -# keep attention to performance here so we as much as possible try to avoid -# calling sed binary (so far O(N) complexity as long as func_append is O(1)). -func_quote_portable () -{ - $debug_cmd - - $require_check_ifs_backslash - - func_quote_portable_result=$2 - - # one-time-loop (easy break) - while true - do - if $1; then - func_quote_portable_result=`$ECHO "$2" | $SED \ - -e "$sed_double_quote_subst" -e "$sed_double_backslash"` - break - fi - - # Quote for eval. - case $func_quote_portable_result in - *[\\\`\"\$]*) - # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string - # contains the shell wildcard characters. - case $check_ifs_backshlash_broken$func_quote_portable_result in - :*|*[\[\*\?]*) - func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ - | $SED "$sed_quote_subst"` - break - ;; - esac - - func_quote_portable_old_IFS=$IFS - for _G_char in '\' '`' '"' '$' - do - # STATE($1) PREV($2) SEPARATOR($3) - set start "" "" - func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy - IFS=$_G_char - for _G_part in $func_quote_portable_result - do - case $1 in - quote) - func_append func_quote_portable_result "$3$2" - set quote "$_G_part" "\\$_G_char" - ;; - start) - set first "" "" - func_quote_portable_result= - ;; - first) - set quote "$_G_part" "" - ;; - esac - done - done - IFS=$func_quote_portable_old_IFS - ;; - *) ;; - esac - break - done - - func_quote_portable_unquoted_result=$func_quote_portable_result - case $func_quote_portable_result in - # double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # many bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_portable_result=\"$func_quote_portable_result\" - ;; - esac -} - - -# func_quotefast_eval ARG -# ----------------------- -# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', -# but optimized for speed. Result is stored in $func_quotefast_eval. -if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then - printf -v _GL_test_printf_tilde %q '~' - if test '\~' = "$_GL_test_printf_tilde"; then - func_quotefast_eval () - { - printf -v func_quotefast_eval_result %q "$1" - } - else - # Broken older Bash implementations. Make those faster too if possible. - func_quotefast_eval () - { - case $1 in - '~'*) - func_quote_portable false "$1" - func_quotefast_eval_result=$func_quote_portable_result - ;; - *) - printf -v func_quotefast_eval_result %q "$1" - ;; - esac - } - fi -else - func_quotefast_eval () - { - func_quote_portable false "$1" - func_quotefast_eval_result=$func_quote_portable_result - } -fi - - -# func_quote_arg MODEs ARG -# ------------------------ -# Quote one ARG to be evaled later. MODEs argument may contain zero or more -# specifiers listed below separated by ',' character. This function returns two -# values: -# i) func_quote_arg_result -# double-quoted (when needed), suitable for a subsequent eval -# ii) func_quote_arg_unquoted_result -# has all characters that are still active within double -# quotes backslashified. Available only if 'unquoted' is specified. -# -# Available modes: -# ---------------- -# 'eval' (default) -# - escape shell special characters -# 'expand' -# - the same as 'eval'; but do not quote variable references -# 'pretty' -# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might -# be used later in func_quote to get output like: 'echo "a b"' instead -# of 'echo a\ b'. This is slower than default on some shells. -# 'unquoted' -# - produce also $func_quote_arg_unquoted_result which does not contain -# wrapping double-quotes. -# -# Examples for 'func_quote_arg pretty,unquoted string': -# -# string | *_result | *_unquoted_result -# ------------+-----------------------+------------------- -# " | \" | \" -# a b | "a b" | a b -# "a b" | "\"a b\"" | \"a b\" -# * | "*" | * -# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" -# -# Examples for 'func_quote_arg pretty,unquoted,expand string': -# -# string | *_result | *_unquoted_result -# --------------+---------------------+-------------------- -# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" -func_quote_arg () -{ - _G_quote_expand=false - case ,$1, in - *,expand,*) - _G_quote_expand=: - ;; - esac - - case ,$1, in - *,pretty,*|*,expand,*|*,unquoted,*) - func_quote_portable $_G_quote_expand "$2" - func_quote_arg_result=$func_quote_portable_result - func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result - ;; - *) - # Faster quote-for-eval for some shells. - func_quotefast_eval "$2" - func_quote_arg_result=$func_quotefast_eval_result - ;; - esac -} - - -# func_quote MODEs ARGs... -# ------------------------ -# Quote all ARGs to be evaled later and join them into single command. See -# func_quote_arg's description for more info. -func_quote () -{ - $debug_cmd - _G_func_quote_mode=$1 ; shift - func_quote_result= - while test 0 -lt $#; do - func_quote_arg "$_G_func_quote_mode" "$1" - if test -n "$func_quote_result"; then - func_append func_quote_result " $func_quote_arg_result" - else - func_append func_quote_result "$func_quote_arg_result" - fi - shift - done -} - - -# func_stripname PREFIX SUFFIX NAME -# --------------------------------- -# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_stripname () - { - $debug_cmd - - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary variable first. - func_stripname_result=$3 - func_stripname_result=${func_stripname_result#"$1"} - func_stripname_result=${func_stripname_result%"$2"} - }' -else - func_stripname () - { - $debug_cmd - - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; - esac - } -fi - - -# func_show_eval CMD [FAIL_EXP] -# ----------------------------- -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - func_quote_arg pretty,expand "$_G_cmd" - eval "func_notquiet $func_quote_arg_result" - - $opt_dry_run || { - eval "$_G_cmd" - _G_status=$? - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_show_eval_locale CMD [FAIL_EXP] -# ------------------------------------ -# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - $opt_quiet || { - func_quote_arg expand,pretty "$_G_cmd" - eval "func_echo $func_quote_arg_result" - } - - $opt_dry_run || { - eval "$_G_user_locale - $_G_cmd" - _G_status=$? - eval "$_G_safe_locale" - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_tr_sh -# ---------- -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - $debug_cmd - - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_verbose ARG... -# ------------------- -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $debug_cmd - - $opt_verbose && func_echo "$*" - - : -} - - -# func_warn_and_continue ARG... -# ----------------------------- -# Echo program name prefixed warning message to standard error. -func_warn_and_continue () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 -} - - -# func_warning CATEGORY ARG... -# ---------------------------- -# Echo program name prefixed warning message to standard error. Warning -# messages can be filtered according to CATEGORY, where this function -# elides messages where CATEGORY is not listed in the global variable -# 'opt_warning_types'. -func_warning () -{ - $debug_cmd - - # CATEGORY must be in the warning_categories list! - case " $warning_categories " in - *" $1 "*) ;; - *) func_internal_error "invalid warning category '$1'" ;; - esac - - _G_category=$1 - shift - - case " $opt_warning_types " in - *" $_G_category "*) $warning_func ${1+"$@"} ;; - esac -} - - -# func_sort_ver VER1 VER2 -# ----------------------- -# 'sort -V' is not generally available. -# Note this deviates from the version comparison in automake -# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a -# but this should suffice as we won't be specifying old -# version formats or redundant trailing .0 in bootstrap.conf. -# If we did want full compatibility then we should probably -# use m4_version_compare from autoconf. -func_sort_ver () -{ - $debug_cmd - - printf '%s\n%s\n' "$1" "$2" \ - | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n -} - -# func_lt_ver PREV CURR -# --------------------- -# Return true if PREV and CURR are in the correct order according to -# func_sort_ver, otherwise false. Use it like this: -# -# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." -func_lt_ver () -{ - $debug_cmd - - test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: -#! /bin/sh - -# A portable, pluggable option parser for Bourne shell. -# Written by Gary V. Vaughan, 2010 - -# This is free software. There is NO warranty; not even for -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# -# Copyright (C) 2010-2019, 2021 Bootstrap Authors -# -# This file is dual licensed under the terms of the MIT license -# <https://opensource.org/license/MIT>, and GPL version 2 or later -# <http://www.gnu.org/licenses/gpl-2.0.html>. You must apply one of -# these licenses when using or redistributing this software or any of -# the files within it. See the URLs above, or the file `LICENSE` -# included in the Bootstrap distribution for the full license texts. - -# Please report bugs or propose patches to: -# <https://github.com/gnulib-modules/bootstrap/issues> - -# Set a version string for this script. -scriptversion=2019-02-19.15; # UTC - - -## ------ ## -## Usage. ## -## ------ ## - -# This file is a library for parsing options in your shell scripts along -# with assorted other useful supporting features that you can make use -# of too. -# -# For the simplest scripts you might need only: -# -# #!/bin/sh -# . relative/path/to/funclib.sh -# . relative/path/to/options-parser -# scriptversion=1.0 -# func_options ${1+"$@"} -# eval set dummy "$func_options_result"; shift -# ...rest of your script... -# -# In order for the '--version' option to work, you will need to have a -# suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# Copyright'. -# -# For '-h' and '--help' to work, you will also need a one line -# description of your script's purpose in a comment directly above the -# '# Written by ' line, like the one at the top of this file. -# -# The default options also support '--debug', which will turn on shell -# execution tracing (see the comment above debug_cmd below for another -# use), and '--verbose' and the func_verbose function to allow your script -# to display verbose messages only when your user has specified -# '--verbose'. -# -# After sourcing this file, you can plug in processing for additional -# options by amending the variables from the 'Configuration' section -# below, and following the instructions in the 'Option parsing' -# section further down. - -## -------------- ## -## Configuration. ## -## -------------- ## - -# You should override these variables in your script after sourcing this -# file so that they reflect the customisations you have added to the -# option parser. - -# The usage line for option parsing errors and the start of '-h' and -# '--help' output messages. You can embed shell variables for delayed -# expansion at the time the message is displayed, but you will need to -# quote other shell meta-characters carefully to prevent them being -# expanded when the contents are evaled. -usage='$progpath [OPTION]...' - -# Short help message in response to '-h' and '--help'. Add to this or -# override it after sourcing this library to reflect the full set of -# options your script accepts. -usage_message="\ - --debug enable verbose shell tracing - -W, --warnings=CATEGORY - report the warnings falling in CATEGORY [all] - -v, --verbose verbosely report processing - --version print version information and exit - -h, --help print short or long help message and exit -" - -# Additional text appended to 'usage_message' in response to '--help'. -long_help_message=" -Warning categories include: - 'all' show all warnings - 'none' turn off all the warnings - 'error' warnings are treated as fatal errors" - -# Help message printed before fatal option parsing errors. -fatal_help="Try '\$progname --help' for more information." - - - -## ------------------------- ## -## Hook function management. ## -## ------------------------- ## - -# This section contains functions for adding, removing, and running hooks -# in the main code. A hook is just a list of function names that can be -# run in order later on. - -# func_hookable FUNC_NAME -# ----------------------- -# Declare that FUNC_NAME will run hooks added with -# 'func_add_hook FUNC_NAME ...'. -func_hookable () -{ - $debug_cmd - - func_append hookable_fns " $1" -} - - -# func_add_hook FUNC_NAME HOOK_FUNC -# --------------------------------- -# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must -# first have been declared "hookable" by a call to 'func_hookable'. -func_add_hook () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not accept hook functions." ;; - esac - - eval func_append ${1}_hooks '" $2"' -} - - -# func_remove_hook FUNC_NAME HOOK_FUNC -# ------------------------------------ -# Remove HOOK_FUNC from the list of hook functions to be called by -# FUNC_NAME. -func_remove_hook () -{ - $debug_cmd - - eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' -} - - -# func_propagate_result FUNC_NAME_A FUNC_NAME_B -# --------------------------------------------- -# If the *_result variable of FUNC_NAME_A _is set_, assign its value to -# *_result variable of FUNC_NAME_B. -func_propagate_result () -{ - $debug_cmd - - func_propagate_result_result=: - if eval "test \"\${${1}_result+set}\" = set" - then - eval "${2}_result=\$${1}_result" - else - func_propagate_result_result=false - fi -} - - -# func_run_hooks FUNC_NAME [ARG]... -# --------------------------------- -# Run all hook functions registered to FUNC_NAME. -# It's assumed that the list of hook functions contains nothing more -# than a whitespace-delimited list of legal shell function names, and -# no effort is wasted trying to catch shell meta-characters or preserve -# whitespace. -func_run_hooks () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook functions." ;; - esac - - eval _G_hook_fns=\$$1_hooks; shift - - for _G_hook in $_G_hook_fns; do - func_unset "${_G_hook}_result" - eval $_G_hook '${1+"$@"}' - func_propagate_result $_G_hook func_run_hooks - if $func_propagate_result_result; then - eval set dummy "$func_run_hooks_result"; shift - fi - done -} - - - -## --------------- ## -## Option parsing. ## -## --------------- ## - -# In order to add your own option parsing hooks, you must accept the -# full positional parameter list from your hook function. You may remove -# or edit any options that you action, and then pass back the remaining -# unprocessed options in '<hooked_function_name>_result', escaped -# suitably for 'eval'. -# -# The '<hooked_function_name>_result' variable is automatically unset -# before your hook gets called; for best performance, only set the -# *_result variable when necessary (i.e. don't call the 'func_quote' -# function unnecessarily because it can be an expensive operation on some -# machines). -# -# Like this: -# -# my_options_prep () -# { -# $debug_cmd -# -# # Extend the existing usage message. -# usage_message=$usage_message' -# -s, --silent don'\''t print informational messages -# ' -# # No change in '$@' (ignored completely by this hook). Leave -# # my_options_prep_result variable intact. -# } -# func_add_hook func_options_prep my_options_prep -# -# -# my_silent_option () -# { -# $debug_cmd -# -# args_changed=false -# -# # Note that, for efficiency, we parse as many options as we can -# # recognise in a loop before passing the remainder back to the -# # caller on the first unrecognised argument we encounter. -# while test $# -gt 0; do -# opt=$1; shift -# case $opt in -# --silent|-s) opt_silent=: -# args_changed=: -# ;; -# # Separate non-argument short options: -# -s*) func_split_short_opt "$_G_opt" -# set dummy "$func_split_short_opt_name" \ -# "-$func_split_short_opt_arg" ${1+"$@"} -# shift -# args_changed=: -# ;; -# *) # Make sure the first unrecognised option "$_G_opt" -# # is added back to "$@" in case we need it later, -# # if $args_changed was set to 'true'. -# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; -# esac -# done -# -# # Only call 'func_quote' here if we processed at least one argument. -# if $args_changed; then -# func_quote eval ${1+"$@"} -# my_silent_option_result=$func_quote_result -# fi -# } -# func_add_hook func_parse_options my_silent_option -# -# -# my_option_validation () -# { -# $debug_cmd -# -# $opt_silent && $opt_verbose && func_fatal_help "\ -# '--silent' and '--verbose' options are mutually exclusive." -# } -# func_add_hook func_validate_options my_option_validation -# -# You'll also need to manually amend $usage_message to reflect the extra -# options you parse. It's preferable to append if you can, so that -# multiple option parsing hooks can be added safely. - - -# func_options_finish [ARG]... -# ---------------------------- -# Finishing the option parse loop (call 'func_options' hooks ATM). -func_options_finish () -{ - $debug_cmd - - func_run_hooks func_options ${1+"$@"} - func_propagate_result func_run_hooks func_options_finish -} - - -# func_options [ARG]... -# --------------------- -# All the functions called inside func_options are hookable. See the -# individual implementations for details. -func_hookable func_options -func_options () -{ - $debug_cmd - - _G_options_quoted=false - - for my_func in options_prep parse_options validate_options options_finish - do - func_unset func_${my_func}_result - func_unset func_run_hooks_result - eval func_$my_func '${1+"$@"}' - func_propagate_result func_$my_func func_options - if $func_propagate_result_result; then - eval set dummy "$func_options_result"; shift - _G_options_quoted=: - fi - done - - $_G_options_quoted || { - # As we (func_options) are top-level options-parser function and - # nobody quoted "$@" for us yet, we need to do it explicitly for - # caller. - func_quote eval ${1+"$@"} - func_options_result=$func_quote_result - } -} - - -# func_options_prep [ARG]... -# -------------------------- -# All initialisations required before starting the option parse loop. -# Note that when calling hook functions, we pass through the list of -# positional parameters. If a hook function modifies that list, and -# needs to propagate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before returning. -func_hookable func_options_prep -func_options_prep () -{ - $debug_cmd - - # Option defaults: - opt_verbose=false - opt_warning_types= - - func_run_hooks func_options_prep ${1+"$@"} - func_propagate_result func_run_hooks func_options_prep -} - - -# func_parse_options [ARG]... -# --------------------------- -# The main option parsing loop. -func_hookable func_parse_options -func_parse_options () -{ - $debug_cmd - - _G_parse_options_requote=false - # this just eases exit handling - while test $# -gt 0; do - # Defer to hook functions for initial option parsing, so they - # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - func_propagate_result func_run_hooks func_parse_options - if $func_propagate_result_result; then - eval set dummy "$func_parse_options_result"; shift - # Even though we may have changed "$@", we passed the "$@" array - # down into the hook and it quoted it for us (because we are in - # this if-branch). No need to quote it again. - _G_parse_options_requote=false - fi - - # Break out of the loop if we already parsed every option. - test $# -gt 0 || break - - # We expect that one of the options parsed in this function matches - # and thus we remove _G_opt from "$@" and need to re-quote. - _G_match_parse_options=: - _G_opt=$1 - shift - case $_G_opt in - --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" >&2 - $debug_cmd - ;; - - --no-warnings|--no-warning|--no-warn) - set dummy --warnings none ${1+"$@"} - shift - ;; - - --warnings|--warning|-W) - if test $# = 0 && func_missing_arg $_G_opt; then - _G_parse_options_requote=: - break - fi - case " $warning_categories $1" in - *" $1 "*) - # trailing space prevents matching last $1 above - func_append_uniq opt_warning_types " $1" - ;; - *all) - opt_warning_types=$warning_categories - ;; - *none) - opt_warning_types=none - warning_func=: - ;; - *error) - opt_warning_types=$warning_categories - warning_func=func_fatal_error - ;; - *) - func_fatal_error \ - "unsupported warning category: '$1'" - ;; - esac - shift - ;; - - --verbose|-v) opt_verbose=: ;; - --version) func_version ;; - -\?|-h) func_usage ;; - --help) func_help ;; - - # Separate optargs to long options (plugins may need this): - --*=*) func_split_equals "$_G_opt" - set dummy "$func_split_equals_lhs" \ - "$func_split_equals_rhs" ${1+"$@"} - shift - ;; - - # Separate optargs to short options: - -W*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-v*|-x*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) _G_parse_options_requote=: ; break ;; - -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift - _G_match_parse_options=false - break - ;; - esac - - if $_G_match_parse_options; then - _G_parse_options_requote=: - fi - done - - if $_G_parse_options_requote; then - # save modified positional parameters for caller - func_quote eval ${1+"$@"} - func_parse_options_result=$func_quote_result - fi -} - - -# func_validate_options [ARG]... -# ------------------------------ -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -func_hookable func_validate_options -func_validate_options () -{ - $debug_cmd - - # Display all warnings if -W was not given. - test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - - func_run_hooks func_validate_options ${1+"$@"} - func_propagate_result func_run_hooks func_validate_options - - # Bail if the options were screwed! - $exit_cmd $EXIT_FAILURE -} - - - -## ----------------- ## -## Helper functions. ## -## ----------------- ## - -# This section contains the helper functions used by the rest of the -# hookable option parser framework in ascii-betical order. - - -# func_fatal_help ARG... -# ---------------------- -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - eval \$ECHO \""$fatal_help"\" - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - - -# func_help -# --------- -# Echo long help message to standard output and exit. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_help_message" - exit 0 -} - - -# func_missing_arg ARGNAME -# ------------------------ -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $debug_cmd - - func_error "Missing argument for '$1'." - exit_cmd=exit -} - - -# func_split_equals STRING -# ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables -# after splitting STRING at the '=' sign. -test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=${1%%=*} - func_split_equals_rhs=${1#*=} - if test "x$func_split_equals_lhs" = "x$1"; then - func_split_equals_rhs= - fi - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` - func_split_equals_rhs= - test "x$func_split_equals_lhs=" = "x$1" \ - || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` - } -fi #func_split_equals - - -# func_split_short_opt SHORTOPT -# ----------------------------- -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"} - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` - func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` - } -fi #func_split_short_opt - - -# func_usage -# ---------- -# Echo short help message to standard output and exit. -func_usage () -{ - $debug_cmd - - func_usage_message - $ECHO "Run '$progname --help |${PAGER-more}' for full usage" - exit 0 -} - - -# func_usage_message -# ------------------ -# Echo short help message to standard output. -func_usage_message () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - echo - $SED -n 's|^# || - /^Written by/{ - x;p;x - } - h - /^Written by/q' < "$progpath" - echo - eval \$ECHO \""$usage_message"\" -} - - -# func_version -# ------------ -# Echo version message to standard output and exit. -# The version message is extracted from the calling file's header -# comments, with leading '# ' stripped: -# 1. First display the progname and version -# 2. Followed by the header comment line matching /^# Written by / -# 3. Then a blank line followed by the first following line matching -# /^# Copyright / -# 4. Immediately followed by any lines between the previous matches, -# except lines preceding the intervening completely blank line. -# For example, see the header comments of this file. -func_version () -{ - $debug_cmd - - printf '%s\n' "$progname $scriptversion" - $SED -n ' - /^# Written by /!b - s|^# ||; p; n - - :fwd2blnk - /./ { - n - b fwd2blnk - } - p; n - - :holdwrnt - s|^# || - s|^# *$|| - /^Copyright /!{ - /./H - n - b holdwrnt - } - - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - G - s|\(\n\)\n*|\1|g - p; q' < "$progpath" - - exit $? -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: - -# Set a version string. -scriptversion='(GNU libtool) 2.4.7' - - -# func_echo ARG... -# ---------------- -# Libtool also displays the current mode in messages, so override -# funclib.sh func_echo with this custom definition. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - -## ---------------- ## -## Options parsing. ## -## ---------------- ## - -# Hook in the functions to make sure our own options are parsed during -# the option parsing loop. - -usage='$progpath [OPTION]... [MODE-ARG]...' - -# Short help message in response to '-h'. -usage_message="Options: - --config show all configuration variables - --debug enable verbose shell tracing - -n, --dry-run display commands without modifying any files - --features display basic configuration information and exit - --mode=MODE use operation mode MODE - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message -" - -# Additional text appended to 'usage_message' in response to '--help'. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_help_message - -MODE must be one of the following: - - clean remove files from the build directory - compile compile a source file into a libtool object - execute automatically set library path, then run a program - finish complete the installation of libtool libraries - install install libraries or executables - link create a library or an executable - uninstall remove libraries from an installed directory - -MODE-ARGS vary depending on the MODE. When passed as first option, -'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. -Try '$progname --help --mode=MODE' for a more detailed description of MODE. - -When reporting a bug, please describe a test case to reproduce it and -include the following information: - - host-triplet: $host - shell: $SHELL - compiler: $LTCC - compiler flags: $LTCFLAGS - linker: $LD (gnu? $with_gnu_ld) - version: $progname (GNU libtool) 2.4.7 - automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` - autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` - -Report bugs to <bug-libtool@gnu.org>. -GNU libtool home page: <http://www.gnu.org/software/libtool/>. -General help using GNU software: <http://www.gnu.org/gethelp/>." - exit 0 -} - - -# func_lo2o OBJECT-NAME -# --------------------- -# Transform OBJECT-NAME from a '.lo' suffix to the platform specific -# object suffix. - -lo2o=s/\\.lo\$/.$objext/ -o2lo=s/\\.$objext\$/.lo/ - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_lo2o () - { - case $1 in - *.lo) func_lo2o_result=${1%.lo}.$objext ;; - * ) func_lo2o_result=$1 ;; - esac - }' - - # func_xform LIBOBJ-OR-SOURCE - # --------------------------- - # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) - # suffix to a '.lo' libtool-object suffix. - eval 'func_xform () - { - func_xform_result=${1%.*}.lo - }' -else - # ...otherwise fall back to using sed. - func_lo2o () - { - func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` - } - - func_xform () - { - func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` - } -fi - - -# func_fatal_configuration ARG... -# ------------------------------- -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_fatal_error ${1+"$@"} \ - "See the $PACKAGE documentation for more information." \ - "Fatal configuration error." -} - - -# func_config -# ----------- -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - - -# func_features -# ------------- -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test yes = "$build_libtool_libs"; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test yes = "$build_old_libs"; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - - -# func_enable_tag TAGNAME -# ----------------------- -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname=$1 - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf=/$re_begincf/,/$re_endcf/p - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" - ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - - -# func_check_version_match -# ------------------------ -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# libtool_options_prep [ARG]... -# ----------------------------- -# Preparation for options parsed by libtool. -libtool_options_prep () -{ - $debug_mode - - # Option defaults: - opt_config=false - opt_dlopen= - opt_dry_run=false - opt_help=false - opt_mode= - opt_preserve_dup_deps=false - opt_quiet=false - - nonopt= - preserve_args= - - _G_rc_lt_options_prep=: - - # Shorthand for --mode=foo, only valid as the first argument - case $1 in - clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; - compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; - execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; - finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; - install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; - link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; - uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; - *) - _G_rc_lt_options_prep=false - ;; - esac - - if $_G_rc_lt_options_prep; then - # Pass back the list of options. - func_quote eval ${1+"$@"} - libtool_options_prep_result=$func_quote_result - fi -} -func_add_hook func_options_prep libtool_options_prep - - -# libtool_parse_options [ARG]... -# --------------------------------- -# Provide handling for libtool specific options. -libtool_parse_options () -{ - $debug_cmd - - _G_rc_lt_parse_options=false - - # Perform our own loop to consume as many options as possible in - # each iteration. - while test $# -gt 0; do - _G_match_lt_parse_options=: - _G_opt=$1 - shift - case $_G_opt in - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - - --config) func_config ;; - - --dlopen|-dlopen) - opt_dlopen="${opt_dlopen+$opt_dlopen -}$1" - shift - ;; - - --preserve-dup-deps) - opt_preserve_dup_deps=: ;; - - --features) func_features ;; - - --finish) set dummy --mode finish ${1+"$@"}; shift ;; - - --help) opt_help=: ;; - - --help-all) opt_help=': help-all' ;; - - --mode) test $# = 0 && func_missing_arg $_G_opt && break - opt_mode=$1 - case $1 in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" - exit_cmd=exit - break - ;; - esac - shift - ;; - - --no-silent|--no-quiet) - opt_quiet=false - func_append preserve_args " $_G_opt" - ;; - - --no-warnings|--no-warning|--no-warn) - opt_warning=false - func_append preserve_args " $_G_opt" - ;; - - --no-verbose) - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --silent|--quiet) - opt_quiet=: - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --tag) test $# = 0 && func_missing_arg $_G_opt && break - opt_tag=$1 - func_append preserve_args " $_G_opt $1" - func_enable_tag "$1" - shift - ;; - - --verbose|-v) opt_quiet=false - opt_verbose=: - func_append preserve_args " $_G_opt" - ;; - - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"} ; shift - _G_match_lt_parse_options=false - break - ;; - esac - $_G_match_lt_parse_options && _G_rc_lt_parse_options=: - done - - if $_G_rc_lt_parse_options; then - # save modified positional parameters for caller - func_quote eval ${1+"$@"} - libtool_parse_options_result=$func_quote_result - fi -} -func_add_hook func_parse_options libtool_parse_options - - - -# libtool_validate_options [ARG]... -# --------------------------------- -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -libtool_validate_options () -{ - # save first non-option argument - if test 0 -lt $#; then - nonopt=$1 - shift - fi - - # preserve --debug - test : = "$debug_cmd" || func_append preserve_args " --debug" - - case $host in - # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 - # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 - *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - test yes != "$build_libtool_libs" \ - && test yes != "$build_old_libs" \ - && func_fatal_configuration "not configured to build any kind of library" - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test execute != "$opt_mode"; then - func_error "unrecognized option '-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help=$help - help="Try '$progname --help --mode=$opt_mode' for more information." - } - - # Pass back the unparsed argument list - func_quote eval ${1+"$@"} - libtool_validate_options_result=$func_quote_result -} -func_add_hook func_validate_options libtool_validate_options - - -# Process options as early as possible so that --help and --version -# can return quickly. -func_options ${1+"$@"} -eval set dummy "$func_options_result"; shift - - - -## ----------- ## -## Main. ## -## ----------- ## - -magic='%%%MAGIC variable%%%' -magic_exe='%%%MAGIC EXE variable%%%' - -# Global variables. -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# func_generated_by_libtool -# True iff stdin has been generated by Libtool. This function is only -# a basic sanity check; it will hardly flush out determined imposters. -func_generated_by_libtool_p () -{ - $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool '.la' library or '.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if 'file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case $lalib_p_line in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test yes = "$lalib_p" -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - test -f "$1" && - $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $debug_cmd - - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# 'FILE.' does not work on cygwin managed mounts. -func_source () -{ - $debug_cmd - - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result - ;; - esac -} - -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case $lt_sysroot:$1 in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result='='$func_stripname_result - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} - -# func_infer_tag arg -# Infer tagged configuration to use if any are available and -# if one wasn't chosen via the "--tag" command line option. -# Only attempt this if the compiler in the base compile -# command doesn't match the default compiler. -# arg is usually of the form 'gcc ...' -func_infer_tag () -{ - $debug_cmd - - if test -n "$available_tags" && test -z "$tagname"; then - CC_quoted= - for arg in $CC; do - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case $@ in - # Blanks in the command may have been stripped by the calling shell, - # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; - # Blanks at the start of $base_compile will cause this to fail - # if we don't check for them as well. - *) - for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then - # Evaluate the configuration. - eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" - CC_quoted= - for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` - case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) - # The compiler in the base compile command matches - # the one in the tagged configuration. - # Assume this is the tagged configuration we want. - tagname=$z - break - ;; - esac - fi - done - # If $tagname still isn't set, then no tagged configuration - # was found and let the user know that the "--tag" command - # line option must be used. - if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with '--tag'" -# else -# func_verbose "using $tagname tagged configuration" - fi - ;; - esac - fi -} - - - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () -{ - write_libobj=$1 - if test yes = "$build_libtool_libs"; then - write_lobj=\'$2\' - else - write_lobj=none - fi - - if test yes = "$build_old_libs"; then - write_oldobj=\'$3\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T <<EOF -# $write_libobj - a libtool object file -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object=$write_lobj - -# Name of the non-PIC object -non_pic_object=$write_oldobj - -EOF - $MV "${write_libobj}T" "$write_libobj" - } -} - - -################################################## -# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS # -################################################## - -# func_convert_core_file_wine_to_w32 ARG -# Helper function used by file name conversion functions when $build is *nix, -# and $host is mingw, cygwin, or some other w32 environment. Relies on a -# correctly configured wine environment available, with the winepath program -# in $build's $PATH. -# -# ARG is the $build file name to be converted to w32 format. -# Result is available in $func_convert_core_file_wine_to_w32_result, and will -# be empty on error (or when ARG is empty) -func_convert_core_file_wine_to_w32 () -{ - $debug_cmd - - func_convert_core_file_wine_to_w32_result=$1 - if test -n "$1"; then - # Unfortunately, winepath does not exit with a non-zero error code, so we - # are forced to check the contents of stdout. On the other hand, if the - # command is not found, the shell will set an exit code of 127 and print - # *an error message* to stdout. So we must check for both error code of - # zero AND non-empty stdout, which explains the odd construction: - func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null` - if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= - fi - fi -} -# end: func_convert_core_file_wine_to_w32 - - -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $debug_cmd - - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result= - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result"; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi - fi - done - IFS=$oldIFS - fi -} -# end: func_convert_core_path_wine_to_w32 - - -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $debug_cmd - - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" - fi -} -#end: func_cygpath - - -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $debug_cmd - - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $debug_cmd - - if test -z "$2" && test -n "$1"; then - func_error "Could not determine host file name corresponding to" - func_error " '$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result=$1 - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $debug_cmd - - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " '$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result=$3 - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $debug_cmd - - case $4 in - $1 ) func_to_host_path_result=$3$func_to_host_path_result - ;; - esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep - - -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via '$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. - - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $debug_cmd - - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $debug_cmd - - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 - ;; - *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result - ;; - esac -} -# end func_to_tool_file - - -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result=$1 -} -# end func_convert_file_noop - - -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result=$func_convert_core_msys_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 - - -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result=$func_convert_core_file_wine_to_w32_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_file_result=$1 - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result=$func_cygpath_result - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via '$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $debug_cmd - - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd=func_convert_path_$func_stripname_result - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $debug_cmd - - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result=$1 -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_msys_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result=$func_convert_core_path_wine_to_w32_result - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $debug_cmd - - func_to_host_path_result=$1 - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result=$func_cygpath_result - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_dll_def_p FILE -# True iff FILE is a Windows DLL '.def' file. -# Keep in sync with _LT_DLL_DEF_P in libtool.m4 -func_dll_def_p () -{ - $debug_cmd - - func_dll_def_p_tmp=`$SED -n \ - -e 's/^[ ]*//' \ - -e '/^\(;.*\)*$/d' \ - -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ - -e q \ - "$1"` - test DEF = "$func_dll_def_p_tmp" -} - - -# func_mode_compile arg... -func_mode_compile () -{ - $debug_cmd - - # Get the compilation command and the source file. - base_compile= - srcfile=$nonopt # always keep a non-empty value in "srcfile" - suppress_opt=yes - suppress_output= - arg_mode=normal - libobj= - later= - pie_flag= - - for arg - do - case $arg_mode in - arg ) - # do not "continue". Instead, add this to base_compile - lastarg=$arg - arg_mode=normal - ;; - - target ) - libobj=$arg - arg_mode=normal - continue - ;; - - normal ) - # Accept any command-line options. - case $arg in - -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify '-o' more than once" - arg_mode=target - continue - ;; - - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" - continue - ;; - - -no-suppress) - suppress_opt=no - continue - ;; - - -Xcompiler) - arg_mode=arg # the next one goes into the "base_compile" arg list - continue # The current "srcfile" will either be retained or - ;; # replaced later. I would guess that would be a bug. - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - lastarg= - save_ifs=$IFS; IFS=, - for arg in $args; do - IFS=$save_ifs - func_append_quoted lastarg "$arg" - done - IFS=$save_ifs - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result - - # Add the arguments to base_compile. - func_append base_compile " $lastarg" - continue - ;; - - *) - # Accept the current argument as the source file. - # The previous "srcfile" becomes the current argument. - # - lastarg=$srcfile - srcfile=$arg - ;; - esac # case $arg - ;; - esac # case $arg_mode - - # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" - done # for arg - - case $arg_mode in - arg) - func_fatal_error "you must specify an argument for -Xcompile" - ;; - target) - func_fatal_error "you must specify a target with '-o'" - ;; - *) - # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj=$func_basename_result - } - ;; - esac - - # Recognize several different file suffixes. - # If the user specifies -o file.o, it is replaced with file.lo - case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; - esac - - case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; - *) - func_fatal_error "cannot determine name of library object from '$libobj'" - ;; - esac - - func_infer_tag $base_compile - - for arg in $later; do - case $arg in - -shared) - test yes = "$build_libtool_libs" \ - || func_fatal_configuration "cannot build a shared library" - build_old_libs=no - continue - ;; - - -static) - build_libtool_libs=no - build_old_libs=yes - continue - ;; - - -prefer-pic) - pic_mode=yes - continue - ;; - - -prefer-non-pic) - pic_mode=no - continue - ;; - esac - done - - func_quote_arg pretty "$libobj" - test "X$libobj" != "X$func_quote_arg_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name '$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname=$func_basename_result - xdir=$func_dirname_result - lobj=$xdir$objdir/$objname - - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" - - # Delete any leftover library objects. - if test yes = "$build_old_libs"; then - removelist="$obj $lobj $libobj ${libobj}T" - else - removelist="$lobj $libobj ${libobj}T" - fi - - # On Cygwin there's no "real" PIC flag so we must build both object types - case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) - pic_mode=default - ;; - esac - if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then - # non-PIC code in shared libraries is not supported - pic_mode=default - fi - - # Calculate the filename of the output object if compiler does - # not support -o with -c - if test no = "$compiler_c_o"; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext - lockfile=$output_obj.lock - else - output_obj= - need_locks=no - lockfile= - fi - - # Lock this critical section if it is needed - # We use this script file to make the link, it avoids creating a new file - if test yes = "$need_locks"; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - elif test warn = "$need_locks"; then - if test -f "$lockfile"; then - $ECHO "\ -*** ERROR, $lockfile exists and contains: -`cat $lockfile 2>/dev/null` - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" - fi - - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 - - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_arg pretty "$srcfile" - qsrcfile=$func_quote_arg_result - - # Only build a PIC object if we are building libtool libraries. - if test yes = "$build_libtool_libs"; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test no != "$pic_mode"; then - command="$base_compile $qsrcfile $pic_flag" - else - # Don't build PIC code - command="$base_compile $qsrcfile" - fi - - func_mkdir_p "$xdir$objdir" - - if test -z "$output_obj"; then - # Place PIC objects in $objdir - func_append command " -o $lobj" - fi - - func_show_eval_locale "$command" \ - 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed, then go on to compile the next one - if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - - # Allow error messages only from the first compilation. - if test yes = "$suppress_opt"; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test yes = "$build_old_libs"; then - if test yes != "$pic_mode"; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test yes = "$compiler_c_o"; then - func_append command " -o $obj" - fi - - # Suppress compiler output if we already did a PIC compilation. - func_append command "$suppress_output" - func_show_eval_locale "$command" \ - '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - - if test warn = "$need_locks" && - test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then - $ECHO "\ -*** ERROR, $lockfile contains: -`cat $lockfile 2>/dev/null` - -but it should contain: -$srcfile - -This indicates that another process is trying to use the same -temporary object file, and libtool could not work around it because -your compiler does not support '-c' and '-o' together. If you -repeat this compilation, it may succeed, by chance, but you had better -avoid parallel builds (make -j) in this platform, or get a better -compiler." - - $opt_dry_run || $RM $removelist - exit $EXIT_FAILURE - fi - - # Just move the object if needed - if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' - fi - fi - - $opt_dry_run || { - func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" - - # Unlock the critical section if it was locked - if test no != "$need_locks"; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test compile = "$opt_mode" && func_mode_compile ${1+"$@"} -} - -func_mode_help () -{ - # We need to display help for each of the modes. - case $opt_mode in - "") - # Generic help is extracted from the usage comments - # at the start of this file. - func_help - ;; - - clean) - $ECHO \ -"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... - -Remove files from the build directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, object or program, all the files associated -with it are deleted. Otherwise, only FILE itself is deleted using RM." - ;; - - compile) - $ECHO \ -"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE - -Compile a source file into a libtool library object. - -This mode accepts the following additional options: - - -o OUTPUT-FILE set the output file name to OUTPUT-FILE - -no-suppress do not suppress compiler output for multiple passes - -prefer-pic try to build PIC objects only - -prefer-non-pic try to build non-PIC objects only - -shared do not build a '.o' file suitable for static linking - -static only build a '.o' file suitable for static linking - -Wc,FLAG - -Xcompiler FLAG pass FLAG directly to the compiler - -COMPILE-COMMAND is a command to be used in creating a 'standard' object file -from the given SOURCEFILE. - -The output file name is determined by removing the directory component from -SOURCEFILE, then substituting the C source code suffix '.c' with the -library object suffix, '.lo'." - ;; - - execute) - $ECHO \ -"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... - -Automatically set library path, then run a program. - -This mode accepts the following additional options: - - -dlopen FILE add the directory containing FILE to the library path - -This mode sets the library path environment variable according to '-dlopen' -flags. - -If any of the ARGS are libtool executable wrappers, then they are translated -into their corresponding uninstalled binary, and any of their required library -directories are added to the library path. - -Then, COMMAND is executed, with ARGS as arguments." - ;; - - finish) - $ECHO \ -"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... - -Complete the installation of libtool libraries. - -Each LIBDIR is a directory that contains libtool libraries. - -The commands that this mode executes may require superuser privileges. Use -the '--dry-run' option if you just want to see what would be executed." - ;; - - install) - $ECHO \ -"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... - -Install executables or libraries. - -INSTALL-COMMAND is the installation command. The first component should be -either the 'install' or 'cp' program. - -The following components of INSTALL-COMMAND are treated specially: - - -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation - -The rest of the components are interpreted as arguments to that command (only -BSD-compatible install options are recognized)." - ;; - - link) - $ECHO \ -"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... - -Link object files or libraries together to form another library, or to -create an executable program. - -LINK-COMMAND is a command using the C compiler that you would use to create -a program from several object files. - -The following components of LINK-COMMAND are treated specially: - - -all-static do not do any dynamic linking at all - -avoid-version do not add a version suffix if possible - -bindir BINDIR specify path to binaries directory (for systems where - libraries must be found in the PATH setting at runtime) - -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime - -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols - -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) - -export-symbols SYMFILE - try to export only the symbols listed in SYMFILE - -export-symbols-regex REGEX - try to export only the symbols matching REGEX - -LLIBDIR search LIBDIR for required installed libraries - -lNAME OUTPUT-FILE requires the installed library libNAME - -module build a library that can dlopened - -no-fast-install disable the fast-install mode - -no-install link a not-installable executable - -no-undefined declare that a library does not refer to external symbols - -o OUTPUT-FILE create OUTPUT-FILE from the specified objects - -objectlist FILE use a list of object files found in FILE to specify objects - -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) - -precious-files-regex REGEX - don't remove output files matching REGEX - -release RELEASE specify package release information - -rpath LIBDIR the created library will eventually be installed in LIBDIR - -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries - -shared only do dynamic linking of libtool libraries - -shrext SUFFIX override the standard shared library file extension - -static do not do any dynamic linking of uninstalled libtool libraries - -static-libtool-libs - do not do any dynamic linking of libtool libraries - -version-info CURRENT[:REVISION[:AGE]] - specify library version info [each variable defaults to 0] - -weak LIBNAME declare that the target provides the LIBNAME interface - -Wc,FLAG - -Xcompiler FLAG pass linker-specific FLAG directly to the compiler - -Wa,FLAG - -Xassembler FLAG pass linker-specific FLAG directly to the assembler - -Wl,FLAG - -Xlinker FLAG pass linker-specific FLAG directly to the linker - -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) - -All other options (arguments beginning with '-') are ignored. - -Every other argument is treated as a filename. Files ending in '.la' are -treated as uninstalled libtool libraries, other files are standard or library -object files. - -If the OUTPUT-FILE ends in '.la', then a libtool library is created, -only library objects ('.lo' files) may be specified, and '-rpath' is -required, except when creating a convenience library. - -If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created -using 'ar' and 'ranlib', or on Windows using 'lib'. - -If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file -is created, otherwise an executable program is created." - ;; - - uninstall) - $ECHO \ -"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... - -Remove libraries from an installation directory. - -RM is the name of the program to use to delete files associated with each FILE -(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed -to RM. - -If FILE is a libtool library, all the files associated with it are deleted. -Otherwise, only FILE itself is deleted using RM." - ;; - - *) - func_fatal_help "invalid operation mode '$opt_mode'" - ;; - esac - - echo - $ECHO "Try '$progname --help' for more information about other modes." -} - -# Now that we've collected a possible --mode arg, show help if necessary -if $opt_help; then - if test : = "$opt_help"; then - func_mode_help - else - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - func_mode_help - done - } | $SED -n '1p; 2,$s/^Usage:/ or: /p' - { - func_help noexit - for opt_mode in compile link execute install finish uninstall clean; do - echo - func_mode_help - done - } | - $SED '1d - /^When reporting/,/^Report/{ - H - d - } - $x - /information about other modes/d - /more detailed .*MODE/d - s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' - fi - exit $? -fi - - -# func_mode_execute arg... -func_mode_execute () -{ - $debug_cmd - - # The first argument is the command name. - cmd=$nonopt - test -z "$cmd" && \ - func_fatal_help "you must specify a COMMAND" - - # Handle -dlopen flags immediately. - for file in $opt_dlopen; do - test -f "$file" \ - || func_fatal_help "'$file' is not a file" - - dir= - case $file in - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$lib' is not a valid libtool archive" - - # Read the libtool library. - dlname= - library_names= - func_source "$file" - - # Skip this library if it cannot be dlopened. - if test -z "$dlname"; then - # Warn if it was a shared library. - test -n "$library_names" && \ - func_warning "'$file' was not linked with '-export-dynamic'" - continue - fi - - func_dirname "$file" "" "." - dir=$func_dirname_result - - if test -f "$dir/$objdir/$dlname"; then - func_append dir "/$objdir" - else - if test ! -f "$dir/$dlname"; then - func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" - fi - fi - ;; - - *.lo) - # Just add the directory containing the .lo file. - func_dirname "$file" "" "." - dir=$func_dirname_result - ;; - - *) - func_warning "'-dlopen' is ignored for non-libtool libraries and objects" - continue - ;; - esac - - # Get the absolute pathname. - absdir=`cd "$dir" && pwd` - test -n "$absdir" && dir=$absdir - - # Now add the directory to shlibpath_var. - if eval "test -z \"\$$shlibpath_var\""; then - eval "$shlibpath_var=\"\$dir\"" - else - eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" - fi - done - - # This variable tells wrapper scripts just to set shlibpath_var - # rather than running their programs. - libtool_execute_magic=$magic - - # Check if any of the arguments is a wrapper script. - args= - for file - do - case $file in - -* | *.la | *.lo ) ;; - *) - # Do a test to see if this is really a libtool program. - if func_ltwrapper_script_p "$file"; then - func_source "$file" - # Transform arg to wrapped name. - file=$progdir/$program - elif func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - func_source "$func_ltwrapper_scriptname_result" - # Transform arg to wrapped name. - file=$progdir/$program - fi - ;; - esac - # Quote arguments (to preserve shell metacharacters). - func_append_quoted args "$file" - done - - if $opt_dry_run; then - # Display what would be done. - if test -n "$shlibpath_var"; then - eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" - echo "export $shlibpath_var" - fi - $ECHO "$cmd$args" - exit $EXIT_SUCCESS - else - if test -n "$shlibpath_var"; then - # Export the shlibpath_var. - eval "export $shlibpath_var" - fi - - # Restore saved environment variables - for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES - do - eval "if test \"\${save_$lt_var+set}\" = set; then - $lt_var=\$save_$lt_var; export $lt_var - else - $lt_unset $lt_var - fi" - done - - # Now prepare to actually exec the command. - exec_cmd=\$cmd$args - fi -} - -test execute = "$opt_mode" && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $debug_cmd - - libs= - libdirs= - admincmds= - - for opt in "$nonopt" ${1+"$@"} - do - if test -d "$opt"; then - func_append libdirs " $opt" - - elif test -f "$opt"; then - if func_lalib_unsafe_p "$opt"; then - func_append libs " $opt" - else - func_warning "'$opt' is not a valid libtool archive" - fi - - else - func_fatal_error "invalid argument '$opt'" - fi - done - - if test -n "$libs"; then - if test -n "$lt_sysroot"; then - sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` - sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" - else - sysroot_cmd= - fi - - # Remove sysroot references - if $opt_dry_run; then - for lib in $libs; do - echo "removing references to $lt_sysroot and '=' prefixes from $lib" - done - else - tmpdir=`func_mktempdir` - for lib in $libs; do - $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ - > $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_quiet && exit $EXIT_SUCCESS - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - echo "----------------------------------------------------------------------" - echo "Libraries have been installed in:" - for libdir in $libdirs; do - $ECHO " $libdir" - done - echo - echo "If you ever happen to want to link against installed libraries" - echo "in a given directory, LIBDIR, you must either use libtool, and" - echo "specify the full pathname of the library, or use the '-LLIBDIR'" - echo "flag during linking and do at least one of the following:" - if test -n "$shlibpath_var"; then - echo " - add LIBDIR to the '$shlibpath_var' environment variable" - echo " during execution" - fi - if test -n "$runpath_var"; then - echo " - add LIBDIR to the '$runpath_var' environment variable" - echo " during linking" - fi - if test -n "$hardcode_libdir_flag_spec"; then - libdir=LIBDIR - eval flag=\"$hardcode_libdir_flag_spec\" - - $ECHO " - use the '$flag' linker flag" - fi - if test -n "$admincmds"; then - $ECHO " - have your system administrator run these commands:$admincmds" - fi - if test -f /etc/ld.so.conf; then - echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" - fi - echo - - echo "See any operating system documentation about shared libraries for" - case $host in - solaris2.[6789]|solaris2.1[0-9]) - echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" - echo "pages." - ;; - *) - echo "more information, such as the ld(1) and ld.so(8) manual pages." - ;; - esac - echo "----------------------------------------------------------------------" - fi - exit $EXIT_SUCCESS -} - -test finish = "$opt_mode" && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $debug_cmd - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac - then - # Aesthetically quote it. - func_quote_arg pretty "$nonopt" - install_prog="$func_quote_arg_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_arg pretty "$arg" - func_append install_prog "$func_quote_arg_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=false - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=: ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test X-m = "X$prev" && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_arg pretty "$arg" - func_append install_prog " $func_quote_arg_result" - if test -n "$arg2"; then - func_quote_arg pretty "$arg2" - fi - func_append install_shared_prog " $func_quote_arg_result" - done - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the '$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_arg pretty "$install_override_mode" - func_append install_shared_prog " -m $func_quote_arg_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=: - if $isdir; then - destdir=$dest - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir=$func_dirname_result - destname=$func_basename_result - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "'$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "'$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "'$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir=$func_dirname_result - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking '$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname=$1 - shift - - srcname=$realname - test -n "$relink_command" && srcname=${realname}T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme=$stripme - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme= - ;; - esac - ;; - os2*) - case $realname in - *_dll.a) - tstripme= - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try 'ln -sf' first, because the 'ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib=$destdir/$realname - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name=$func_basename_result - instname=$dir/${name}i - func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest=$destfile - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to '$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test yes = "$build_old_libs"; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile=$destdir/$destname - else - func_basename "$file" - destfile=$func_basename_result - destfile=$destdir/$destfile - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext= - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=.exe - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script '$wrapper'" - - finalize=: - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "'$lib' has not been installed in '$libdir'" - finalize=false - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test no = "$fast_install" && test -n "$relink_command"; then - $opt_dry_run || { - if $finalize; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file=$func_basename_result - outputname=$tmpdir/$file - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_quiet || { - func_quote_arg expand,pretty "$relink_command" - eval "func_echo $func_quote_arg_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink '$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file=$outputname - else - func_warning "cannot relink '$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name=$func_basename_result - - # Set up the ranlib parameters. - oldlib=$destdir/$name - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run '$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test install = "$opt_mode" && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $debug_cmd - - my_outputname=$1 - my_originator=$2 - my_pic_p=${3-false} - my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms=${my_outputname}S.c - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist=$output_objdir/$my_outputname.nm - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE -/* DATA imports from DLLs on WIN32 can't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined __osf__ -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* External symbol declarations for the compiler. */\ -" - - if test yes = "$dlself"; then - func_verbose "generating symbol list for '$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from '$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols=$output_objdir/$outputname.exp - $opt_dry_run || { - $RM $export_symbols - eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from '$dlprefile'" - func_basename "$dlprefile" - name=$func_basename_result - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename= - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname"; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename=$func_basename_result - else - # no lafile. user explicitly requested -dlpreopen <import library>. - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename"; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 </dev/null >/dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - func_show_eval '$RM "${nlist}I"' - if test -n "$global_symbol_to_import"; then - eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[];\ -" - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ -static void lt_syminit(void) -{ - LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; - for (; symbol->name; ++symbol) - {" - $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" - echo >> "$output_objdir/$my_dlsyms" "\ - } -}" - fi - echo >> "$output_objdir/$my_dlsyms" "\ -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{ {\"$my_originator\", (void *) 0}," - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ - {\"@INIT@\", (void *) <_syminit}," - fi - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - $my_pic_p && pic_flag_for_symtable=" $pic_flag" - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' - - # Transform the symbol file into the correct name. - symfileobj=$output_objdir/${my_outputname}S.$objext - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for '$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $debug_cmd - - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $debug_cmd - - win32_libid_type=unknown - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - case $nm_interface in - "MS dumpbin") - if func_cygming_ms_implib_p "$1" || - func_cygming_gnu_implib_p "$1" - then - win32_nmres=import - else - win32_nmres= - fi - ;; - *) - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s|.*|import| - p - q - } - }'` - ;; - esac - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $debug_cmd - - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $debug_cmd - - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive that possess that section. Heuristic: eliminate - # all those that have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $debug_cmd - - if func_cygming_gnu_implib_p "$1"; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1"; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result= - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $debug_cmd - - f_ex_an_ar_dir=$1; shift - f_ex_an_ar_oldlib=$1 - if test yes = "$lock_old_archive_extraction"; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test yes = "$lock_old_archive_extraction"; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $debug_cmd - - my_gentop=$1; shift - my_oldlibs=${1+"$@"} - my_oldobjs= - my_xlib= - my_xabs= - my_xdir= - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib=$func_basename_result - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir=$my_gentop/$my_xlib_u - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - func_basename "$darwin_archive" - darwin_base_archive=$func_basename_result - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches; do - func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" - $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" - cd "unfat-$$/$darwin_base_archive-$darwin_arch" - func_extract_an_archive "`pwd`" "$darwin_base_archive" - cd "$darwin_curdir" - $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result=$my_oldobjs -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory where it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - func_quote_arg pretty "$ECHO" - qECHO=$func_quote_arg_result - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=$qECHO - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ that is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options that match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" - ;; - - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test yes = "$fast_install"; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - \$ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat <<EOF - -/* $cwrappersource - temporary wrapper executable for $objdir/$outputname - Generated by $PROGRAM (GNU $PACKAGE) $VERSION - - The $output program cannot be directly executed until all the libtool - libraries that it depends on are installed. - - This wrapper executable should never be moved out of the build directory. - If it is, it will not operate correctly. -*/ -EOF - cat <<"EOF" -#ifdef _MSC_VER -# define _CRT_SECURE_NO_DEPRECATE 1 -#endif -#include <stdio.h> -#include <stdlib.h> -#ifdef _MSC_VER -# include <direct.h> -# include <process.h> -# include <io.h> -#else -# include <unistd.h> -# include <stdint.h> -# ifdef __CYGWIN__ -# include <io.h> -# endif -#endif -#include <malloc.h> -#include <stdarg.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/stat.h> - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* declarations of non-ANSI functions */ -#if defined __MINGW32__ -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined __CYGWIN__ -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined other_platform || defined ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined _MSC_VER -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -#elif defined __MINGW32__ -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined __CYGWIN__ -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined other platforms ... */ -#endif - -#if defined PATH_MAX -# define LT_PATHMAX PATH_MAX -#elif defined MAXPATHLEN -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ - defined __OS2__ -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free (stale); stale = 0; } \ -} while (0) - -#if defined LT_DEBUGWRAPPER -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <<EOF -#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) -# define externally_visible volatile -#else -# define externally_visible __attribute__((externally_visible)) volatile -#endif -externally_visible const char * MAGIC_EXE = "$magic_exe"; -const char * LIB_PATH_VARNAME = "$shlibpath_var"; -EOF - - if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - func_to_host_path "$temp_rpath" - cat <<EOF -const char * LIB_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * LIB_PATH_VALUE = ""; -EOF - fi - - if test -n "$dllsearchpath"; then - func_to_host_path "$dllsearchpath:" - cat <<EOF -const char * EXE_PATH_VARNAME = "PATH"; -const char * EXE_PATH_VALUE = "$func_to_host_path_result"; -EOF - else - cat <<"EOF" -const char * EXE_PATH_VARNAME = ""; -const char * EXE_PATH_VALUE = ""; -EOF - fi - - if test yes = "$fast_install"; then - cat <<EOF -const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */ -EOF - else - cat <<EOF -const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */ -EOF - fi - - - cat <<"EOF" - -#define LTWRAPPER_OPTION_PREFIX "--lt-" - -static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX; -static const char *dumpscript_opt = LTWRAPPER_OPTION_PREFIX "dump-script"; -static const char *debug_opt = LTWRAPPER_OPTION_PREFIX "debug"; - -int -main (int argc, char *argv[]) -{ - char **newargz; - int newargc; - char *tmp_pathspec; - char *actual_cwrapper_path; - char *actual_cwrapper_name; - char *target_name; - char *lt_argv_zero; - int rval = 127; - - int i; - - program_name = (char *) xstrdup (base_name (argv[0])); - newargz = XMALLOC (char *, (size_t) argc + 1); - - /* very simple arg parsing; don't want to rely on getopt - * also, copy all non cwrapper options to newargz, except - * argz[0], which is handled differently - */ - newargc=0; - for (i = 1; i < argc; i++) - { - if (STREQ (argv[i], dumpscript_opt)) - { -EOF - case $host in - *mingw* | *cygwin* ) - # make stdout use "unix" line endings - echo " setmode(1,_O_BINARY);" - ;; - esac - - cat <<"EOF" - lt_dump_script (stdout); - return 0; - } - if (STREQ (argv[i], debug_opt)) - { - lt_debug = 1; - continue; - } - if (STREQ (argv[i], ltwrapper_option_prefix)) - { - /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX - namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then - report an error. Otherwise, targets might begin to believe - they are allowed to use options in the LTWRAPPER_OPTION_PREFIX - namespace. The first time any user complains about this, we'll - need to make LTWRAPPER_OPTION_PREFIX a configure-time option - or a configure.ac-settable value. - */ - lt_fatal (__FILE__, __LINE__, - "unrecognized %s option: '%s'", - ltwrapper_option_prefix, argv[i]); - } - /* otherwise ... */ - newargz[++newargc] = xstrdup (argv[i]); - } - newargz[++newargc] = NULL; - -EOF - cat <<EOF - /* The GNU banner must be the first non-error debug message */ - lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n"); -EOF - cat <<"EOF" - lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]); - lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name); - - tmp_pathspec = find_executable (argv[0]); - if (tmp_pathspec == NULL) - lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (before symlink chase) at: %s\n", - tmp_pathspec); - - actual_cwrapper_path = chase_symlinks (tmp_pathspec); - lt_debugprintf (__FILE__, __LINE__, - "(main) found exe (after symlink chase) at: %s\n", - actual_cwrapper_path); - XFREE (tmp_pathspec); - - actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path)); - strendzap (actual_cwrapper_path, actual_cwrapper_name); - - /* wrapper name transforms */ - strendzap (actual_cwrapper_name, ".exe"); - tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1); - XFREE (actual_cwrapper_name); - actual_cwrapper_name = tmp_pathspec; - tmp_pathspec = 0; - - /* target_name transforms -- use actual target program name; might have lt- prefix */ - target_name = xstrdup (base_name (TARGET_PROGRAM_NAME)); - strendzap (target_name, ".exe"); - tmp_pathspec = lt_extend_str (target_name, ".exe", 1); - XFREE (target_name); - target_name = tmp_pathspec; - tmp_pathspec = 0; - - lt_debugprintf (__FILE__, __LINE__, - "(main) libtool target name: %s\n", - target_name); -EOF - - cat <<EOF - newargz[0] = - XMALLOC (char, (strlen (actual_cwrapper_path) + - strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1)); - strcpy (newargz[0], actual_cwrapper_path); - strcat (newargz[0], "$objdir"); - strcat (newargz[0], "/"); -EOF - - cat <<"EOF" - /* stop here, and copy so we don't have to do this twice */ - tmp_pathspec = xstrdup (newargz[0]); - - /* do NOT want the lt- prefix here, so use actual_cwrapper_name */ - strcat (newargz[0], actual_cwrapper_name); - - /* DO want the lt- prefix here if it exists, so use target_name */ - lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1); - XFREE (tmp_pathspec); - tmp_pathspec = NULL; -EOF - - case $host_os in - mingw*) - cat <<"EOF" - { - char* p; - while ((p = strchr (newargz[0], '\\')) != NULL) - { - *p = '/'; - } - while ((p = strchr (lt_argv_zero, '\\')) != NULL) - { - *p = '/'; - } - } -EOF - ;; - esac - - cat <<"EOF" - XFREE (target_name); - XFREE (actual_cwrapper_path); - XFREE (actual_cwrapper_name); - - lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */ - lt_setenv ("DUALCASE", "1"); /* for MSK sh */ - /* Update the DLL searchpath. EXE_PATH_VALUE ($dllsearchpath) must - be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath) - because on Windows, both *_VARNAMEs are PATH but uninstalled - libraries must come first. */ - lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE); - lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE); - - lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n", - nonnull (lt_argv_zero)); - for (i = 0; i < newargc; i++) - { - lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n", - i, nonnull (newargz[i])); - } - -EOF - - case $host_os in - mingw*) - cat <<"EOF" - /* execv doesn't actually work on mingw as expected on unix */ - newargz = prepare_spawn (newargz); - rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); - if (rval == -1) - { - /* failed to start process */ - lt_debugprintf (__FILE__, __LINE__, - "(main) failed to launch target \"%s\": %s\n", - lt_argv_zero, nonnull (strerror (errno))); - return 127; - } - return rval; -EOF - ;; - *) - cat <<"EOF" - execv (lt_argv_zero, newargz); - return rval; /* =127, but avoids unused variable warning */ -EOF - ;; - esac - - cat <<"EOF" -} - -void * -xmalloc (size_t num) -{ - void *p = (void *) malloc (num); - if (!p) - lt_fatal (__FILE__, __LINE__, "memory exhausted"); - - return p; -} - -char * -xstrdup (const char *string) -{ - return string ? strcpy ((char *) xmalloc (strlen (string) + 1), - string) : NULL; -} - -const char * -base_name (const char *name) -{ - const char *base; - -#if defined HAVE_DOS_BASED_FILE_SYSTEM - /* Skip over the disk name in MSDOS pathnames. */ - if (isalpha ((unsigned char) name[0]) && name[1] == ':') - name += 2; -#endif - - for (base = name; *name; name++) - if (IS_DIR_SEPARATOR (*name)) - base = name + 1; - return base; -} - -int -check_executable (const char *path) -{ - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if ((stat (path, &st) >= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - size_t tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined HAVE_DOS_BASED_FILE_SYSTEM - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined HAVE_DOS_BASED_FILE_SYSTEM - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = (size_t) (q - p); - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (STREQ (str, pat)) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - size_t len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - size_t orig_value_len = strlen (orig_value); - size_t add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - size_t len = strlen (new_value); - while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[--len] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $debug_cmd - - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_suncc_cstd_abi -# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! -# Several compiler flags select an ABI that is incompatible with the -# Cstd library. Avoid specifying it if any are in CXXFLAGS. -func_suncc_cstd_abi () -{ - $debug_cmd - - case " $compile_command " in - *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) - suncc_use_cstd_abi=no - ;; - *) - suncc_use_cstd_abi=yes - ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $debug_cmd - - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - # It is impossible to link a dll without this setting, and - # we shouldn't force the makefile maintainer to figure out - # what system we are compiling for in order to pass an extra - # flag for every libtool invocation. - # allow_undefined=no - - # FIXME: Unfortunately, there are problems with the above when trying - # to make a dll that has undefined symbols, in which case not - # even a static library is built. For now, we need to specify - # -no-undefined on the libtool link line when we can be certain - # that all symbols are satisfied, otherwise we get a static library. - allow_undefined=yes - ;; - *) - allow_undefined=yes - ;; - esac - libtool_args=$nonopt - base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt - - compile_rpath= - finalize_rpath= - compile_shlibpath= - finalize_shlibpath= - convenience= - old_convenience= - deplibs= - old_deplibs= - compiler_flags= - linker_flags= - dllsearchpath= - lib_search_path=`pwd` - inst_prefix_dir= - new_inherited_linker_flags= - - avoid_version=no - bindir= - dlfiles= - dlprefiles= - dlself=no - export_dynamic=no - export_symbols= - export_symbols_regex= - generated= - libobjs= - ltlibs= - module=no - no_install=no - objs= - os2dllname= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=false - prev= - prevarg= - release= - rpath= - xrpath= - perm_rpath= - temp_rpath= - thread_safe=no - vinfo= - vinfo_number=no - weak_libs= - single_module=$wl-single_module - func_infer_tag $base_compile - - # We need to know -static, to get the right output filenames. - for arg - do - case $arg in - -shared) - test yes != "$build_libtool_libs" \ - && func_fatal_configuration "cannot build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" - fi - if test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - -static) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=built - ;; - -static-libtool-libs) - if test -z "$pic_flag" && test -n "$link_static_flag"; then - dlopen_self=$dlopen_self_static - fi - prefer_static_libs=yes - ;; - esac - build_libtool_libs=no - build_old_libs=yes - break - ;; - esac - done - - # See if our shared archives depend on static archives. - test -n "$old_archive_from_new_cmds" && build_old_libs=yes - - # Go through the arguments, transforming them on the way. - while test "$#" -gt 0; do - arg=$1 - shift - func_quote_arg pretty,unquoted "$arg" - qarg=$func_quote_arg_unquoted_result - func_append libtool_args " $func_quote_arg_result" - - # If the previous option needs an argument, assign it. - if test -n "$prev"; then - case $prev in - output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" - ;; - esac - - case $prev in - bindir) - bindir=$arg - prev= - continue - ;; - dlfiles|dlprefiles) - $preload || { - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=: - } - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test no = "$dlself"; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test dlprefiles = "$prev"; then - dlself=yes - elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test dlfiles = "$prev"; then - func_append dlfiles " $arg" - else - func_append dlprefiles " $arg" - fi - prev= - continue - ;; - esac - ;; - expsyms) - export_symbols=$arg - test -f "$arg" \ - || func_fatal_error "symbol file '$arg' does not exist" - prev= - continue - ;; - expsyms_regex) - export_symbols_regex=$arg - prev= - continue - ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; - inst_prefix) - inst_prefix_dir=$arg - prev= - continue - ;; - mllvm) - # Clang does not use LLVM to link, so we can simply discard any - # '-mllvm $arg' options when doing the link step. - prev= - continue - ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - if test none != "$pic_object"; then - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - fi - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file '$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; - os2dllname) - os2dllname=$arg - prev= - continue - ;; - precious_regex) - precious_files_regex=$arg - prev= - continue - ;; - release) - release=-$arg - prev= - continue - ;; - rpath | xrpath) - # We need an absolute path. - case $arg in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - if test rpath = "$prev"; then - case "$rpath " in - *" $arg "*) ;; - *) func_append rpath " $arg" ;; - esac - else - case "$xrpath " in - *" $arg "*) ;; - *) func_append xrpath " $arg" ;; - esac - fi - prev= - continue - ;; - shrext) - shrext_cmds=$arg - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xassembler) - func_append compiler_flags " -Xassembler $qarg" - prev= - func_append compile_command " -Xassembler $qarg" - func_append finalize_command " -Xassembler $qarg" - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xcompiler) - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; - xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" - prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" - continue - ;; - *) - eval "$prev=\"\$arg\"" - prev= - continue - ;; - esac - fi # test -n "$prev" - - prevarg=$arg - - case $arg in - -all-static) - if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" - fi - continue - ;; - - -allow-undefined) - # FIXME: remove this flag sometime in the future. - func_fatal_error "'-allow-undefined' must not be used because it is the default" - ;; - - -avoid-version) - avoid_version=yes - continue - ;; - - -bindir) - prev=bindir - continue - ;; - - -dlopen) - prev=dlfiles - continue - ;; - - -dlpreopen) - prev=dlprefiles - continue - ;; - - -export-dynamic) - export_dynamic=yes - continue - ;; - - -export-symbols | -export-symbols-regex) - if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" - fi - if test X-export-symbols = "X$arg"; then - prev=expsyms - else - prev=expsyms_regex - fi - continue - ;; - - -framework) - prev=framework - continue - ;; - - -inst-prefix-dir) - prev=inst_prefix - continue - ;; - - # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* - # so, if we see these flags be careful not to treat them like -L - -L[A-Z][A-Z]*:*) - case $with_gcc/$host in - no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" - ;; - esac - continue - ;; - - -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between '-L' and '$1'" - else - func_fatal_error "need path for '-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of '$dir'" - dir=$absdir - ;; - esac - case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; - *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" - ;; - esac - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - continue - ;; - - -l*) - if test X-lc = "X$arg" || test X-lm = "X$arg"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) - # These systems don't actually have a C or math library (as such) - continue - ;; - *-*-os2*) - # These systems don't actually have a C library (as such) - test X-lc = "X$arg" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) - # Do not include libc due to us having libc/libc_r. - test X-lc = "X$arg" && continue - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" - continue - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - test X-lc = "X$arg" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test X-lc = "X$arg" && continue - ;; - esac - elif test X-lc_r = "X$arg"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -mllvm) - prev=mllvm - continue - ;; - - -module) - module=yes - continue - ;; - - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; - # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. - -pthread) - case $host in - *solaris2*) ;; - *) - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - ;; - esac - continue - ;; - -mt|-mthreads|-kthread|-Kthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; - esac - continue - ;; - - -multi_module) - single_module=$wl-multi_module - continue - ;; - - -no-fast-install) - fast_install=no - continue - ;; - - -no-install) - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) - # The PATH hackery in wrapper scripts is required on Windows - # and Darwin in order for the loader to find any dlls it needs. - func_warning "'-no-install' is ignored for $host" - func_warning "assuming '-no-fast-install' instead" - fast_install=no - ;; - *) no_install=yes ;; - esac - continue - ;; - - -no-undefined) - allow_undefined=no - continue - ;; - - -objectlist) - prev=objectlist - continue - ;; - - -os2dllname) - prev=os2dllname - continue - ;; - - -o) prev=output ;; - - -precious-files-regex) - prev=precious_regex - continue - ;; - - -release) - prev=release - continue - ;; - - -rpath) - prev=rpath - continue - ;; - - -R) - prev=xrpath - continue - ;; - - -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; - *) - func_fatal_error "only absolute run-paths are allowed" - ;; - esac - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - continue - ;; - - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - - -static | -static-libtool-libs) - # The effects of -static are defined in a previous loop. - # We used to do the same as -all-static on platforms that - # didn't have a PIC flag, but the assumption that the effects - # would be equivalent was wrong. It would break on at least - # Digital Unix and AIX. - continue - ;; - - -thread-safe) - thread_safe=yes - continue - ;; - - -version-info) - prev=vinfo - continue - ;; - - -version-number) - prev=vinfo - vinfo_number=yes - continue - ;; - - -weak) - prev=weak - continue - ;; - - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_arg pretty "$flag" - func_append arg " $func_quote_arg_result" - func_append compiler_flags " $func_quote_arg_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result - arg= - save_ifs=$IFS; IFS=, - for flag in $args; do - IFS=$save_ifs - func_quote_arg pretty "$flag" - func_append arg " $wl$func_quote_arg_result" - func_append compiler_flags " $wl$func_quote_arg_result" - func_append linker_flags " $func_quote_arg_result" - done - IFS=$save_ifs - func_stripname ' ' '' "$arg" - arg=$func_stripname_result - ;; - - -Xassembler) - prev=xassembler - continue - ;; - - -Xcompiler) - prev=xcompiler - continue - ;; - - -Xlinker) - prev=xlinker - continue - ;; - - -XCClinker) - prev=xcclinker - continue - ;; - - # -msg_* for osf cc - -msg_*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # -fstack-protector* stack protector flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - # -specs=* GCC specs files - # -stdlib=* select c++ std lib with clang - # -fsanitize=* Clang/GCC memory and address sanitizer - # -fuse-ld=* Linker select flags for GCC - # -Wa,* Pass flags directly to the assembler - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ - -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - - -Z*) - if test os2 = "`expr $host : '.*\(os2\)'`"; then - # OS/2 uses -Zxxx to specify OS/2-specific options - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case $arg in - -Zlinker | -Zstack) - prev=xcompiler - ;; - esac - continue - else - # Otherwise treat like 'Some other compiler flag' below - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - fi - ;; - - # Some other compiler flag. - -* | +*) - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - - *.$objext) - # A standard object. - func_append objs " $arg" - ;; - - *.lo) - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - test none = "$pic_object" || { - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - } - - # Non-PIC object. - if test none != "$non_pic_object"; then - # Prepend the subdirectory the object is found in. - non_pic_object=$xdir$non_pic_object - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test none = "$pic_object"; then - arg=$non_pic_object - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object=$pic_object - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "'$arg' is not a valid libtool object" - fi - fi - ;; - - *.$libext) - # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" - continue - ;; - - *.la) - # A libtool-controlled library. - - func_resolve_sysroot "$arg" - if test dlfiles = "$prev"; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test dlprefiles = "$prev"; then - # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" - prev= - else - func_append deplibs " $func_resolve_sysroot_result" - fi - continue - ;; - - # Some other compiler argument. - *) - # Unknown arguments in both finalize_command and compile_command need - # to be aesthetically quoted because they are evaled later. - func_quote_arg pretty "$arg" - arg=$func_quote_arg_result - ;; - esac # arg - - # Now actually substitute the argument into the commands. - if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - done # argument parsing loop - - test -n "$prev" && \ - func_fatal_help "the '$prevarg' option requires an argument" - - if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then - eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" - fi - - oldlibs= - # calculate the name of the file, without its directory - func_basename "$output" - outputname=$func_basename_result - libobjs_save=$libobjs - - if test -n "$shlibpath_var"; then - # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` - else - shlib_search_path= - fi - eval sys_lib_search_path=\"$sys_lib_search_path_spec\" - eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - - # Definition is injected by LT_CONFIG during libtool generation. - func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" - - func_dirname "$output" "/" "" - output_objdir=$func_dirname_result$objdir - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result - # Create the object directory. - func_mkdir_p "$output_objdir" - - # Determine the type of output - case $output in - "") - func_fatal_help "you must specify an output file" - ;; - *.$libext) linkmode=oldlib ;; - *.lo | *.$objext) linkmode=obj ;; - *.la) linkmode=lib ;; - *) linkmode=prog ;; # Anything else should be a program. - esac - - specialdeplibs= - - libs= - # Find all interdependent deplibs by searching for libraries - # that are linked more than once (e.g. -la -lb -la) - for deplib in $deplibs; do - if $opt_preserve_dup_deps; then - case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append libs " $deplib" - done - - if test lib = "$linkmode"; then - libs="$predeps $libs $compiler_lib_search_path $postdeps" - - # Compute libraries that are listed more than once in $predeps - # $postdeps and mark them as special (i.e., whose duplicates are - # not to be eliminated). - pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then - for pre_post_dep in $predeps $postdeps; do - case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; - esac - func_append pre_post_deps " $pre_post_dep" - done - fi - pre_post_deps= - fi - - deplibs= - newdependency_libs= - newlib_search_path= - need_relink=no # whether we're linking any uninstalled libtool libraries - notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - - case $linkmode in - lib) - passes="conv dlpreopen link" - for file in $dlfiles $dlprefiles; do - case $file in - *.la) ;; - *) - func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" - ;; - esac - done - ;; - prog) - compile_deplibs= - finalize_deplibs= - alldeplibs=false - newdlfiles= - newdlprefiles= - passes="conv scan dlopen dlpreopen link" - ;; - *) passes="conv" - ;; - esac - - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test lib,link = "$linkmode,$pass"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs=$tmp_deplibs - fi - - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass"; then - libs=$deplibs - deplibs= - fi - if test prog = "$linkmode"; then - case $pass in - dlopen) libs=$dlfiles ;; - dlpreopen) libs=$dlprefiles ;; - link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; - esac - fi - if test lib,dlpreopen = "$linkmode,$pass"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs=$dlprefiles - fi - if test dlopen = "$pass"; then - # Collect dlpreopened libraries - save_deplibs=$deplibs - deplibs= - fi - - for deplib in $libs; do - lib= - found=false - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test lib != "$linkmode" && test prog != "$linkmode"; then - func_warning "'-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test lib = "$linkmode"; then - searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" - else - searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" - fi - for searchdir in $searchdirs; do - for search_ext in .la $std_shrext .so .a; do - # Search the libtool library - lib=$searchdir/lib$name$search_ext - if test -f "$lib"; then - if test .la = "$search_ext"; then - found=: - else - found=false - fi - break 2 - fi - done - done - if $found; then - # deplib is a libtool library - # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, - # We need to do some special things here, and not later. - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $deplib "*) - if func_lalib_p "$lib"; then - library_names= - old_library= - func_source "$lib" - for l in $old_library $library_names; do - ll=$l - done - if test "X$ll" = "X$old_library"; then # only static version available - found=false - func_dirname "$lib" "" "." - ladir=$func_dirname_result - lib=$ladir/$old_library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - else - # deplib doesn't seem to be a libtool library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; # -l - *.ltframework) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -L*) - case $linkmode in - lib) - deplibs="$deplib $deplibs" - test conv = "$pass" && continue - newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - prog) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - if test scan = "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - *) - func_warning "'-L' is ignored for archives/objects" - ;; - esac # linkmode - continue - ;; # -L - -R*) - if test link = "$pass"; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result - # Make sure the xrpath contains only unique directories. - case "$xrpath " in - *" $dir "*) ;; - *) func_append xrpath " $dir" ;; - esac - fi - deplibs="$deplib $deplibs" - continue - ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; - *.$libext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - case $linkmode in - lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=false - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ - | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=: - fi - ;; - pass_all) - valid_a_lib=: - ;; - esac - if $valid_a_lib; then - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - else - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - fi - ;; - esac - continue - ;; - prog) - if test link != "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - elif test prog = "$linkmode"; then - if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then - # If there is no dlopen support or we're linking statically, - # we need to preload. - func_append newdlprefiles " $deplib" - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append newdlfiles " $deplib" - fi - fi - continue - ;; - %DEPLIBS%) - alldeplibs=: - continue - ;; - esac # case $deplib - - $found || test -f "$lib" \ - || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "'$lib' is not a valid libtool archive" - - func_dirname "$lib" "" "." - ladir=$func_dirname_result - - dlname= - dlopen= - dlpreopen= - libdir= - library_names= - old_library= - inherited_linker_flags= - # If the library was installed with an old release of libtool, - # it will not redefine variables installed, or shouldnotlink - installed=yes - shouldnotlink=no - avoidtemprpath= - - - # Read the .la file - func_source "$lib" - - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - if test lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass" || - { test prog != "$linkmode" && test lib != "$linkmode"; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test conv = "$pass"; then - # Only check for convenience libraries - deplibs="$lib $deplibs" - if test -z "$libdir"; then - if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" - elif test prog != "$linkmode" && test lib != "$linkmode"; then - func_fatal_error "'$lib' is not a convenience library" - fi - tmp_libs= - for deplib in $dependency_libs; do - deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test yes = "$prefer_static_libs" || - test built,no = "$prefer_static_libs,$installed"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib=$l - done - fi - if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for '$lib'" - fi - - # This library was specified with -dlopen. - if test dlopen = "$pass"; then - test -z "$libdir" \ - && func_fatal_error "cannot -dlopen a convenience library: '$lib'" - if test -z "$dlname" || - test yes != "$dlopen_support" || - test no = "$build_libtool_libs" - then - # If there is no dlname, no dlopen support or we're linking - # statically, we need to preload. We also need to preload any - # dependent libraries so libltdl's deplib preloader doesn't - # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" - else - func_append newdlfiles " $lib" - fi - continue - fi # $pass = dlopen - - # We need an absolute path. - case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; - *) - abs_ladir=`cd "$ladir" && pwd` - if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of '$ladir'" - func_warning "passing it literally to the linker, although it might fail" - abs_ladir=$ladir - fi - ;; - esac - func_basename "$lib" - laname=$func_basename_result - - # Find the relevant object directory and library name. - if test yes = "$installed"; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library '$lib' was moved." - dir=$ladir - absdir=$abs_ladir - libdir=$abs_ladir - else - dir=$lt_sysroot$libdir - absdir=$lt_sysroot$libdir - fi - test yes = "$hardcode_automatic" && avoidtemprpath=yes - else - if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir=$ladir - absdir=$abs_ladir - # Remove this search path later - func_append notinst_path " $abs_ladir" - else - dir=$ladir/$objdir - absdir=$abs_ladir/$objdir - # Remove this search path later - func_append notinst_path " $abs_ladir" - fi - fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result - - # This library was specified with -dlpreopen. - if test dlpreopen = "$pass"; then - if test -z "$libdir" && test prog = "$linkmode"; then - func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" - fi - case $host in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac - fi # $pass = dlpreopen - - if test -z "$libdir"; then - # Link the convenience library - if test lib = "$linkmode"; then - deplibs="$dir/$old_library $deplibs" - elif test prog,link = "$linkmode,$pass"; then - compile_deplibs="$dir/$old_library $compile_deplibs" - finalize_deplibs="$dir/$old_library $finalize_deplibs" - else - deplibs="$lib $deplibs" # used for prog,scan pass - fi - continue - fi - - - if test prog = "$linkmode" && test link != "$pass"; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=false - if test no != "$link_all_deplibs" || test -z "$library_names" || - test no = "$build_libtool_libs"; then - linkalldeplibs=: - fi - - tmp_libs= - for deplib in $dependency_libs; do - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; - esac - # Need to link against all dependency_libs? - if $linkalldeplibs; then - deplibs="$deplib $deplibs" - else - # Need to hardcode shared library paths - # or/and link against static libraries - newdependency_libs="$deplib $newdependency_libs" - fi - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; - esac - fi - func_append tmp_libs " $deplib" - done # for deplib - continue - fi # $linkmode = prog... - - if test prog,link = "$linkmode,$pass"; then - if test -n "$library_names" && - { { test no = "$prefer_static_libs" || - test built,yes = "$prefer_static_libs,$installed"; } || - test -z "$old_library"; }; then - # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then - # Make sure the rpath contains only unique directories. - case $temp_rpath: in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; - esac - fi - - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi # $linkmode,$pass = prog,link... - - if $alldeplibs && - { test pass_all = "$deplibs_check_method" || - { test yes = "$build_libtool_libs" && - test -n "$library_names"; }; }; then - # We only need to search for static libraries - continue - fi - fi - - link_static=no # Whether the deplib will be linked statically - use_static_libs=$prefer_static_libs - if test built = "$use_static_libs" && test yes = "$installed"; then - use_static_libs=no - fi - if test -n "$library_names" && - { test no = "$use_static_libs" || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc* | *os2*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test no = "$installed"; then - func_append notinst_deplibs " $lib" - need_relink=yes - fi - ;; - esac - # This is a shared library - - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule= - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule=$dlpremoduletest - break - fi - done - if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then - echo - if test prog = "$linkmode"; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" - else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" - fi - $ECHO "*** $linklib is not portable!" - fi - if test lib = "$linkmode" && - test yes = "$hardcode_into_libs"; then - # Hardcode the library path. - # Skip directories that are in the system default run-time - # search path. - case " $sys_lib_dlsearch_path " in - *" $absdir "*) ;; - *) - case "$compile_rpath " in - *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; - esac - ;; - esac - case " $sys_lib_dlsearch_path " in - *" $libdir "*) ;; - *) - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - ;; - esac - fi - - if test -n "$old_archive_from_expsyms_cmds"; then - # figure out the soname - set dummy $library_names - shift - realname=$1 - shift - libname=`eval "\\$ECHO \"$libname_spec\""` - # use dlname if we got it. it's perfectly good, no? - if test -n "$dlname"; then - soname=$dlname - elif test -n "$soname_spec"; then - # bleh windows - case $host in - *cygwin* | mingw* | *cegcc* | *os2*) - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - esac - eval soname=\"$soname_spec\" - else - soname=$realname - fi - - # Make a new name for the extract_expsyms_cmds to use - soroot=$soname - func_basename "$soroot" - soname=$func_basename_result - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a - - # If the library has no export list, then create one now - if test -f "$output_objdir/$soname-def"; then : - else - func_verbose "extracting exported symbol list from '$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' - fi - - # Create $newlib - if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for '$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' - fi - # make sure the library variables are pointing to the new library - dir=$output_objdir - linklib=$newlib - fi # test -n "$old_archive_from_expsyms_cmds" - - if test prog = "$linkmode" || test relink != "$opt_mode"; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test no = "$hardcode_direct"; then - add=$dir/$linklib - case $host in - *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; - *-*-sysv4*uw2*) add_dir=-L$dir ;; - *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir=-L$dir ;; - *-*-darwin* ) - # if the lib is a (non-dlopened) module then we cannot - # link against it, someone is ignoring the earlier warnings - if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library"; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add=$dir/$old_library - fi - elif test -n "$old_library"; then - add=$dir/$old_library - fi - fi - esac - elif test no = "$hardcode_minus_L"; then - case $host in - *-*-sunos*) add_shlibpath=$dir ;; - esac - add_dir=-L$dir - add=-l$name - elif test no = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - relink) - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$dir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$absdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test yes != "$lib_linked"; then - func_fatal_configuration "unsupported hardcode properties" - fi - - if test -n "$add_shlibpath"; then - case :$compile_shlibpath: in - *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; - esac - fi - if test prog = "$linkmode"; then - test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" - test -n "$add" && compile_deplibs="$add $compile_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - if test yes != "$hardcode_direct" && - test yes != "$hardcode_minus_L" && - test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test prog = "$linkmode" || test relink = "$opt_mode"; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$libdir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$libdir - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add=-l$name - elif test yes = "$hardcode_automatic"; then - if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib"; then - add=$inst_prefix_dir$libdir/$linklib - else - add=$libdir/$linklib - fi - else - # We cannot seem to hardcode it, guess we'll fake it. - add_dir=-L$libdir - # Try looking first in the location we're being installed to. - if test -n "$inst_prefix_dir"; then - case $libdir in - [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" - ;; - esac - fi - add=-l$name - fi - - if test prog = "$linkmode"; then - test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" - test -n "$add" && finalize_deplibs="$add $finalize_deplibs" - else - test -n "$add_dir" && deplibs="$add_dir $deplibs" - test -n "$add" && deplibs="$add $deplibs" - fi - fi - elif test prog = "$linkmode"; then - # Here we assume that one of hardcode_direct or hardcode_minus_L - # is not unsupported. This is valid on all known static and - # shared platforms. - if test unsupported != "$hardcode_direct"; then - test -n "$old_library" && linklib=$old_library - compile_deplibs="$dir/$linklib $compile_deplibs" - finalize_deplibs="$dir/$linklib $finalize_deplibs" - else - compile_deplibs="-l$name -L$dir $compile_deplibs" - finalize_deplibs="-l$name -L$dir $finalize_deplibs" - fi - elif test yes = "$build_libtool_libs"; then - # Not a shared library - if test pass_all != "$deplibs_check_method"; then - # We're trying link a shared library against a static one - # but the system doesn't support it. - - # Just print a warning and add the library to dependency_libs so - # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system cannot link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." - if test yes = "$module"; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - else - deplibs="$dir/$old_library $deplibs" - link_static=yes - fi - fi # link shared/static library? - - if test lib = "$linkmode"; then - if test -n "$dependency_libs" && - { test yes != "$hardcode_into_libs" || - test yes = "$build_old_libs" || - test yes = "$link_static"; }; then - # Extract -R from dependency_libs - temp_deplibs= - for libdir in $dependency_libs; do - case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result - case " $xrpath " in - *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; - esac;; - *) func_append temp_deplibs " $libdir";; - esac - done - dependency_libs=$temp_deplibs - fi - - func_append newlib_search_path " $absdir" - # Link against this library - test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" - # ... and its dependency_libs - tmp_libs= - for deplib in $dependency_libs; do - newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps; then - case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; - esac - fi - func_append tmp_libs " $func_resolve_sysroot_result" - done - - if test no != "$link_all_deplibs"; then - # Add the search paths of all dependency libraries - for deplib in $dependency_libs; do - path= - case $deplib in - -L*) path=$deplib ;; - *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result - # We need an absolute path. - case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; - *) - absdir=`cd "$dir" && pwd` - if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of '$dir'" - absdir=$dir - fi - ;; - esac - if $GREP "^installed=no" $deplib > /dev/null; then - case $host in - *-*-darwin*) - depdepl= - eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` - if test -n "$deplibrary_names"; then - for tmp in $deplibrary_names; do - depdepl=$tmp - done - if test -f "$absdir/$objdir/$depdepl"; then - depdepl=$absdir/$objdir/$depdepl - darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" - func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" - path= - fi - fi - ;; - *) - path=-L$absdir/$objdir - ;; - esac - else - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "'$deplib' seems to be moved" - - path=-L$absdir - fi - ;; - esac - case " $deplibs " in - *" $path "*) ;; - *) deplibs="$path $deplibs" ;; - esac - done - fi # link_all_deplibs != no - fi # linkmode = lib - done # for deplib in $libs - if test link = "$pass"; then - if test prog = "$linkmode"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi - dependency_libs=$newdependency_libs - if test dlpreopen = "$pass"; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test dlopen != "$pass"; then - test conv = "$pass" || { - # Make sure lib_search_path contains only unique directories. - lib_search_path= - for dir in $newlib_search_path; do - case "$lib_search_path " in - *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; - esac - done - newlib_search_path= - } - - if test prog,link = "$linkmode,$pass"; then - vars="compile_deplibs finalize_deplibs" - else - vars=deplibs - fi - for var in $vars dependency_libs; do - # Add libraries to $var in reverse order - eval tmp_libs=\"\$$var\" - new_libs= - for deplib in $tmp_libs; do - # FIXME: Pedantically, this is the right thing to do, so - # that some nasty dependency loop isn't accidentally - # broken: - #new_libs="$deplib $new_libs" - # Pragmatically, this seems to cause very few problems in - # practice: - case $deplib in - -L*) new_libs="$deplib $new_libs" ;; - -R*) ;; - *) - # And here is the reason: when a library appears more - # than once as an explicit dependence of a library, or - # is implicitly linked in more than once by the - # compiler, it is considered special, and multiple - # occurrences thereof are not removed. Compare this - # with having the same library being listed as a - # dependency of multiple other libraries: in this case, - # we know (pedantically, we assume) the library does not - # need to be listed more than once, so we keep only the - # last copy. This is not always right, but it is rare - # enough that we require users that really mean to play - # such unportable linking tricks to link the library - # using -Wl,-lname, so that libtool does not consider it - # for duplicate removal. - case " $specialdeplibs " in - *" $deplib "*) new_libs="$deplib $new_libs" ;; - *) - case " $new_libs " in - *" $deplib "*) ;; - *) new_libs="$deplib $new_libs" ;; - esac - ;; - esac - ;; - esac - done - tmp_libs= - for deplib in $new_libs; do - case $deplib in - -L*) - case " $tmp_libs " in - *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; - esac - ;; - *) func_append tmp_libs " $deplib" ;; - esac - done - eval $var=\"$tmp_libs\" - done # for var - fi - - # Add Sun CC postdeps if required: - test CXX = "$tagname" && { - case $host_os in - linux*) - case `$CC -V 2>&1 | $SED 5q` in - *Sun\ C*) # Sun C++ 5.9 - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - - solaris*) - func_cc_basename "$CC" - case $func_cc_basename_result in - CC* | sunCC*) - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - esac - } - - # Last step: remove runtime libs from dependency_libs - # (they stay in deplibs) - tmp_libs= - for i in $dependency_libs; do - case " $predeps $postdeps $compiler_lib_search_path " in - *" $i "*) - i= - ;; - esac - if test -n "$i"; then - func_append tmp_libs " $i" - fi - done - dependency_libs=$tmp_libs - done # for pass - if test prog = "$linkmode"; then - dlfiles=$newdlfiles - fi - if test prog = "$linkmode" || test lib = "$linkmode"; then - dlprefiles=$newdlprefiles - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for archives" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for archives" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for archives" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for archives" - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for archives" - - test -n "$release" && \ - func_warning "'-release' is ignored for archives" - - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "'-export-symbols' is ignored for archives" - - # Now set the variables for building old libraries. - build_libtool_libs=no - oldlibs=$output - func_append objs "$old_deplibs" - ;; - - lib) - # Make sure we only generate libraries of the form 'libNAME.la'. - case $outputname in - lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - ;; - *) - test no = "$module" \ - && func_fatal_help "libtool library '$output' must begin with 'lib'" - - if test no != "$need_lib_prefix"; then - # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result - eval shared_ext=\"$shrext_cmds\" - eval libname=\"$libname_spec\" - else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result - fi - ;; - esac - - if test -n "$objs"; then - if test pass_all != "$deplibs_check_method"; then - func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" - else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" - fi - fi - - test no = "$dlself" \ - || func_warning "'-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test 1 -lt "$#" \ - && func_warning "ignoring multiple '-rpath's for a libtool library" - - install_libdir=$1 - - oldlibs= - if test -z "$rpath"; then - if test yes = "$build_libtool_libs"; then - # Building a libtool convenience library. - # Some compilers have problems with a '.al' extension so - # convenience libraries should have the same extension an - # archive normally would. - oldlibs="$output_objdir/$libname.$libext $oldlibs" - build_libtool_libs=convenience - build_old_libs=yes - fi - - test -n "$vinfo" && \ - func_warning "'-version-info/-version-number' is ignored for convenience libraries" - - test -n "$release" && \ - func_warning "'-release' is ignored for convenience libraries" - else - - # Parse the version information argument. - save_ifs=$IFS; IFS=: - set dummy $vinfo 0 0 0 - shift - IFS=$save_ifs - - test -n "$7" && \ - func_fatal_help "too many parameters to '-version-info'" - - # convert absolute version numbers to libtool ages - # this retains compatibility with .la files and attempts - # to make the code below a bit more comprehensible - - case $vinfo_number in - yes) - number_major=$1 - number_minor=$2 - number_revision=$3 - # - # There are really only two kinds -- those that - # use the current revision as the major version - # and those that subtract age and use age as - # a minor version. But, then there is irix - # that has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_revision - ;; - freebsd-aout|qnx|sunos) - current=$number_major - revision=$number_minor - age=0 - ;; - irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_minor - lt_irix_increment=no - ;; - esac - ;; - no) - current=$1 - revision=$2 - age=$3 - ;; - esac - - # Check that each of the things are valid numbers. - case $current in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "CURRENT '$current' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $revision in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "REVISION '$revision' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - case $age in - 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; - *) - func_error "AGE '$age' must be a nonnegative integer" - func_fatal_error "'$vinfo' is not valid version information" - ;; - esac - - if test "$age" -gt "$current"; then - func_error "AGE '$age' is greater than the current interface number '$current'" - func_fatal_error "'$vinfo' is not valid version information" - fi - - # Calculate the version variables. - major= - versuffix= - verstring= - case $version_type in - none) ;; - - darwin) - # Like Linux, but with the current version available in - # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result - xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - # On Darwin other compilers - case $CC in - nagfor*) - verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - ;; - *) - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - esac - ;; - - freebsd-aout) - major=.$current - versuffix=.$current.$revision - ;; - - freebsd-elf | midnightbsd-elf) - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - irix | nonstopux) - if test no = "$lt_irix_increment"; then - func_arith $current - $age - else - func_arith $current - $age + 1 - fi - major=$func_arith_result - - case $version_type in - nonstopux) verstring_prefix=nonstopux ;; - *) verstring_prefix=sgi ;; - esac - verstring=$verstring_prefix$major.$revision - - # Add in all the interfaces that we are compatible with. - loop=$revision - while test 0 -ne "$loop"; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring_prefix$major.$iface:$verstring - done - - # Before this point, $major must not contain '.'. - major=.$major - versuffix=$major.$revision - ;; - - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - osf) - func_arith $current - $age - major=.$func_arith_result - versuffix=.$current.$age.$revision - verstring=$current.$age.$revision - - # Add in all the interfaces that we are compatible with. - loop=$age - while test 0 -ne "$loop"; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result - verstring=$verstring:$iface.0 - done - - # Make executables depend on our current version. - func_append verstring ":$current.0" - ;; - - qnx) - major=.$current - versuffix=.$current - ;; - - sco) - major=.$current - versuffix=.$current - ;; - - sunos) - major=.$current - versuffix=.$current.$revision - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 file systems. - func_arith $current - $age - major=$func_arith_result - versuffix=-$major - ;; - - *) - func_fatal_configuration "unknown library version type '$version_type'" - ;; - esac - - # Clear the version info if we defaulted, and they specified a release. - if test -z "$vinfo" && test -n "$release"; then - major= - case $version_type in - darwin) - # we can't check for "0.0" in archive_cmds due to quoting - # problems, so we reset it completely - verstring= - ;; - *) - verstring=0.0 - ;; - esac - if test no = "$need_version"; then - versuffix= - else - versuffix=.0.0 - fi - fi - - # Remove version info from name if versioning should be avoided - if test yes,no = "$avoid_version,$need_version"; then - major= - versuffix= - verstring= - fi - - # Check to see if the archive will have undefined symbols. - if test yes = "$allow_undefined"; then - if test unsupported = "$allow_undefined_flag"; then - if test yes = "$build_old_libs"; then - func_warning "undefined symbols not allowed in $host shared libraries; building static only" - build_libtool_libs=no - else - func_fatal_error "can't build $host shared library unless -no-undefined is specified" - fi - fi - else - # Don't allow undefined symbols. - allow_undefined_flag=$no_undefined_flag - fi - - fi - - func_generate_dlsyms "$libname" "$libname" : - func_append libobjs " $symfileobj" - test " " = "$libobjs" && libobjs= - - if test relink != "$opt_mode"; then - # Remove our outputs, but don't remove object files since they - # may have been created when compiling PIC objects. - removelist= - tempremovelist=`$ECHO "$output_objdir/*"` - for p in $tempremovelist; do - case $p in - *.$objext | *.gcno) - ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) - if test -n "$precious_files_regex"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then - continue - fi - fi - func_append removelist " $p" - ;; - *) ;; - esac - done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" - fi - - # Now set the variables for building old libraries. - if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then - func_append oldlibs " $output_objdir/$libname.$libext" - - # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` - fi - - # Eliminate all temporary directories. - #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` - #done - - if test -n "$xrpath"; then - # If the user specified any rpath flags, then add them. - temp_xrpath= - for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then - dependency_libs="$temp_xrpath $dependency_libs" - fi - fi - - # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles=$dlfiles - dlfiles= - for lib in $old_dlfiles; do - case " $dlprefiles $dlfiles " in - *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; - esac - done - - # Make sure dlprefiles contains only unique files - old_dlprefiles=$dlprefiles - dlprefiles= - for lib in $old_dlprefiles; do - case "$dlprefiles " in - *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; - esac - done - - if test yes = "$build_libtool_libs"; then - if test -n "$rpath"; then - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) - # these systems don't actually have a c library (as such)! - ;; - *-*-rhapsody* | *-*-darwin1.[012]) - # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" - ;; - *-*-netbsd*) - # Don't link with libc until the a.out ld.so is fixed. - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) - # Do not include libc due to us having libc/libc_r. - ;; - *-*-sco3.2v5* | *-*-sco5v6*) - # Causes problems with __ctype - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - ;; - *) - # Add libc to deplibs on all other systems if necessary. - if test yes = "$build_libtool_need_lc"; then - func_append deplibs " -lc" - fi - ;; - esac - fi - - # Transform deplibs into only deplibs that can be linked in shared. - name_save=$name - libname_save=$libname - release_save=$release - versuffix_save=$versuffix - major_save=$major - # I'm not sure if I'm treating the release correctly. I think - # release should show up in the -l (ie -lgmp5) so we don't want to - # add it in twice. Is that correct? - release= - versuffix= - major= - newdeplibs= - droppeddeps=no - case $deplibs_check_method in - pass_all) - # Don't check for shared/static. Everything works. - # This might be a little naive. We might want to check - # whether the library exists or not. But this is on - # osf3 & osf4 and I'm not really sure... Just - # implementing what was already the behavior. - newdeplibs=$deplibs - ;; - test_compile) - # This code stresses the "libraries are programs" paradigm to its - # limits. Maybe even breaks it. We compile a program, linking it - # against the deplibs as a proxy for the library. Then we can check - # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c - cat > conftest.c <<EOF - int main() { return 0; } -EOF - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then - ldd_output=`ldd conftest` - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i= - ;; - esac - fi - if test -n "$i"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which I believe you do not have" - echo "*** because a test_compile did reveal that the linker did not use it for" - echo "*** its dynamic dependency list that programs get resolved with at runtime." - fi - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - else - # Error occurred in the first compile. Let's try to salvage - # the situation: Compile a separate program for each library. - for i in $deplibs; do - case $i in - -l*) - func_stripname -l '' "$i" - name=$func_stripname_result - $opt_dry_run || $RM conftest - if $LTCC $LTCFLAGS -o conftest conftest.c $i; then - ldd_output=`ldd conftest` - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $i "*) - func_append newdeplibs " $i" - i= - ;; - esac - fi - if test -n "$i"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` - set dummy $deplib_matches; shift - deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then - func_append newdeplibs " $i" - else - droppeddeps=yes - echo - $ECHO "*** Warning: dynamic linker does not accept needed library $i." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because a test_compile did reveal that the linker did not use this one" - echo "*** as a dynamic dependency that programs can get resolved with at runtime." - fi - fi - else - droppeddeps=yes - echo - $ECHO "*** Warning! Library $i is needed by this library but I was not able to" - echo "*** make it link in! You will probably need to install it or some" - echo "*** library that it depends on before this library will be fully" - echo "*** functional. Installing it before continuing would be even better." - fi - ;; - *) - func_append newdeplibs " $i" - ;; - esac - done - fi - ;; - file_magic*) - set dummy $deplibs_check_method; shift - file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib= - ;; - esac - fi - if test -n "$a_deplib"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - if test -n "$file_magic_glob"; then - libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` - else - libnameglob=$libname - fi - test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - if test yes = "$want_nocaseglob"; then - shopt -s nocaseglob - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi - for potent_lib in $potential_libs; do - # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then - continue - fi - # The statement above tries to avoid entering an - # endless loop below, in case of cyclic links. - # We might still enter an endless loop, since a link - # loop can be closed while we follow links, - # but so what? - potlib=$potent_lib - while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | $SED 's/.* -> //'` - case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; - *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; - esac - done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - case " $predeps $postdeps " in - *" $a_deplib "*) - func_append newdeplibs " $a_deplib" - a_deplib= - ;; - esac - fi - if test -n "$a_deplib"; then - libname=`eval "\\$ECHO \"$libname_spec\""` - for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - potential_libs=`ls $i/$libname[.-]* 2>/dev/null` - for potent_lib in $potential_libs; do - potlib=$potent_lib # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" - a_deplib= - break 2 - fi - done - done - fi - if test -n "$a_deplib"; then - droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" - if test -z "$potlib"; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" - else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" - fi - fi - ;; - *) - # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac - done # Gone through all deplibs. - ;; - none | unknown | *) - newdeplibs= - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` - if test yes = "$allow_libtool_libs_with_static_runtimes"; then - for i in $predeps $postdeps; do - # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` - done - fi - case $tmp_deplibs in - *[!\ \ ]*) - echo - if test none = "$deplibs_check_method"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." - else - echo "*** Warning: inter-library dependencies are not known to be supported." - fi - echo "*** All declared inter-library dependencies are being dropped." - droppeddeps=yes - ;; - esac - ;; - esac - versuffix=$versuffix_save - major=$major_save - release=$release_save - libname=$libname_save - name=$name_save - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - if test yes = "$droppeddeps"; then - if test yes = "$module"; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." - if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using 'nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** 'nm' from GNU binutils and a full rebuild may help." - fi - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." - - if test no = "$allow_undefined"; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." - if test no = "$build_old_libs"; then - oldlibs=$output_objdir/$libname.$libext - build_libtool_libs=module - build_old_libs=yes - else - build_libtool_libs=no - fi - fi - fi - fi - # Done checking deplibs! - deplibs=$newdeplibs - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - deplibs=$new_libs - - # All the library-specific variables (install_libdir is set above). - library_names= - old_library= - dlname= - - # Test again, we may have decided not to build it any more - if test yes = "$build_libtool_libs"; then - # Remove $wl instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test yes = "$hardcode_into_libs"; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath=$finalize_rpath - test relink = "$opt_mode" || rpath=$compile_rpath$rpath - for libdir in $rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" - fi - if test -n "$runpath_var" && test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" - fi - test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" - fi - - shlibpath=$finalize_shlibpath - test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath - if test -n "$shlibpath"; then - eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" - fi - - # Get the real and link names of the library. - eval shared_ext=\"$shrext_cmds\" - eval library_names=\"$library_names_spec\" - set dummy $library_names - shift - realname=$1 - shift - - if test -n "$soname_spec"; then - eval soname=\"$soname_spec\" - else - soname=$realname - fi - if test -z "$dlname"; then - dlname=$soname - fi - - lib=$output_objdir/$realname - linknames= - for link - do - func_append linknames " $link" - done - - # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols=$output_objdir/$libname.uexp - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - func_dll_def_p "$export_symbols" || { - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols=$export_symbols - export_symbols= - always_export_symbols=yes - } - fi - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - cmds=$export_symbols_cmds - save_ifs=$IFS; IFS='~' - for cmd1 in $cmds; do - IFS=$save_ifs - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test yes = "$try_normal_branch" \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=$output_objdir/$output_la.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false - else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: - # Break out early, otherwise skipped_export may be - # set to false by a later but shorter cmd. - break - fi - done - IFS=$save_ifs - if test -n "$export_symbols_regex" && test : != "$skipped_export"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - fi - - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test : != "$skipped_export" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - - tmp_deplibs= - for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac - done - deplibs=$tmp_deplibs - - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test yes = "$compiler_needs_object" && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi - if test -n "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - else - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - fi - - if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then - eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" - fi - - # Make a backup of the uninstalled library when relinking - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? - fi - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - eval test_cmds=\"$module_expsym_cmds\" - cmds=$module_expsym_cmds - else - eval test_cmds=\"$module_cmds\" - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds - fi - fi - - if test : != "$skipped_export" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - : - else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. - - # Save the value of $output and $libobjs because we want to - # use them later. If we have whole_archive_flag_spec, we - # want to use save_libobjs as it was before - # whole_archive_flag_spec was expanded, because we can't - # assume the linker understands whole_archive_flag_spec. - # This may have to be revisited, in case too many - # convenience libraries get linked in and end up exceeding - # the spec. - if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then - save_libobjs=$libobjs - fi - save_output=$output - func_basename "$output" - output_la=$func_basename_result - - # Clear the reloadable object creation command queue and - # initialize k to one. - test_cmds= - concat_cmds= - objlist= - last_robj= - k=1 - - if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then - output=$output_objdir/$output_la.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then - output=$output_objdir/$output_la.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test yes = "$compiler_needs_object"; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-$k.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test -z "$objlist" || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test 1 -eq "$k"; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-$k.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-$k.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - func_append delfiles " $output" - - else - output= - fi - - ${skipped_export-false} && { - func_verbose "generating symbol list for '$libname.la'" - export_symbols=$output_objdir/$libname.exp - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" - fi - } - - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" - - # Loop through the commands generated above and execute them. - save_ifs=$IFS; IFS='~' - for cmd in $concat_cmds; do - IFS=$save_ifs - $opt_quiet || { - func_quote_arg expand,pretty "$cmd" - eval "func_echo $func_quote_arg_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - ${skipped_export-false} && { - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols=$export_symbols - test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for '$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands, which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - } - - libobjs=$output - # Restore the value of output. - output=$save_output - - if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then - eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= - fi - # Expand the library linking commands again to reset the - # value of $libobjs for piecewise linking. - - # Do each of the archive commands. - if test yes = "$module" && test -n "$module_cmds"; then - if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then - cmds=$module_expsym_cmds - else - cmds=$module_cmds - fi - else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds - fi - fi - fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - - save_ifs=$IFS; IFS='~' - for cmd in $cmds; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - $opt_quiet || { - func_quote_arg expand,pretty "$cmd" - eval "func_echo $func_quote_arg_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi - - exit $lt_exit - } - done - IFS=$save_ifs - - # Restore the uninstalled library and exit - if test relink = "$opt_mode"; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? - - if test -n "$convenience"; then - if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' - fi - fi - - exit $EXIT_SUCCESS - fi - - # Create links to the real library. - for linkname in $linknames; do - if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' - fi - done - - # If -module or -export-dynamic was specified, set the dlname. - if test yes = "$module" || test yes = "$export_dynamic"; then - # On all known operating systems, these are identical. - dlname=$soname - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then - func_warning "'-dlopen' is ignored for objects" - fi - - case " $deplibs" in - *\ -l* | *\ -L*) - func_warning "'-l' and '-L' are ignored for objects" ;; - esac - - test -n "$rpath" && \ - func_warning "'-rpath' is ignored for objects" - - test -n "$xrpath" && \ - func_warning "'-R' is ignored for objects" - - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for objects" - - test -n "$release" && \ - func_warning "'-release' is ignored for objects" - - case $output in - *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object '$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result - ;; - *) - libobj= - obj=$output - ;; - esac - - # Delete the old objects. - $opt_dry_run || $RM $obj $libobj - - # Objects from convenience libraries. This assumes - # single-version convenience libraries. Whenever we create - # different ones for PIC/non-PIC, this we'll have to duplicate - # the extraction. - reload_conv_objs= - gentop= - # if reload_cmds runs $LD directly, get rid of -Wl from - # whole_archive_flag_spec and hope we can get by with turning comma - # into space. - case $reload_cmds in - *\$LD[\ \$]*) wl= ;; - esac - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags - else - gentop=$output_objdir/${obj}x - func_append generated " $gentop" - - func_extract_archives $gentop $convenience - reload_conv_objs="$reload_objs $func_extract_archives_result" - fi - fi - - # If we're not building shared, we need to use non_pic_objs - test yes = "$build_libtool_libs" || libobjs=$non_pic_objects - - # Create the old-style object. - reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs - - output=$obj - func_execute_cmds "$reload_cmds" 'exit $?' - - # Exit if we aren't doing a library object file. - if test -z "$libobj"; then - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - fi - - test yes = "$build_libtool_libs" || { - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - # Create an invalid libtool object if no PIC, so that we don't - # accidentally link it into a program. - # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? - exit $EXIT_SUCCESS - } - - if test -n "$pic_flag" || test default != "$pic_mode"; then - # Only do commands if we really have different PIC objects. - reload_objs="$libobjs $reload_conv_objs" - output=$libobj - func_execute_cmds "$reload_cmds" 'exit $?' - fi - - if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' - fi - - exit $EXIT_SUCCESS - ;; - - prog) - case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; - esac - test -n "$vinfo" && \ - func_warning "'-version-info' is ignored for programs" - - test -n "$release" && \ - func_warning "'-release' is ignored for programs" - - $preload \ - && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ - && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." - - case $host in - *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` - ;; - esac - - case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test CXX = "$tagname"; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " $wl-bind_at_load" - func_append finalize_command " $wl-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac - - - # move library search paths that coincide with paths to not yet - # installed libraries to the beginning of the library search list - new_libs= - for path in $notinst_path; do - case " $new_libs " in - *" -L$path/$objdir "*) ;; - *) - case " $compile_deplibs " in - *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; - esac - ;; - esac - done - for deplib in $compile_deplibs; do - case $deplib in - -L*) - case " $new_libs " in - *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; - esac - ;; - *) func_append new_libs " $deplib" ;; - esac - done - compile_deplibs=$new_libs - - - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" - - if test -n "$rpath$xrpath"; then - # If the user specified any rpath flags, then add them. - for libdir in $rpath $xrpath; do - # This is the magic to use -rpath. - case "$finalize_rpath " in - *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; - esac - done - fi - - # Now hardcode the library paths - rpath= - hardcode_libdirs= - for libdir in $compile_rpath $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$perm_rpath " in - *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; - esac - fi - case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` - case :$dllsearchpath: in - *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; - esac - case :$dllsearchpath: in - *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; - esac - ;; - esac - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - compile_rpath=$rpath - - rpath= - hardcode_libdirs= - for libdir in $finalize_rpath; do - if test -n "$hardcode_libdir_flag_spec"; then - if test -n "$hardcode_libdir_separator"; then - if test -z "$hardcode_libdirs"; then - hardcode_libdirs=$libdir - else - # Just accumulate the unique libdirs. - case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in - *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) - ;; - *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" - ;; - esac - fi - else - eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" - fi - elif test -n "$runpath_var"; then - case "$finalize_perm_rpath " in - *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; - esac - fi - done - # Substitute the hardcoded libdirs into the rpath. - if test -n "$hardcode_libdir_separator" && - test -n "$hardcode_libdirs"; then - libdir=$hardcode_libdirs - eval rpath=\" $hardcode_libdir_flag_spec\" - fi - finalize_rpath=$rpath - - if test -n "$libobjs" && test yes = "$build_old_libs"; then - # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - fi - - func_generate_dlsyms "$outputname" "@PROGRAM@" false - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=: - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=false - ;; - *cygwin* | *mingw* ) - test yes = "$build_libtool_libs" || wrappers_required=false - ;; - *) - if test no = "$need_relink" || test yes != "$build_libtool_libs"; then - wrappers_required=false - fi - ;; - esac - $wrappers_required || { - # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command=$compile_command$compile_rpath - - # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Delete the generated files. - if test -f "$output_objdir/${outputname}S.$objext"; then - func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' - fi - - exit $exit_status - } - - if test -n "$compile_shlibpath$finalize_shlibpath"; then - compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" - fi - if test -n "$finalize_shlibpath"; then - finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" - fi - - compile_var= - finalize_var= - if test -n "$runpath_var"; then - if test -n "$perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $perm_rpath; do - func_append rpath "$dir:" - done - compile_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - if test -n "$finalize_perm_rpath"; then - # We should set the runpath_var. - rpath= - for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" - done - finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " - fi - fi - - if test yes = "$no_install"; then - # We don't need to create a wrapper script. - link_command=$compile_var$compile_command$compile_rpath - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - # Delete the old output file. - $opt_dry_run || $RM $output - # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - exit $EXIT_SUCCESS - fi - - case $hardcode_action,$fast_install in - relink,*) - # Fast installation is not supported - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - - func_warning "this platform does not like uninstalled shared libraries" - func_warning "'$output' will be relinked during installation" - ;; - *,yes) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - ;; - *,no) - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - ;; - *,needless) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command= - ;; - esac - - # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` - - # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname - - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - - # Now create the wrapper script. - func_verbose "creating $output" - - # Quote the relink command for shipping. - if test -n "$relink_command"; then - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_arg pretty "$var_value" - relink_command="$var=$func_quote_arg_result; export $var; $relink_command" - fi - done - func_quote eval cd "`pwd`" - func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" - relink_command=$func_quote_arg_unquoted_result - fi - - # Only actually do things if not in dry run mode. - $opt_dry_run || { - # win32 will think the script is a binary if it has - # a .exe suffix, so we strip it off here. - case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; - esac - # test for cygwin because mv fails w/o .exe extensions - case $host in - *cygwin*) - exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; - *) exeext= ;; - esac - case $host in - *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource=$output_path/$objdir/lt-$output_name.c - cwrapper=$output_path/$output_name.exe - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - - func_emit_cwrapperexe_src > $cwrappersource - - # The wrapper executable is built using the $host compiler, - # because it contains $host paths and files. If cross- - # compiling, it, like the target executable, must be - # executed on the $host or under an emulation environment. - $opt_dry_run || { - $LTCC $LTCFLAGS -o $cwrapper $cwrappersource - $STRIP $cwrapper - } - - # Now, create the wrapper script for func_source use: - func_ltwrapper_scriptname $cwrapper - $RM $func_ltwrapper_scriptname_result - trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 - $opt_dry_run || { - # note: this script will not be executed, so do not chmod. - if test "x$build" = "x$host"; then - $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } - ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - - func_emit_wrapper no > $output - chmod +x $output - ;; - esac - } - exit $EXIT_SUCCESS - ;; - esac - - # See if we need to build an old-fashioned archive. - for oldlib in $oldlibs; do - - case $build_libtool_libs in - convenience) - oldobjs="$libobjs_save $symfileobj" - addlibs=$convenience - build_libtool_libs=no - ;; - module) - oldobjs=$libobjs_save - addlibs=$old_convenience - build_libtool_libs=no - ;; - *) - oldobjs="$old_deplibs $non_pic_objects" - $preload && test -f "$symfileobj" \ - && func_append oldobjs " $symfileobj" - addlibs=$old_convenience - ;; - esac - - if test -n "$addlibs"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" - fi - - # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then - cmds=$old_archive_from_new_cmds - else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - - # POSIX demands no paths to be encoded in archives. We have - # to avoid creating archives with duplicate basenames if we - # might have to extract them afterwards, e.g., when creating a - # static archive out of a convenience library, or when linking - # the entirety of a libtool archive into another (currently - # not supported by libtool). - if (for obj in $oldobjs - do - func_basename "$obj" - $ECHO "$func_basename_result" - done | sort | sort -uc >/dev/null 2>&1); then - : - else - echo "copying selected object files to avoid basename conflicts..." - gentop=$output_objdir/${outputname}x - func_append generated " $gentop" - func_mkdir_p "$gentop" - save_oldobjs=$oldobjs - oldobjs= - counter=1 - for obj in $save_oldobjs - do - func_basename "$obj" - objbase=$func_basename_result - case " $oldobjs " in - " ") oldobjs=$obj ;; - *[\ /]"$objbase "*) - while :; do - # Make sure we don't pick an alternate name that also - # overlaps. - newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result - case " $oldobjs " in - *[\ /]"$newobj "*) ;; - *) if test ! -f "$gentop/$newobj"; then break; fi ;; - esac - done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" - ;; - *) func_append oldobjs " $obj" ;; - esac - done - fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - eval cmds=\"$old_archive_cmds\" - - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" - cmds=$old_archive_cmds - else - # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." - save_RANLIB=$RANLIB - RANLIB=: - objlist= - concat_cmds= - save_oldobjs=$oldobjs - oldobjs= - # Is there a better way of finding the last object in the list? - for obj in $save_oldobjs - do - last_oldobj=$obj - done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - for obj in $save_oldobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then - : - else - # the above command should be used before it gets too long - oldobjs=$objlist - if test "$obj" = "$last_oldobj"; then - RANLIB=$save_RANLIB - fi - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" - objlist= - len=$len0 - fi - done - RANLIB=$save_RANLIB - oldobjs=$objlist - if test -z "$oldobjs"; then - eval cmds=\"\$concat_cmds\" - else - eval cmds=\"\$concat_cmds~\$old_archive_cmds\" - fi - fi - fi - func_execute_cmds "$cmds" 'exit $?' - done - - test -n "$generated" && \ - func_show_eval "${RM}r$generated" - - # Now create the libtool archive. - case $output in - *.la) - old_library= - test yes = "$build_old_libs" && old_library=$libname.$libext - func_verbose "creating $output" - - # Preserve any variables that may affect compiler behavior - for var in $variables_saved_for_relink; do - if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" - elif eval var_value=\$$var; test -z "$var_value"; then - relink_command="$var=; export $var; $relink_command" - else - func_quote_arg pretty,unquoted "$var_value" - relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" - fi - done - # Quote the link command for shipping. - func_quote eval cd "`pwd`" - relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - func_quote_arg pretty,unquoted "$relink_command" - relink_command=$func_quote_arg_unquoted_result - if test yes = "$hardcode_automatic"; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test yes = "$installed"; then - if test -z "$install_libdir"; then - break - fi - output=$output_objdir/${outputname}i - # Replace all uninstalled libtool libraries with the installed ones - newdependency_libs= - for deplib in $dependency_libs; do - case $deplib in - *.la) - func_basename "$deplib" - name=$func_basename_result - func_resolve_sysroot "$deplib" - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "'$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" - ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; - esac - done - dependency_libs=$newdependency_libs - newdlfiles= - - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name=$func_basename_result - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "'$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac - done - dlprefiles=$newdlprefiles - else - newdlfiles= - for lib in $dlfiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlfiles " $abs" - done - dlfiles=$newdlfiles - newdlprefiles= - for lib in $dlprefiles; do - case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; - *) abs=`pwd`"/$lib" ;; - esac - func_append newdlprefiles " $abs" - done - dlprefiles=$newdlprefiles - fi - $RM $output - # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. - tdlname=$dlname - case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test -n "$bindir"; then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result/$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; - esac - $ECHO > $output "\ -# $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE) $VERSION -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='$tdlname' - -# Names of this library. -library_names='$library_names' - -# The name of the static archive. -old_library='$old_library' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - -# Libraries that this one depends upon. -dependency_libs='$dependency_libs' - -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - -# Version information for $libname. -current=$current -age=$age -revision=$revision - -# Is this an already installed library? -installed=$installed - -# Should we warn about portability when linking against -modules? -shouldnotlink=$module - -# Files to dlopen/dlpreopen -dlopen='$dlfiles' -dlpreopen='$dlprefiles' - -# Directory that this library needs to be installed in: -libdir='$install_libdir'" - if test no,yes = "$installed,$need_relink"; then - $ECHO >> $output "\ -relink_command=\"$relink_command\"" - fi - done - } - - # Do a symbolic link so that the libtool archive can be found in - # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' - ;; - esac - exit $EXIT_SUCCESS -} - -if test link = "$opt_mode" || test relink = "$opt_mode"; then - func_mode_link ${1+"$@"} -fi - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $debug_cmd - - RM=$nonopt - files= - rmforce=false - exit_status=0 - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic=$magic - - for arg - do - case $arg in - -f) func_append RM " $arg"; rmforce=: ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; - esac - done - - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" - - rmdirs= - - for file in $files; do - func_dirname "$file" "" "." - dir=$func_dirname_result - if test . = "$dir"; then - odir=$objdir - else - odir=$dir/$objdir - fi - func_basename "$file" - name=$func_basename_result - test uninstall = "$opt_mode" && odir=$dir - - # Remember odir for removal later, being careful to avoid duplicates - if test clean = "$opt_mode"; then - case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; - esac - fi - - # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then - : - elif test -d "$file"; then - exit_status=1 - continue - elif $rmforce; then - continue - fi - - rmfiles=$file - - case $name in - *.la) - # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name - - # Delete the libtool libraries and symlinks. - for n in $library_names; do - func_append rmfiles " $odir/$n" - done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" - - case $opt_mode in - clean) - case " $library_names " in - *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; - esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" - ;; - uninstall) - if test -n "$library_names"; then - # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' - fi - # FIXME: should reinstall the best remaining shared library. - ;; - esac - fi - ;; - - *.lo) - # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then - - # Read the .lo file - func_source $dir/$name - - # Add PIC object to the list of files to remove. - if test -n "$pic_object" && test none != "$pic_object"; then - func_append rmfiles " $dir/$pic_object" - fi - - # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && test none != "$non_pic_object"; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test clean = "$opt_mode"; then - noexename=$name - case $file in - *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result - # $file with .exe has already been added to rmfiles, - # add $file without .exe - func_append rmfiles " $file" - ;; - esac - # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi - - # note $name still contains .exe if it was in $file originally - # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.$objext" - if test yes = "$fast_install" && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" - fi - if test "X$noexename" != "X$name"; then - func_append rmfiles " $odir/lt-$noexename.c" - fi - fi - fi - ;; - esac - func_show_eval "$RM $rmfiles" 'exit_status=1' - done - - # Try to remove the $objdir's in the directories where we deleted files - for dir in $rmdirs; do - if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" - fi - done - - exit $exit_status -} - -if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then - func_mode_uninstall ${1+"$@"} -fi - -test -z "$opt_mode" && { - help=$generic_help - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode '$opt_mode'" - -if test -n "$exec_cmd"; then - eval exec "$exec_cmd" - exit $EXIT_FAILURE -fi - -exit $exit_status - - -# The TAGs below are defined such that we never get into a situation -# where we disable both kinds of libraries. Given conflicting -# choices, we go for a static library, that is the most portable, -# since we can't tell whether shared libraries were disabled because -# the user asked for that or because the platform doesn't support -# them. This is particularly important on AIX, because we don't -# support having both static and shared libraries enabled at the same -# time on that platform, so we default to a shared-only configuration. -# If a disable-shared tag is given, we'll fallback to a static-only -# configuration. But we'll never go from static-only to shared-only. - -# ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes -# ### END LIBTOOL TAG CONFIG: disable-shared - -# ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` -# ### END LIBTOOL TAG CONFIG: disable-static - -# Local Variables: -# mode:shell-script -# sh-indentation:2 -# End: diff --git a/ldns/net.c b/ldns/net.c deleted file mode 100644 index 38d00cf..0000000 --- a/ldns/net.c +++ /dev/null @@ -1,1036 +0,0 @@ -/* - * net.c - * - * Network implementation - * All network related functions are grouped here - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif -#include <sys/time.h> -#include <errno.h> -#include <fcntl.h> -#ifdef HAVE_POLL -#include <poll.h> -#endif - -ldns_status -ldns_send(ldns_pkt **result_packet, ldns_resolver *r, const ldns_pkt *query_pkt) -{ - ldns_buffer *qb; - ldns_status result; - ldns_rdf *tsig_mac = NULL; - - qb = ldns_buffer_new(LDNS_MIN_BUFLEN); - - if (query_pkt && ldns_pkt_tsig(query_pkt)) { - tsig_mac = ldns_rr_rdf(ldns_pkt_tsig(query_pkt), 3); - } - - if (!query_pkt || - ldns_pkt2buffer_wire(qb, query_pkt) != LDNS_STATUS_OK) { - result = LDNS_STATUS_ERR; - } else { - result = ldns_send_buffer(result_packet, r, qb, tsig_mac); - } - - ldns_buffer_free(qb); - - return result; -} - -/* code from rdata.c */ -static struct sockaddr_storage * -ldns_rdf2native_sockaddr_storage_port( - const ldns_rdf *rd, uint16_t port, size_t *size) -{ - struct sockaddr_storage *data; - struct sockaddr_in *data_in; - struct sockaddr_in6 *data_in6; - - data = LDNS_MALLOC(struct sockaddr_storage); - if (!data) { - return NULL; - } - /* zero the structure for portability */ - memset(data, 0, sizeof(struct sockaddr_storage)); - - switch(ldns_rdf_get_type(rd)) { - case LDNS_RDF_TYPE_A: -#ifndef S_SPLINT_S - data->ss_family = AF_INET; -#endif - data_in = (struct sockaddr_in*) data; - data_in->sin_port = (in_port_t)htons(port); - memcpy(&(data_in->sin_addr), ldns_rdf_data(rd), ldns_rdf_size(rd)); - *size = sizeof(struct sockaddr_in); - return data; - case LDNS_RDF_TYPE_AAAA: -#ifndef S_SPLINT_S - data->ss_family = AF_INET6; -#endif - data_in6 = (struct sockaddr_in6*) data; - data_in6->sin6_port = (in_port_t)htons(port); - memcpy(&data_in6->sin6_addr, ldns_rdf_data(rd), ldns_rdf_size(rd)); - *size = sizeof(struct sockaddr_in6); - return data; - default: - LDNS_FREE(data); - return NULL; - } -} - -struct sockaddr_storage * -ldns_rdf2native_sockaddr_storage( - const ldns_rdf *rd, uint16_t port, size_t *size) -{ - return ldns_rdf2native_sockaddr_storage_port( - rd, (port == 0 ? (uint16_t)LDNS_PORT : port), size); -} - -/** best effort to set nonblocking */ -static void -ldns_sock_nonblock(int sockfd) -{ -#ifdef HAVE_FCNTL - int flag; - if((flag = fcntl(sockfd, F_GETFL)) != -1) { - flag |= O_NONBLOCK; - if(fcntl(sockfd, F_SETFL, flag) == -1) { - /* ignore error, continue blockingly */ - } - } -#elif defined(HAVE_IOCTLSOCKET) - unsigned long on = 1; - if(ioctlsocket(sockfd, FIONBIO, &on) != 0) { - /* ignore error, continue blockingly */ - } -#endif -} - -/** best effort to set blocking */ -static void -ldns_sock_block(int sockfd) -{ -#ifdef HAVE_FCNTL - int flag; - if((flag = fcntl(sockfd, F_GETFL)) != -1) { - flag &= ~O_NONBLOCK; - if(fcntl(sockfd, F_SETFL, flag) == -1) { - /* ignore error, continue */ - } - } -#elif defined(HAVE_IOCTLSOCKET) - unsigned long off = 0; - if(ioctlsocket(sockfd, FIONBIO, &off) != 0) { - /* ignore error, continue */ - } -#endif -} - -/** wait for a socket to become ready */ -static int -ldns_sock_wait(int sockfd, struct timeval timeout, int write) -{ - int ret; -#ifndef HAVE_POLL -#ifndef S_SPLINT_S - fd_set fds; - FD_ZERO(&fds); - FD_SET(FD_SET_T sockfd, &fds); - if(write) - ret = select(sockfd+1, NULL, &fds, NULL, &timeout); - else - ret = select(sockfd+1, &fds, NULL, NULL, &timeout); -#endif -#else - struct pollfd pfds[2]; - - memset(&pfds[0], 0, sizeof(pfds[0]) * 2); - - pfds[0].fd = sockfd; - pfds[0].events = POLLIN|POLLERR; - - if (write) { - pfds[0].events |= POLLOUT; - } - - ret = poll(pfds, 1, (int)(timeout.tv_sec * 1000 - + timeout.tv_usec / 1000)); -#endif - if(ret == 0) - /* timeout expired */ - return 0; - else if(ret == -1) - /* error */ - return 0; - return 1; -} - - -static int -ldns_tcp_connect_from(const struct sockaddr_storage *to, socklen_t tolen, - const struct sockaddr_storage *from, socklen_t fromlen, - struct timeval timeout) -{ - int sockfd; - -#ifndef S_SPLINT_S - if ((sockfd = socket((int)((struct sockaddr*)to)->sa_family, SOCK_STREAM, - IPPROTO_TCP)) == SOCK_INVALID) { - return -1; - } -#endif - if (from && bind(sockfd, (const struct sockaddr*)from, fromlen) == SOCK_INVALID){ - close_socket(sockfd); - return -1; - } - - /* perform nonblocking connect, to be able to wait with select() */ - ldns_sock_nonblock(sockfd); - if (connect(sockfd, (struct sockaddr*)to, tolen) == SOCK_INVALID) { -#ifndef USE_WINSOCK -#ifdef EINPROGRESS - if(errno != EINPROGRESS) { -#else - if(1) { -#endif - close_socket(sockfd); - return -1; - } -#else /* USE_WINSOCK */ - if(WSAGetLastError() != WSAEINPROGRESS && - WSAGetLastError() != WSAEWOULDBLOCK) { - close_socket(sockfd); - return -1; - } -#endif - /* error was only telling us that it would block */ - } - - /* wait(write) until connected or error */ - while(1) { - int error = 0; - socklen_t len = (socklen_t)sizeof(error); - - if(!ldns_sock_wait(sockfd, timeout, 1)) { - close_socket(sockfd); - return -1; - } - - /* check if there is a pending error for nonblocking connect */ - if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)&error, - &len) < 0) { -#ifndef USE_WINSOCK - error = errno; /* on solaris errno is error */ -#else - error = WSAGetLastError(); -#endif - } -#ifndef USE_WINSOCK -#if defined(EINPROGRESS) && defined(EWOULDBLOCK) - if(error == EINPROGRESS || error == EWOULDBLOCK) - continue; /* try again */ -#endif - else if(error != 0) { - close_socket(sockfd); - /* error in errno for our user */ - errno = error; - return -1; - } -#else /* USE_WINSOCK */ - if(error == WSAEINPROGRESS) - continue; - else if(error == WSAEWOULDBLOCK) - continue; - else if(error != 0) { - close_socket(sockfd); - errno = error; - return -1; - } -#endif /* USE_WINSOCK */ - /* connected */ - break; - } - - /* set the socket blocking again */ - ldns_sock_block(sockfd); - - return sockfd; -} - -int -ldns_tcp_connect(const struct sockaddr_storage *to, socklen_t tolen, - struct timeval timeout) -{ - int s = ldns_tcp_connect_from(to, tolen, NULL, 0, timeout); - return s > 0 ? s : 0; -} - -int -ldns_tcp_connect2(const struct sockaddr_storage *to, socklen_t tolen, - struct timeval timeout) -{ - return ldns_tcp_connect_from(to, tolen, NULL, 0, timeout); -} - -static int -ldns_tcp_bgsend_from(ldns_buffer *qbin, - const struct sockaddr_storage *to, socklen_t tolen, - const struct sockaddr_storage *from, socklen_t fromlen, - struct timeval timeout) -{ - int sockfd; - - sockfd = ldns_tcp_connect_from(to, tolen, from, fromlen, timeout); - - if (sockfd >= 0 && ldns_tcp_send_query(qbin, sockfd, to, tolen) == 0) { - close_socket(sockfd); - return -1; - } - - return sockfd; -} - -int -ldns_tcp_bgsend(ldns_buffer *qbin, - const struct sockaddr_storage *to, socklen_t tolen, - struct timeval timeout) -{ - int s = ldns_tcp_bgsend_from(qbin, to, tolen, NULL, 0, timeout); - return s > 0 ? s : 0; -} - -int -ldns_tcp_bgsend2(ldns_buffer *qbin, - const struct sockaddr_storage *to, socklen_t tolen, - struct timeval timeout) -{ - return ldns_tcp_bgsend_from(qbin, to, tolen, NULL, 0, timeout); -} - -/* keep in mind that in DNS tcp messages the first 2 bytes signal the - * amount data to expect - */ -static ldns_status -ldns_tcp_send_from(uint8_t **result, ldns_buffer *qbin, - const struct sockaddr_storage *to, socklen_t tolen, - const struct sockaddr_storage *from, socklen_t fromlen, - struct timeval timeout, size_t *answer_size) -{ - int sockfd; - uint8_t *answer; - - sockfd = ldns_tcp_bgsend_from(qbin, to, tolen, from, fromlen, timeout); - - if (sockfd == -1) { - return LDNS_STATUS_ERR; - } - - answer = ldns_tcp_read_wire_timeout(sockfd, answer_size, timeout); - close_socket(sockfd); - - if (!answer) { - /* oops */ - return LDNS_STATUS_NETWORK_ERR; - } - - *result = answer; - return LDNS_STATUS_OK; -} - -ldns_status -ldns_tcp_send(uint8_t **result, ldns_buffer *qbin, - const struct sockaddr_storage *to, socklen_t tolen, - struct timeval timeout, size_t *answer_size) -{ - return ldns_tcp_send_from(result, qbin, - to, tolen, NULL, 0, timeout, answer_size); -} - -int -ldns_udp_connect(const struct sockaddr_storage *to, struct timeval ATTR_UNUSED(timeout)) -{ - int sockfd; - -#ifndef S_SPLINT_S - if ((sockfd = socket((int)((struct sockaddr*)to)->sa_family, SOCK_DGRAM, - IPPROTO_UDP)) - == SOCK_INVALID) { - return 0; - } -#endif - return sockfd; -} - -int -ldns_udp_connect2(const struct sockaddr_storage *to, struct timeval ATTR_UNUSED(timeout)) -{ - int sockfd; - -#ifndef S_SPLINT_S - if ((sockfd = socket((int)((struct sockaddr*)to)->sa_family, SOCK_DGRAM, - IPPROTO_UDP)) - == SOCK_INVALID) { - return -1; - } -#endif - return sockfd; -} - -static int -ldns_udp_bgsend_from(ldns_buffer *qbin, - const struct sockaddr_storage *to , socklen_t tolen, - const struct sockaddr_storage *from, socklen_t fromlen, - struct timeval timeout) -{ - int sockfd; - - sockfd = ldns_udp_connect2(to, timeout); - - if (sockfd == -1) { - return -1; - } - - if (from && bind(sockfd, (const struct sockaddr*)from, fromlen) == -1){ - close_socket(sockfd); - return -1; - } - - if (ldns_udp_send_query(qbin, sockfd, to, tolen) == 0) { - close_socket(sockfd); - return -1; - } - return sockfd; -} - -int -ldns_udp_bgsend(ldns_buffer *qbin, - const struct sockaddr_storage *to , socklen_t tolen, - struct timeval timeout) -{ - int s = ldns_udp_bgsend_from(qbin, to, tolen, NULL, 0, timeout); - return s > 0 ? s : 0; -} - -int -ldns_udp_bgsend2(ldns_buffer *qbin, - const struct sockaddr_storage *to , socklen_t tolen, - struct timeval timeout) -{ - return ldns_udp_bgsend_from(qbin, to, tolen, NULL, 0, timeout); -} - -static ldns_status -ldns_udp_send_from(uint8_t **result, ldns_buffer *qbin, - const struct sockaddr_storage *to , socklen_t tolen, - const struct sockaddr_storage *from, socklen_t fromlen, - struct timeval timeout, size_t *answer_size) -{ - int sockfd; - uint8_t *answer; - - sockfd = ldns_udp_bgsend_from(qbin, to, tolen, from, fromlen, timeout); - - if (sockfd == -1) { - return LDNS_STATUS_SOCKET_ERROR; - } - - /* wait for an response*/ - if(!ldns_sock_wait(sockfd, timeout, 0)) { - close_socket(sockfd); - return LDNS_STATUS_NETWORK_ERR; - } - - /* set to nonblocking, so if the checksum is bad, it becomes - * an EGAIN error and the ldns_udp_send function does not block, - * but returns a 'NETWORK_ERROR' much like a timeout. */ - ldns_sock_nonblock(sockfd); - - answer = ldns_udp_read_wire(sockfd, answer_size, NULL, NULL); - close_socket(sockfd); - - if (!answer) { - /* oops */ - return LDNS_STATUS_NETWORK_ERR; - } - - *result = answer; - return LDNS_STATUS_OK; -} - -ldns_status -ldns_udp_send(uint8_t **result, ldns_buffer *qbin, - const struct sockaddr_storage *to , socklen_t tolen, - struct timeval timeout, size_t *answer_size) -{ - return ldns_udp_send_from(result, qbin, to, tolen, NULL, 0, - timeout, answer_size); -} - -ldns_status -ldns_send_buffer(ldns_pkt **result, ldns_resolver *r, ldns_buffer *qb, ldns_rdf *tsig_mac) -{ - uint8_t i; - - struct sockaddr_storage *src = NULL; - size_t src_len = 0; - struct sockaddr_storage *ns; - size_t ns_len; - struct timeval tv_s; - struct timeval tv_e; - - ldns_rdf **ns_array; - size_t *rtt; - ldns_pkt *reply; - bool all_servers_rtt_inf; - uint8_t retries; - - uint8_t *reply_bytes = NULL; - size_t reply_size = 0; - ldns_status status, send_status; - - assert(r != NULL); - - status = LDNS_STATUS_OK; - rtt = ldns_resolver_rtt(r); - ns_array = ldns_resolver_nameservers(r); - reply = NULL; - ns_len = 0; - - all_servers_rtt_inf = true; - - if (ldns_resolver_random(r)) { - ldns_resolver_nameservers_randomize(r); - } - - if(ldns_resolver_source(r)) { - src = ldns_rdf2native_sockaddr_storage_port( - ldns_resolver_source(r), 0, &src_len); - } - - /* loop through all defined nameservers */ - for (i = 0; i < ldns_resolver_nameserver_count(r); i++) { - if (rtt[i] == LDNS_RESOLV_RTT_INF) { - /* not reachable nameserver! */ - continue; - } - - /* maybe verbosity setting? - printf("Sending to "); - ldns_rdf_print(stdout, ns_array[i]); - printf("\n"); - */ - ns = ldns_rdf2native_sockaddr_storage(ns_array[i], - ldns_resolver_port(r), &ns_len); - - -#ifndef S_SPLINT_S - if ((ns->ss_family == AF_INET) && - (ldns_resolver_ip6(r) == LDNS_RESOLV_INET6)) { - /* not reachable */ - LDNS_FREE(ns); - continue; - } - - if ((ns->ss_family == AF_INET6) && - (ldns_resolver_ip6(r) == LDNS_RESOLV_INET)) { - /* not reachable */ - LDNS_FREE(ns); - continue; - } -#endif - - all_servers_rtt_inf = false; - - gettimeofday(&tv_s, NULL); - - send_status = LDNS_STATUS_ERR; - - /* reply_bytes implicitly handles our error */ - if (ldns_resolver_usevc(r)) { - for (retries = ldns_resolver_retry(r); retries > 0; retries--) { - send_status = - ldns_tcp_send_from(&reply_bytes, qb, - ns, (socklen_t)ns_len, - src, (socklen_t)src_len, - ldns_resolver_timeout(r), - &reply_size); - if (send_status == LDNS_STATUS_OK) { - break; - } - } - } else { - for (retries = ldns_resolver_retry(r); retries > 0; retries--) { - /* ldns_rdf_print(stdout, ns_array[i]); */ - send_status = - ldns_udp_send_from(&reply_bytes, qb, - ns, (socklen_t)ns_len, - src, (socklen_t)src_len, - ldns_resolver_timeout(r), - &reply_size); - if (send_status == LDNS_STATUS_OK) { - break; - } - } - } - - if (send_status != LDNS_STATUS_OK) { - ldns_resolver_set_nameserver_rtt(r, i, LDNS_RESOLV_RTT_INF); - status = send_status; - } - - /* obey the fail directive */ - if (!reply_bytes) { - /* the current nameserver seems to have a problem, blacklist it */ - if (ldns_resolver_fail(r)) { - if(src) { - LDNS_FREE(src); - } - LDNS_FREE(ns); - return LDNS_STATUS_ERR; - } else { - LDNS_FREE(ns); - continue; - } - } - - status = ldns_wire2pkt(&reply, reply_bytes, reply_size); - if (status != LDNS_STATUS_OK) { - if(src) LDNS_FREE(src); - LDNS_FREE(reply_bytes); - LDNS_FREE(ns); - return status; - } - assert(reply); - - LDNS_FREE(ns); - gettimeofday(&tv_e, NULL); - - if (reply) { - ldns_pkt_set_querytime(reply, (uint32_t) - ((tv_e.tv_sec - tv_s.tv_sec) * 1000) + - (tv_e.tv_usec - tv_s.tv_usec) / 1000); - ldns_pkt_set_answerfrom(reply, - ldns_rdf_clone(ns_array[i])); - ldns_pkt_set_timestamp(reply, tv_s); - ldns_pkt_set_size(reply, reply_size); - break; - } else { - if (ldns_resolver_fail(r)) { - /* if fail is set bail out, after the first - * one */ - break; - } - } - - /* wait retrans seconds... */ - sleep((unsigned int) ldns_resolver_retrans(r)); - } - - if(src) { - LDNS_FREE(src); - } - if (all_servers_rtt_inf) { - LDNS_FREE(reply_bytes); - return LDNS_STATUS_RES_NO_NS; - } -#ifdef HAVE_SSL - if (tsig_mac && reply && reply_bytes) { - if (!ldns_pkt_tsig_verify(reply, - reply_bytes, - reply_size, - ldns_resolver_tsig_keyname(r), - ldns_resolver_tsig_keydata(r), tsig_mac)) { - status = LDNS_STATUS_CRYPTO_TSIG_BOGUS; - } - } -#else - (void)tsig_mac; -#endif /* HAVE_SSL */ - - LDNS_FREE(reply_bytes); - if (result) { - *result = reply; - } - - return status; -} - -ssize_t -ldns_tcp_send_query(ldns_buffer *qbin, int sockfd, - const struct sockaddr_storage *to, socklen_t tolen) -{ - uint8_t *sendbuf; - ssize_t bytes; - - /* add length of packet */ - sendbuf = LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2); - if(!sendbuf) return 0; - ldns_write_uint16(sendbuf, ldns_buffer_position(qbin)); - memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin)); - - bytes = sendto(sockfd, (void*)sendbuf, - ldns_buffer_position(qbin) + 2, 0, (struct sockaddr *)to, tolen); - - LDNS_FREE(sendbuf); - - if (bytes == -1 || (size_t) bytes != ldns_buffer_position(qbin) + 2 ) { - return 0; - } - return bytes; -} - -/* don't wait for an answer */ -ssize_t -ldns_udp_send_query(ldns_buffer *qbin, int sockfd, const struct sockaddr_storage *to, - socklen_t tolen) -{ - ssize_t bytes; - - bytes = sendto(sockfd, (void*)ldns_buffer_begin(qbin), - ldns_buffer_position(qbin), 0, (struct sockaddr *)to, tolen); - - if (bytes == -1 || (size_t)bytes != ldns_buffer_position(qbin)) { - return 0; - } - return bytes; -} - -uint8_t * -ldns_udp_read_wire(int sockfd, size_t *size, struct sockaddr_storage *from, - socklen_t *fromlen) -{ - uint8_t *wire, *wireout; - ssize_t wire_size; - - wire = LDNS_XMALLOC(uint8_t, LDNS_MAX_PACKETLEN); - if (!wire) { - *size = 0; - return NULL; - } - - wire_size = recvfrom(sockfd, (void*)wire, LDNS_MAX_PACKETLEN, 0, - (struct sockaddr *)from, fromlen); - - /* recvfrom can also return 0 */ - if (wire_size == -1 || wire_size == 0) { - *size = 0; - LDNS_FREE(wire); - return NULL; - } - - *size = (size_t)wire_size; - wireout = LDNS_XREALLOC(wire, uint8_t, (size_t)wire_size); - if(!wireout) LDNS_FREE(wire); - - return wireout; -} - -uint8_t * -ldns_tcp_read_wire_timeout(int sockfd, size_t *size, struct timeval timeout) -{ - uint8_t *wire; - uint16_t wire_size; - ssize_t bytes = 0, rc = 0; - - wire = LDNS_XMALLOC(uint8_t, 2); - if (!wire) { - *size = 0; - return NULL; - } - - while (bytes < 2) { - if(!ldns_sock_wait(sockfd, timeout, 0)) { - *size = 0; - LDNS_FREE(wire); - return NULL; - } - rc = recv(sockfd, (void*) (wire + bytes), - (size_t) (2 - bytes), 0); - if (rc == -1 || rc == 0) { - *size = 0; - LDNS_FREE(wire); - return NULL; - } - bytes += rc; - } - - wire_size = ldns_read_uint16(wire); - - LDNS_FREE(wire); - wire = LDNS_XMALLOC(uint8_t, wire_size); - if (!wire) { - *size = 0; - return NULL; - } - bytes = 0; - - while (bytes < (ssize_t) wire_size) { - if(!ldns_sock_wait(sockfd, timeout, 0)) { - *size = 0; - LDNS_FREE(wire); - return NULL; - } - rc = recv(sockfd, (void*) (wire + bytes), - (size_t) (wire_size - bytes), 0); - if (rc == -1 || rc == 0) { - LDNS_FREE(wire); - *size = 0; - return NULL; - } - bytes += rc; - } - - *size = (size_t) bytes; - return wire; -} - -uint8_t * -ldns_tcp_read_wire(int sockfd, size_t *size) -{ - uint8_t *wire; - uint16_t wire_size; - ssize_t bytes = 0, rc = 0; - - wire = LDNS_XMALLOC(uint8_t, 2); - if (!wire) { - *size = 0; - return NULL; - } - - while (bytes < 2) { - rc = recv(sockfd, (void*) (wire + bytes), - (size_t) (2 - bytes), 0); - if (rc == -1 || rc == 0) { - *size = 0; - LDNS_FREE(wire); - return NULL; - } - bytes += rc; - } - - wire_size = ldns_read_uint16(wire); - - LDNS_FREE(wire); - wire = LDNS_XMALLOC(uint8_t, wire_size); - if (!wire) { - *size = 0; - return NULL; - } - bytes = 0; - - while (bytes < (ssize_t) wire_size) { - rc = recv(sockfd, (void*) (wire + bytes), - (size_t) (wire_size - bytes), 0); - if (rc == -1 || rc == 0) { - LDNS_FREE(wire); - *size = 0; - return NULL; - } - bytes += rc; - } - - *size = (size_t) bytes; - return wire; -} - -#ifndef S_SPLINT_S -ldns_rdf * -ldns_sockaddr_storage2rdf(const struct sockaddr_storage *sock, uint16_t *port) -{ - ldns_rdf *addr; - struct sockaddr_in *data_in; - struct sockaddr_in6 *data_in6; - - switch(sock->ss_family) { - case AF_INET: - data_in = (struct sockaddr_in*)sock; - if (port) { - *port = ntohs((uint16_t)data_in->sin_port); - } - addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_A, - LDNS_IP4ADDRLEN, &data_in->sin_addr); - break; - case AF_INET6: - data_in6 = (struct sockaddr_in6*)sock; - if (port) { - *port = ntohs((uint16_t)data_in6->sin6_port); - } - addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_AAAA, - LDNS_IP6ADDRLEN, &data_in6->sin6_addr); - break; - default: - if (port) { - *port = 0; - } - return NULL; - } - return addr; -} -#endif - -/* code from resolver.c */ -ldns_status -ldns_axfr_start(ldns_resolver *resolver, const ldns_rdf *domain, ldns_rr_class class) -{ - ldns_pkt *query; - ldns_buffer *query_wire; - - struct sockaddr_storage *src = NULL; - size_t src_len = 0; - struct sockaddr_storage *ns = NULL; - size_t ns_len = 0; - size_t ns_i; - ldns_status status; - - if (!resolver || ldns_resolver_nameserver_count(resolver) < 1) { - return LDNS_STATUS_ERR; - } - - query = ldns_pkt_query_new(ldns_rdf_clone(domain), LDNS_RR_TYPE_AXFR, class, 0); - - if (!query) { - return LDNS_STATUS_ADDRESS_ERR; - } - if(ldns_resolver_source(resolver)) { - src = ldns_rdf2native_sockaddr_storage_port( - ldns_resolver_source(resolver), 0, &src_len); - } - /* For AXFR, we have to make the connection ourselves */ - /* try all nameservers (which usually would mean v4 fallback if - * @hostname is used */ - for (ns_i = 0; - ns_i < ldns_resolver_nameserver_count(resolver) && - resolver->_socket == SOCK_INVALID; - ns_i++) { - if (ns != NULL) { - LDNS_FREE(ns); - } - ns = ldns_rdf2native_sockaddr_storage( - resolver->_nameservers[ns_i], - ldns_resolver_port(resolver), &ns_len); -#ifndef S_SPLINT_S - if ((ns->ss_family == AF_INET) && - (ldns_resolver_ip6(resolver) == LDNS_RESOLV_INET6)) { - /* not reachable */ - LDNS_FREE(ns); - ns = NULL; - continue; - } - - if ((ns->ss_family == AF_INET6) && - (ldns_resolver_ip6(resolver) == LDNS_RESOLV_INET)) { - /* not reachable */ - LDNS_FREE(ns); - ns = NULL; - continue; - } -#endif - - resolver->_socket = ldns_tcp_connect_from( - ns, (socklen_t)ns_len, - src, (socklen_t)src_len, - ldns_resolver_timeout(resolver)); - } - if (src) { - LDNS_FREE(src); - } - - if (resolver->_socket == SOCK_INVALID) { - ldns_pkt_free(query); - LDNS_FREE(ns); - return LDNS_STATUS_NETWORK_ERR; - } - -#ifdef HAVE_SSL - if (ldns_resolver_tsig_keyname(resolver) && ldns_resolver_tsig_keydata(resolver)) { - status = ldns_pkt_tsig_sign(query, - ldns_resolver_tsig_keyname(resolver), - ldns_resolver_tsig_keydata(resolver), - 300, ldns_resolver_tsig_algorithm(resolver), NULL); - if (status != LDNS_STATUS_OK) { - /* to prevent problems on subsequent calls to - * ldns_axfr_start we have to close the socket here! */ - close_socket(resolver->_socket); - resolver->_socket = 0; - - ldns_pkt_free(query); - LDNS_FREE(ns); - - return LDNS_STATUS_CRYPTO_TSIG_ERR; - } - } -#endif /* HAVE_SSL */ - - /* Convert the query to a buffer - * Is this necessary? - */ - query_wire = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if(!query_wire) { - ldns_pkt_free(query); - LDNS_FREE(ns); - - close_socket(resolver->_socket); - - return LDNS_STATUS_MEM_ERR; - } - status = ldns_pkt2buffer_wire(query_wire, query); - if (status != LDNS_STATUS_OK) { - ldns_pkt_free(query); - ldns_buffer_free(query_wire); - LDNS_FREE(ns); - - /* to prevent problems on subsequent calls to ldns_axfr_start - * we have to close the socket here! */ - close_socket(resolver->_socket); - resolver->_socket = 0; - - return status; - } - /* Send the query */ - if (ldns_tcp_send_query(query_wire, resolver->_socket, ns, - (socklen_t)ns_len) == 0) { - ldns_pkt_free(query); - ldns_buffer_free(query_wire); - LDNS_FREE(ns); - - /* to prevent problems on subsequent calls to ldns_axfr_start - * we have to close the socket here! */ - - - close_socket(resolver->_socket); - - return LDNS_STATUS_NETWORK_ERR; - } - - ldns_pkt_free(query); - ldns_buffer_free(query_wire); - LDNS_FREE(ns); - - /* - * The AXFR is done once the second SOA record is sent - */ - resolver->_axfr_soa_count = 0; - return LDNS_STATUS_OK; -} diff --git a/ldns/packaging/ldns-config.in b/ldns/packaging/ldns-config.in deleted file mode 100755 index f147920..0000000 --- a/ldns/packaging/ldns-config.in +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -VERSION="@PACKAGE_VERSION@" -LDFLAGS="@LDFLAGS@ @LIBSSL_LDFLAGS@ @PYTHON_LDFLAGS@" -LIBS="@LIBS@ @LIBSSL_LIBS@" -LIBDIR="@libdir@" -INCLUDEDIR="@includedir@" -LIBVERSION="@VERSION_INFO@" - -for arg in $@ -do - if [ $arg = "--cflags" ] - then - echo "-I${INCLUDEDIR}" - fi - if [ $arg = "--libs" ] - then - echo "${LDFLAGS} -L${LIBDIR} ${LIBS} -lldns" - fi - if [ $arg = "-h" ] || [ $arg = "--help" ] - then - echo "Usage: $0 [--cflags] [--libs] [--version]" - fi - if [ $arg = "--version" ] - then - echo "${VERSION}" - fi - if [ $arg = "--libversion" ] - then - echo "${LIBVERSION}" - fi -done diff --git a/ldns/packaging/libldns.pc.in b/ldns/packaging/libldns.pc.in deleted file mode 100644 index 923b688..0000000 --- a/ldns/packaging/libldns.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: ldns -Description: Library for DNS programming -URL: http://www.nlnetlabs.nl/projects/ldns -Version: @PACKAGE_VERSION@ -Requires: -Libs: -L${libdir} -lldns -Libs.private: @LDFLAGS@ -Cflags: -I${includedir} diff --git a/ldns/packet.c b/ldns/packet.c deleted file mode 100644 index a57e190..0000000 --- a/ldns/packet.c +++ /dev/null @@ -1,1176 +0,0 @@ -/* - * packet.c - * - * dns packet implementation - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> -#include <limits.h> - -#ifdef HAVE_SSL -#include <openssl/rand.h> -#endif - -/* Access functions - * do this as functions to get type checking - */ - -#define LDNS_EDNS_MASK_DO_BIT 0x8000 -#define LDNS_EDNS_MASK_UNASSIGNED (0xFFFF & ~LDNS_EDNS_MASK_DO_BIT) - -/* TODO defines for 3600 */ -/* convert to and from numerical flag values */ -ldns_lookup_table ldns_edns_flags[] = { - { 3600, "do"}, - { 0, NULL} -}; - -/* read */ -uint16_t -ldns_pkt_id(const ldns_pkt *packet) -{ - return packet->_header->_id; -} - -bool -ldns_pkt_qr(const ldns_pkt *packet) -{ - return packet->_header->_qr; -} - -bool -ldns_pkt_aa(const ldns_pkt *packet) -{ - return packet->_header->_aa; -} - -bool -ldns_pkt_tc(const ldns_pkt *packet) -{ - return packet->_header->_tc; -} - -bool -ldns_pkt_rd(const ldns_pkt *packet) -{ - return packet->_header->_rd; -} - -bool -ldns_pkt_cd(const ldns_pkt *packet) -{ - return packet->_header->_cd; -} - -bool -ldns_pkt_ra(const ldns_pkt *packet) -{ - return packet->_header->_ra; -} - -bool -ldns_pkt_ad(const ldns_pkt *packet) -{ - return packet->_header->_ad; -} - -ldns_pkt_opcode -ldns_pkt_get_opcode(const ldns_pkt *packet) -{ - return packet->_header->_opcode; -} - -ldns_pkt_rcode -ldns_pkt_get_rcode(const ldns_pkt *packet) -{ - return packet->_header->_rcode; -} - -uint16_t -ldns_pkt_qdcount(const ldns_pkt *packet) -{ - return packet->_header->_qdcount; -} - -uint16_t -ldns_pkt_ancount(const ldns_pkt *packet) -{ - return packet->_header->_ancount; -} - -uint16_t -ldns_pkt_nscount(const ldns_pkt *packet) -{ - return packet->_header->_nscount; -} - -uint16_t -ldns_pkt_arcount(const ldns_pkt *packet) -{ - return packet->_header->_arcount; -} - -ldns_rr_list * -ldns_pkt_question(const ldns_pkt *packet) -{ - return packet->_question; -} - -ldns_rr_list * -ldns_pkt_answer(const ldns_pkt *packet) -{ - return packet->_answer; -} - -ldns_rr_list * -ldns_pkt_authority(const ldns_pkt *packet) -{ - return packet->_authority; -} - -ldns_rr_list * -ldns_pkt_additional(const ldns_pkt *packet) -{ - return packet->_additional; -} - -/* return ALL section concatenated */ -ldns_rr_list * -ldns_pkt_all(const ldns_pkt *packet) -{ - ldns_rr_list *all, *prev_all; - - all = ldns_rr_list_cat_clone( - ldns_pkt_question(packet), - ldns_pkt_answer(packet)); - prev_all = all; - all = ldns_rr_list_cat_clone(all, - ldns_pkt_authority(packet)); - ldns_rr_list_deep_free(prev_all); - prev_all = all; - all = ldns_rr_list_cat_clone(all, - ldns_pkt_additional(packet)); - ldns_rr_list_deep_free(prev_all); - return all; -} - -ldns_rr_list * -ldns_pkt_all_noquestion(const ldns_pkt *packet) -{ - ldns_rr_list *all, *all2; - - all = ldns_rr_list_cat_clone( - ldns_pkt_answer(packet), - ldns_pkt_authority(packet)); - all2 = ldns_rr_list_cat_clone(all, - ldns_pkt_additional(packet)); - - ldns_rr_list_deep_free(all); - return all2; -} - -size_t -ldns_pkt_size(const ldns_pkt *packet) -{ - return packet->_size; -} - -uint32_t -ldns_pkt_querytime(const ldns_pkt *packet) -{ - return packet->_querytime; -} - -ldns_rdf * -ldns_pkt_answerfrom(const ldns_pkt *packet) -{ - return packet->_answerfrom; -} - -struct timeval -ldns_pkt_timestamp(const ldns_pkt *packet) -{ - return packet->timestamp; -} - -uint16_t -ldns_pkt_edns_udp_size(const ldns_pkt *packet) -{ - return packet->_edns_udp_size; -} - -uint8_t -ldns_pkt_edns_extended_rcode(const ldns_pkt *packet) -{ - return packet->_edns_extended_rcode; -} - -uint8_t -ldns_pkt_edns_version(const ldns_pkt *packet) -{ - return packet->_edns_version; -} - -uint16_t -ldns_pkt_edns_z(const ldns_pkt *packet) -{ - return packet->_edns_z; -} - -bool -ldns_pkt_edns_do(const ldns_pkt *packet) -{ - return (packet->_edns_z & LDNS_EDNS_MASK_DO_BIT); -} - -void -ldns_pkt_set_edns_do(ldns_pkt *packet, bool value) -{ - if (value) { - packet->_edns_z = packet->_edns_z | LDNS_EDNS_MASK_DO_BIT; - } else { - packet->_edns_z = packet->_edns_z & ~LDNS_EDNS_MASK_DO_BIT; - } -} - -uint16_t -ldns_pkt_edns_unassigned(const ldns_pkt *packet) -{ - return (packet->_edns_z & LDNS_EDNS_MASK_UNASSIGNED); -} - -void -ldns_pkt_set_edns_unassigned(ldns_pkt *packet, uint16_t value) -{ - packet->_edns_z = (packet->_edns_z & ~LDNS_EDNS_MASK_UNASSIGNED) - | (value & LDNS_EDNS_MASK_UNASSIGNED); -} - -ldns_rdf * -ldns_pkt_edns_data(const ldns_pkt *packet) -{ - return packet->_edns_data; -} - -/* return only those rr that share the ownername */ -ldns_rr_list * -ldns_pkt_rr_list_by_name(const ldns_pkt *packet, - const ldns_rdf *ownername, - ldns_pkt_section sec) -{ - ldns_rr_list *rrs; - ldns_rr_list *ret; - uint16_t i; - - if (!packet) { - return NULL; - } - - rrs = ldns_pkt_get_section_clone(packet, sec); - ret = NULL; - - for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - if (ldns_dname_compare(ldns_rr_owner( - ldns_rr_list_rr(rrs, i)), - ownername) == 0) { - /* owner names match */ - if (ret == NULL) { - ret = ldns_rr_list_new(); - } - ldns_rr_list_push_rr(ret, - ldns_rr_clone( - ldns_rr_list_rr(rrs, i)) - ); - } - } - - ldns_rr_list_deep_free(rrs); - - return ret; -} - -/* return only those rr that share a type */ -ldns_rr_list * -ldns_pkt_rr_list_by_type(const ldns_pkt *packet, - ldns_rr_type type, - ldns_pkt_section sec) -{ - ldns_rr_list *rrs; - ldns_rr_list *new; - uint16_t i; - - if(!packet) { - return NULL; - } - - rrs = ldns_pkt_get_section_clone(packet, sec); - new = ldns_rr_list_new(); - - for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i))) { - /* types match */ - ldns_rr_list_push_rr(new, - ldns_rr_clone( - ldns_rr_list_rr(rrs, i)) - ); - } - } - ldns_rr_list_deep_free(rrs); - - if (ldns_rr_list_rr_count(new) == 0) { - ldns_rr_list_free(new); - return NULL; - } else { - return new; - } -} - -/* return only those rrs that share name and type */ -ldns_rr_list * -ldns_pkt_rr_list_by_name_and_type(const ldns_pkt *packet, - const ldns_rdf *ownername, - ldns_rr_type type, - ldns_pkt_section sec) -{ - ldns_rr_list *rrs; - ldns_rr_list *new; - ldns_rr_list *ret; - uint16_t i; - - if(!packet) { - return NULL; - } - - rrs = ldns_pkt_get_section_clone(packet, sec); - new = ldns_rr_list_new(); - ret = NULL; - - for(i = 0; i < ldns_rr_list_rr_count(rrs); i++) { - if (type == ldns_rr_get_type(ldns_rr_list_rr(rrs, i)) && - ldns_dname_compare(ldns_rr_owner(ldns_rr_list_rr(rrs, i)), - ownername - ) == 0 - ) { - /* types match */ - ldns_rr_list_push_rr(new, ldns_rr_clone(ldns_rr_list_rr(rrs, i))); - ret = new; - } - } - ldns_rr_list_deep_free(rrs); - if (!ret) { - ldns_rr_list_free(new); - } - return ret; -} - -bool -ldns_pkt_rr(const ldns_pkt *pkt, ldns_pkt_section sec, const ldns_rr *rr) -{ - bool result = false; - - switch (sec) { - case LDNS_SECTION_QUESTION: - return ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr); - case LDNS_SECTION_ANSWER: - return ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr); - case LDNS_SECTION_AUTHORITY: - return ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr); - case LDNS_SECTION_ADDITIONAL: - return ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr); - case LDNS_SECTION_ANY: - result = ldns_rr_list_contains_rr(ldns_pkt_question(pkt), rr); - /* fallthrough */ - case LDNS_SECTION_ANY_NOQUESTION: - result = result - || ldns_rr_list_contains_rr(ldns_pkt_answer(pkt), rr) - || ldns_rr_list_contains_rr(ldns_pkt_authority(pkt), rr) - || ldns_rr_list_contains_rr(ldns_pkt_additional(pkt), rr); - } - - return result; -} - -uint16_t -ldns_pkt_section_count(const ldns_pkt *packet, ldns_pkt_section s) -{ - switch(s) { - case LDNS_SECTION_QUESTION: - return ldns_pkt_qdcount(packet); - case LDNS_SECTION_ANSWER: - return ldns_pkt_ancount(packet); - case LDNS_SECTION_AUTHORITY: - return ldns_pkt_nscount(packet); - case LDNS_SECTION_ADDITIONAL: - return ldns_pkt_arcount(packet); - case LDNS_SECTION_ANY: - return ldns_pkt_qdcount(packet) + - ldns_pkt_ancount(packet) + - ldns_pkt_nscount(packet) + - ldns_pkt_arcount(packet); - case LDNS_SECTION_ANY_NOQUESTION: - return ldns_pkt_ancount(packet) + - ldns_pkt_nscount(packet) + - ldns_pkt_arcount(packet); - default: - return 0; - } -} - -bool -ldns_pkt_empty(ldns_pkt *p) -{ - if (!p) { - return true; /* NULL is empty? */ - } - if (ldns_pkt_section_count(p, LDNS_SECTION_ANY) > 0) { - return false; - } else { - return true; - } -} - - -ldns_rr_list * -ldns_pkt_get_section_clone(const ldns_pkt *packet, ldns_pkt_section s) -{ - switch(s) { - case LDNS_SECTION_QUESTION: - return ldns_rr_list_clone(ldns_pkt_question(packet)); - case LDNS_SECTION_ANSWER: - return ldns_rr_list_clone(ldns_pkt_answer(packet)); - case LDNS_SECTION_AUTHORITY: - return ldns_rr_list_clone(ldns_pkt_authority(packet)); - case LDNS_SECTION_ADDITIONAL: - return ldns_rr_list_clone(ldns_pkt_additional(packet)); - case LDNS_SECTION_ANY: - /* these are already clones */ - return ldns_pkt_all(packet); - case LDNS_SECTION_ANY_NOQUESTION: - return ldns_pkt_all_noquestion(packet); - default: - return NULL; - } -} - -ldns_rr *ldns_pkt_tsig(const ldns_pkt *pkt) { - return pkt->_tsig_rr; -} - -/* write */ -void -ldns_pkt_set_id(ldns_pkt *packet, uint16_t id) -{ - packet->_header->_id = id; -} - -void -ldns_pkt_set_random_id(ldns_pkt *packet) -{ - uint16_t rid = ldns_get_random(); - ldns_pkt_set_id(packet, rid); -} - - -void -ldns_pkt_set_qr(ldns_pkt *packet, bool qr) -{ - packet->_header->_qr = qr; -} - -void -ldns_pkt_set_aa(ldns_pkt *packet, bool aa) -{ - packet->_header->_aa = aa; -} - -void -ldns_pkt_set_tc(ldns_pkt *packet, bool tc) -{ - packet->_header->_tc = tc; -} - -void -ldns_pkt_set_rd(ldns_pkt *packet, bool rd) -{ - packet->_header->_rd = rd; -} - -void -ldns_pkt_set_additional(ldns_pkt *p, ldns_rr_list *rr) -{ - p->_additional = rr; -} - -void -ldns_pkt_set_question(ldns_pkt *p, ldns_rr_list *rr) -{ - p->_question = rr; -} - -void -ldns_pkt_set_answer(ldns_pkt *p, ldns_rr_list *rr) -{ - p->_answer = rr; -} - -void -ldns_pkt_set_authority(ldns_pkt *p, ldns_rr_list *rr) -{ - p->_authority = rr; -} - -void -ldns_pkt_set_cd(ldns_pkt *packet, bool cd) -{ - packet->_header->_cd = cd; -} - -void -ldns_pkt_set_ra(ldns_pkt *packet, bool ra) -{ - packet->_header->_ra = ra; -} - -void -ldns_pkt_set_ad(ldns_pkt *packet, bool ad) -{ - packet->_header->_ad = ad; -} - -void -ldns_pkt_set_opcode(ldns_pkt *packet, ldns_pkt_opcode opcode) -{ - packet->_header->_opcode = opcode; -} - -void -ldns_pkt_set_rcode(ldns_pkt *packet, uint8_t rcode) -{ - packet->_header->_rcode = rcode; -} - -void -ldns_pkt_set_qdcount(ldns_pkt *packet, uint16_t qdcount) -{ - packet->_header->_qdcount = qdcount; -} - -void -ldns_pkt_set_ancount(ldns_pkt *packet, uint16_t ancount) -{ - packet->_header->_ancount = ancount; -} - -void -ldns_pkt_set_nscount(ldns_pkt *packet, uint16_t nscount) -{ - packet->_header->_nscount = nscount; -} - -void -ldns_pkt_set_arcount(ldns_pkt *packet, uint16_t arcount) -{ - packet->_header->_arcount = arcount; -} - -void -ldns_pkt_set_querytime(ldns_pkt *packet, uint32_t time) -{ - packet->_querytime = time; -} - -void -ldns_pkt_set_answerfrom(ldns_pkt *packet, ldns_rdf *answerfrom) -{ - packet->_answerfrom = answerfrom; -} - -void -ldns_pkt_set_timestamp(ldns_pkt *packet, struct timeval timeval) -{ - packet->timestamp.tv_sec = timeval.tv_sec; - packet->timestamp.tv_usec = timeval.tv_usec; -} - -void -ldns_pkt_set_size(ldns_pkt *packet, size_t s) -{ - packet->_size = s; -} - -void -ldns_pkt_set_edns_udp_size(ldns_pkt *packet, uint16_t s) -{ - packet->_edns_udp_size = s; -} - -void -ldns_pkt_set_edns_extended_rcode(ldns_pkt *packet, uint8_t c) -{ - packet->_edns_extended_rcode = c; -} - -void -ldns_pkt_set_edns_version(ldns_pkt *packet, uint8_t v) -{ - packet->_edns_version = v; -} - -void -ldns_pkt_set_edns_z(ldns_pkt *packet, uint16_t z) -{ - packet->_edns_z = z; -} - -void -ldns_pkt_set_edns_data(ldns_pkt *packet, ldns_rdf *data) -{ - packet->_edns_data = data; -} - -void -ldns_pkt_set_section_count(ldns_pkt *packet, ldns_pkt_section s, uint16_t count) -{ - switch(s) { - case LDNS_SECTION_QUESTION: - ldns_pkt_set_qdcount(packet, count); - break; - case LDNS_SECTION_ANSWER: - ldns_pkt_set_ancount(packet, count); - break; - case LDNS_SECTION_AUTHORITY: - ldns_pkt_set_nscount(packet, count); - break; - case LDNS_SECTION_ADDITIONAL: - ldns_pkt_set_arcount(packet, count); - break; - case LDNS_SECTION_ANY: - case LDNS_SECTION_ANY_NOQUESTION: - break; - } -} - -void ldns_pkt_set_tsig(ldns_pkt *pkt, ldns_rr *rr) -{ - pkt->_tsig_rr = rr; -} - -bool -ldns_pkt_push_rr(ldns_pkt *packet, ldns_pkt_section section, ldns_rr *rr) -{ - switch(section) { - case LDNS_SECTION_QUESTION: - if (!ldns_rr_list_push_rr(ldns_pkt_question(packet), rr)) { - return false; - } - ldns_pkt_set_qdcount(packet, ldns_pkt_qdcount(packet) + 1); - break; - case LDNS_SECTION_ANSWER: - if (!ldns_rr_list_push_rr(ldns_pkt_answer(packet), rr)) { - return false; - } - ldns_pkt_set_ancount(packet, ldns_pkt_ancount(packet) + 1); - break; - case LDNS_SECTION_AUTHORITY: - if (!ldns_rr_list_push_rr(ldns_pkt_authority(packet), rr)) { - return false; - } - ldns_pkt_set_nscount(packet, ldns_pkt_nscount(packet) + 1); - break; - case LDNS_SECTION_ADDITIONAL: - if (!ldns_rr_list_push_rr(ldns_pkt_additional(packet), rr)) { - return false; - } - ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) + 1); - break; - case LDNS_SECTION_ANY: - case LDNS_SECTION_ANY_NOQUESTION: - /* shouldn't this error? */ - break; - } - return true; -} - -bool -ldns_pkt_safe_push_rr(ldns_pkt *pkt, ldns_pkt_section sec, ldns_rr *rr) -{ - - /* check to see if its there */ - if (ldns_pkt_rr(pkt, sec, rr)) { - /* already there */ - return false; - } - return ldns_pkt_push_rr(pkt, sec, rr); -} - -bool -ldns_pkt_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list) -{ - size_t i; - for(i = 0; i < ldns_rr_list_rr_count(list); i++) { - if (!ldns_pkt_push_rr(p, s, ldns_rr_list_rr(list, i))) { - return false; - } - } - return true; -} - -bool -ldns_pkt_safe_push_rr_list(ldns_pkt *p, ldns_pkt_section s, ldns_rr_list *list) -{ - size_t i; - for(i = 0; i < ldns_rr_list_rr_count(list); i++) { - if (!ldns_pkt_safe_push_rr(p, s, ldns_rr_list_rr(list, i))) { - return false; - } - } - return true; -} - -bool -ldns_pkt_edns(const ldns_pkt *pkt) { - return (ldns_pkt_edns_udp_size(pkt) > 0 || - ldns_pkt_edns_extended_rcode(pkt) > 0 || - ldns_pkt_edns_data(pkt) || - ldns_pkt_edns_do(pkt) || - pkt->_edns_present - ); -} - - -/* Create/destroy/convert functions - */ -ldns_pkt * -ldns_pkt_new(void) -{ - ldns_pkt *packet; - packet = LDNS_MALLOC(ldns_pkt); - if (!packet) { - return NULL; - } - - packet->_header = LDNS_MALLOC(ldns_hdr); - if (!packet->_header) { - LDNS_FREE(packet); - return NULL; - } - - packet->_question = ldns_rr_list_new(); - packet->_answer = ldns_rr_list_new(); - packet->_authority = ldns_rr_list_new(); - packet->_additional = ldns_rr_list_new(); - - /* default everything to false */ - ldns_pkt_set_qr(packet, false); - ldns_pkt_set_aa(packet, false); - ldns_pkt_set_tc(packet, false); - ldns_pkt_set_rd(packet, false); - ldns_pkt_set_ra(packet, false); - ldns_pkt_set_ad(packet, false); - ldns_pkt_set_cd(packet, false); - - ldns_pkt_set_opcode(packet, LDNS_PACKET_QUERY); - ldns_pkt_set_rcode(packet, 0); - ldns_pkt_set_id(packet, 0); - ldns_pkt_set_size(packet, 0); - ldns_pkt_set_querytime(packet, 0); - memset(&packet->timestamp, 0, sizeof(packet->timestamp)); - ldns_pkt_set_answerfrom(packet, NULL); - ldns_pkt_set_section_count(packet, LDNS_SECTION_QUESTION, 0); - ldns_pkt_set_section_count(packet, LDNS_SECTION_ANSWER, 0); - ldns_pkt_set_section_count(packet, LDNS_SECTION_AUTHORITY, 0); - ldns_pkt_set_section_count(packet, LDNS_SECTION_ADDITIONAL, 0); - - ldns_pkt_set_edns_udp_size(packet, 0); - ldns_pkt_set_edns_extended_rcode(packet, 0); - ldns_pkt_set_edns_version(packet, 0); - ldns_pkt_set_edns_z(packet, 0); - ldns_pkt_set_edns_data(packet, NULL); - packet->_edns_present = false; - - ldns_pkt_set_tsig(packet, NULL); - - return packet; -} - -void -ldns_pkt_free(ldns_pkt *packet) -{ - if (packet) { - LDNS_FREE(packet->_header); - ldns_rr_list_deep_free(packet->_question); - ldns_rr_list_deep_free(packet->_answer); - ldns_rr_list_deep_free(packet->_authority); - ldns_rr_list_deep_free(packet->_additional); - ldns_rr_free(packet->_tsig_rr); - ldns_rdf_deep_free(packet->_edns_data); - ldns_rdf_deep_free(packet->_answerfrom); - LDNS_FREE(packet); - } -} - -bool -ldns_pkt_set_flags(ldns_pkt *packet, uint16_t flags) -{ - if (!packet) { - return false; - } - if ((flags & LDNS_QR) == LDNS_QR) { - ldns_pkt_set_qr(packet, true); - } - if ((flags & LDNS_AA) == LDNS_AA) { - ldns_pkt_set_aa(packet, true); - } - if ((flags & LDNS_RD) == LDNS_RD) { - ldns_pkt_set_rd(packet, true); - } - if ((flags & LDNS_TC) == LDNS_TC) { - ldns_pkt_set_tc(packet, true); - } - if ((flags & LDNS_CD) == LDNS_CD) { - ldns_pkt_set_cd(packet, true); - } - if ((flags & LDNS_RA) == LDNS_RA) { - ldns_pkt_set_ra(packet, true); - } - if ((flags & LDNS_AD) == LDNS_AD) { - ldns_pkt_set_ad(packet, true); - } - return true; -} - - -static ldns_rr* -ldns_pkt_authsoa(const ldns_rdf* rr_name, ldns_rr_class rr_class) -{ - ldns_rr* soa_rr = ldns_rr_new(); - ldns_rdf *owner_rdf; - ldns_rdf *mname_rdf; - ldns_rdf *rname_rdf; - ldns_rdf *serial_rdf; - ldns_rdf *refresh_rdf; - ldns_rdf *retry_rdf; - ldns_rdf *expire_rdf; - ldns_rdf *minimum_rdf; - - if (!soa_rr) { - return NULL; - } - owner_rdf = ldns_rdf_clone(rr_name); - if (!owner_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } - - ldns_rr_set_owner(soa_rr, owner_rdf); - ldns_rr_set_type(soa_rr, LDNS_RR_TYPE_SOA); - ldns_rr_set_class(soa_rr, rr_class); - ldns_rr_set_question(soa_rr, false); - - if (ldns_str2rdf_dname(&mname_rdf, ".") != LDNS_STATUS_OK) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, mname_rdf); - } - if (ldns_str2rdf_dname(&rname_rdf, ".") != LDNS_STATUS_OK) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, rname_rdf); - } - serial_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!serial_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, serial_rdf); - } - refresh_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!refresh_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, refresh_rdf); - } - retry_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!retry_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, retry_rdf); - } - expire_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!expire_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, expire_rdf); - } - minimum_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!minimum_rdf) { - ldns_rr_free(soa_rr); - return NULL; - } else { - ldns_rr_push_rdf(soa_rr, minimum_rdf); - } - return soa_rr; -} - - -static ldns_status -ldns_pkt_query_new_frm_str_internal(ldns_pkt **p, const char *name, - ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags, - ldns_rr* authsoa_rr) -{ - ldns_pkt *packet; - ldns_rr *question_rr; - ldns_rdf *name_rdf; - - packet = ldns_pkt_new(); - if (!packet) { - return LDNS_STATUS_MEM_ERR; - } - - if (!ldns_pkt_set_flags(packet, flags)) { - ldns_pkt_free(packet); - return LDNS_STATUS_ERR; - } - - question_rr = ldns_rr_new(); - if (!question_rr) { - ldns_pkt_free(packet); - return LDNS_STATUS_MEM_ERR; - } - - if (rr_type == 0) { - rr_type = LDNS_RR_TYPE_A; - } - if (rr_class == 0) { - rr_class = LDNS_RR_CLASS_IN; - } - - if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) { - ldns_rr_set_owner(question_rr, name_rdf); - ldns_rr_set_type(question_rr, rr_type); - ldns_rr_set_class(question_rr, rr_class); - ldns_rr_set_question(question_rr, true); - - ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr); - } else { - ldns_rr_free(question_rr); - ldns_pkt_free(packet); - return LDNS_STATUS_ERR; - } - - if (authsoa_rr) { - ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr); - } - - packet->_tsig_rr = NULL; - ldns_pkt_set_answerfrom(packet, NULL); - if (p) { - *p = packet; - return LDNS_STATUS_OK; - } else { - ldns_pkt_free(packet); - return LDNS_STATUS_NULL; - } -} - -ldns_status -ldns_pkt_query_new_frm_str(ldns_pkt **p, const char *name, - ldns_rr_type rr_type, ldns_rr_class rr_class, uint16_t flags) -{ - return ldns_pkt_query_new_frm_str_internal(p, name, rr_type, - rr_class, flags, NULL); -} - -ldns_status -ldns_pkt_ixfr_request_new_frm_str(ldns_pkt **p, const char *name, - ldns_rr_class rr_class, uint16_t flags, ldns_rr *soa) -{ - ldns_rr* authsoa_rr = soa; - if (!authsoa_rr) { - ldns_rdf *name_rdf; - if (ldns_str2rdf_dname(&name_rdf, name) == LDNS_STATUS_OK) { - authsoa_rr = ldns_pkt_authsoa(name_rdf, rr_class); - } - ldns_rdf_free(name_rdf); - } - return ldns_pkt_query_new_frm_str_internal(p, name, LDNS_RR_TYPE_IXFR, - rr_class, flags, authsoa_rr); -} - -static ldns_pkt * -ldns_pkt_query_new_internal(ldns_rdf *rr_name, ldns_rr_type rr_type, - ldns_rr_class rr_class, uint16_t flags, ldns_rr* authsoa_rr) -{ - ldns_pkt *packet; - ldns_rr *question_rr; - - packet = ldns_pkt_new(); - if (!packet) { - return NULL; - } - - if (!ldns_pkt_set_flags(packet, flags)) { - return NULL; - } - - question_rr = ldns_rr_new(); - if (!question_rr) { - ldns_pkt_free(packet); - return NULL; - } - - if (rr_type == 0) { - rr_type = LDNS_RR_TYPE_A; - } - if (rr_class == 0) { - rr_class = LDNS_RR_CLASS_IN; - } - - ldns_rr_set_owner(question_rr, rr_name); - ldns_rr_set_type(question_rr, rr_type); - ldns_rr_set_class(question_rr, rr_class); - ldns_rr_set_question(question_rr, true); - ldns_pkt_push_rr(packet, LDNS_SECTION_QUESTION, question_rr); - - if (authsoa_rr) { - ldns_pkt_push_rr(packet, LDNS_SECTION_AUTHORITY, authsoa_rr); - } - - packet->_tsig_rr = NULL; - return packet; -} - -ldns_pkt * -ldns_pkt_query_new(ldns_rdf *rr_name, ldns_rr_type rr_type, - ldns_rr_class rr_class, uint16_t flags) -{ - return ldns_pkt_query_new_internal(rr_name, rr_type, - rr_class, flags, NULL); -} - -ldns_pkt * -ldns_pkt_ixfr_request_new(ldns_rdf *rr_name, ldns_rr_class rr_class, - uint16_t flags, ldns_rr* soa) -{ - ldns_rr* authsoa_rr = soa; - if (!authsoa_rr) { - authsoa_rr = ldns_pkt_authsoa(rr_name, rr_class); - } - return ldns_pkt_query_new_internal(rr_name, LDNS_RR_TYPE_IXFR, - rr_class, flags, authsoa_rr); -} - -ldns_pkt_type -ldns_pkt_reply_type(const ldns_pkt *p) -{ - ldns_rr_list *tmp; - - if (!p) { - return LDNS_PACKET_UNKNOWN; - } - - if (ldns_pkt_get_rcode(p) == LDNS_RCODE_NXDOMAIN) { - return LDNS_PACKET_NXDOMAIN; - } - - if (ldns_pkt_ancount(p) == 0 && ldns_pkt_arcount(p) == 0 - && ldns_pkt_nscount(p) == 1) { - - /* check for SOA */ - tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_SOA, - LDNS_SECTION_AUTHORITY); - if (tmp) { - ldns_rr_list_deep_free(tmp); - return LDNS_PACKET_NODATA; - } else { - /* I have no idea ... */ - } - } - - if (ldns_pkt_ancount(p) == 0 && ldns_pkt_nscount(p) > 0) { - tmp = ldns_pkt_rr_list_by_type(p, LDNS_RR_TYPE_NS, - LDNS_SECTION_AUTHORITY); - if (tmp) { - /* there are nameservers here */ - ldns_rr_list_deep_free(tmp); - return LDNS_PACKET_REFERRAL; - } else { - /* I have no idea */ - } - ldns_rr_list_deep_free(tmp); - } - - /* if we cannot determine the packet type, we say it's an - * answer... - */ - return LDNS_PACKET_ANSWER; -} - -ldns_pkt * -ldns_pkt_clone(const ldns_pkt *pkt) -{ - ldns_pkt *new_pkt; - - if (!pkt) { - return NULL; - } - new_pkt = ldns_pkt_new(); - - ldns_pkt_set_id(new_pkt, ldns_pkt_id(pkt)); - ldns_pkt_set_qr(new_pkt, ldns_pkt_qr(pkt)); - ldns_pkt_set_aa(new_pkt, ldns_pkt_aa(pkt)); - ldns_pkt_set_tc(new_pkt, ldns_pkt_tc(pkt)); - ldns_pkt_set_rd(new_pkt, ldns_pkt_rd(pkt)); - ldns_pkt_set_cd(new_pkt, ldns_pkt_cd(pkt)); - ldns_pkt_set_ra(new_pkt, ldns_pkt_ra(pkt)); - ldns_pkt_set_ad(new_pkt, ldns_pkt_ad(pkt)); - ldns_pkt_set_opcode(new_pkt, ldns_pkt_get_opcode(pkt)); - ldns_pkt_set_rcode(new_pkt, ldns_pkt_get_rcode(pkt)); - ldns_pkt_set_qdcount(new_pkt, ldns_pkt_qdcount(pkt)); - ldns_pkt_set_ancount(new_pkt, ldns_pkt_ancount(pkt)); - ldns_pkt_set_nscount(new_pkt, ldns_pkt_nscount(pkt)); - ldns_pkt_set_arcount(new_pkt, ldns_pkt_arcount(pkt)); - if (ldns_pkt_answerfrom(pkt)) - ldns_pkt_set_answerfrom(new_pkt, - ldns_rdf_clone(ldns_pkt_answerfrom(pkt))); - ldns_pkt_set_timestamp(new_pkt, ldns_pkt_timestamp(pkt)); - ldns_pkt_set_querytime(new_pkt, ldns_pkt_querytime(pkt)); - ldns_pkt_set_size(new_pkt, ldns_pkt_size(pkt)); - ldns_pkt_set_tsig(new_pkt, ldns_rr_clone(ldns_pkt_tsig(pkt))); - - ldns_pkt_set_edns_udp_size(new_pkt, ldns_pkt_edns_udp_size(pkt)); - ldns_pkt_set_edns_extended_rcode(new_pkt, - ldns_pkt_edns_extended_rcode(pkt)); - ldns_pkt_set_edns_version(new_pkt, ldns_pkt_edns_version(pkt)); - new_pkt->_edns_present = pkt->_edns_present; - ldns_pkt_set_edns_z(new_pkt, ldns_pkt_edns_z(pkt)); - if(ldns_pkt_edns_data(pkt)) - ldns_pkt_set_edns_data(new_pkt, - ldns_rdf_clone(ldns_pkt_edns_data(pkt))); - ldns_pkt_set_edns_do(new_pkt, ldns_pkt_edns_do(pkt)); - - ldns_rr_list_deep_free(new_pkt->_question); - ldns_rr_list_deep_free(new_pkt->_answer); - ldns_rr_list_deep_free(new_pkt->_authority); - ldns_rr_list_deep_free(new_pkt->_additional); - new_pkt->_question = ldns_rr_list_clone(ldns_pkt_question(pkt)); - new_pkt->_answer = ldns_rr_list_clone(ldns_pkt_answer(pkt)); - new_pkt->_authority = ldns_rr_list_clone(ldns_pkt_authority(pkt)); - new_pkt->_additional = ldns_rr_list_clone(ldns_pkt_additional(pkt)); - return new_pkt; -} diff --git a/ldns/parse.c b/ldns/parse.c deleted file mode 100644 index 947dbb8..0000000 --- a/ldns/parse.c +++ /dev/null @@ -1,438 +0,0 @@ -/* - * a generic (simple) parser. Use to parse rr's, private key - * information and /etc/resolv.conf files - * - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ -#include <ldns/config.h> -#include <ldns/ldns.h> - -#include <limits.h> -#include <strings.h> - -ldns_lookup_table ldns_directive_types[] = { - { LDNS_DIR_TTL, "$TTL" }, - { LDNS_DIR_ORIGIN, "$ORIGIN" }, - { LDNS_DIR_INCLUDE, "$INCLUDE" }, - { 0, NULL } -}; - -/* add max_limit here? */ -ssize_t -ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit) -{ - return ldns_fget_token_l(f, token, delim, limit, NULL); -} - -ssize_t -ldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr) -{ - int c, prev_c; - int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ - int com, quoted; - char *t; - size_t i; - const char *d; - const char *del; - - /* standard delimeters */ - if (!delim) { - /* from isspace(3) */ - del = LDNS_PARSE_NORMAL; - } else { - del = delim; - } - - p = 0; - i = 0; - com = 0; - quoted = 0; - prev_c = 0; - t = token; - if (del[0] == '"') { - quoted = 1; - } - while ((c = getc(f)) != EOF) { - if (c == '\r') /* carriage return */ - c = ' '; - if (c == '(' && prev_c != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p++; - } - prev_c = c; - continue; - } - - if (c == ')' && prev_c != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p--; - } - prev_c = c; - continue; - } - - if (p < 0) { - /* more ) then ( - close off the string */ - *t = '\0'; - return 0; - } - - /* do something with comments ; */ - if (c == ';' && quoted == 0) { - if (prev_c != '\\') { - com = 1; - } - } - if (c == '\"' && com == 0 && prev_c != '\\') { - quoted = 1 - quoted; - } - - if (c == '\n' && com != 0) { - /* comments */ - com = 0; - *t = ' '; - if (line_nr) { - *line_nr = *line_nr + 1; - } - if (p == 0 && i > 0) { - goto tokenread; - } else { - prev_c = c; - continue; - } - } - - if (com == 1) { - *t = ' '; - prev_c = c; - continue; - } - - if (c == '\n' && p != 0 && t > token) { - /* in parentheses */ - if (line_nr) { - *line_nr = *line_nr + 1; - } - if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { - *t = '\0'; - return -1; - } - *t++ = ' '; - prev_c = c; - continue; - } - - /* check if we hit the delim */ - for (d = del; *d; d++) { - if (c == *d && i > 0 && prev_c != '\\' && p == 0) { - if (c == '\n' && line_nr) { - *line_nr = *line_nr + 1; - } - goto tokenread; - } - } - if (c != '\0' && c != '\n') { - i++; - } - if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { - *t = '\0'; - return -1; - } - if (c != '\0' && c != '\n') { - *t++ = c; - } - if (c == '\\' && prev_c == '\\') - prev_c = 0; - else prev_c = c; - } - *t = '\0'; - if (c == EOF) { - return (ssize_t)i; - } - - if (i == 0) { - /* nothing read */ - return -1; - } - if (p != 0) { - return -1; - } - return (ssize_t)i; - -tokenread: - if(*del == '"') /* do not skip over quotes, they are significant */ - ldns_fskipcs_l(f, del+1, line_nr); - else ldns_fskipcs_l(f, del, line_nr); - *t = '\0'; - if (p != 0) { - return -1; - } - - return (ssize_t)i; -} - -ssize_t -ldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, - const char *d_del, size_t data_limit) -{ - return ldns_fget_keyword_data_l(f, keyword, k_del, data, d_del, - data_limit, NULL); -} - -ssize_t -ldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, - const char *d_del, size_t data_limit, int *line_nr) -{ - /* we assume: keyword|sep|data */ - char *fkeyword; - ssize_t i; - - if(strlen(keyword) >= LDNS_MAX_KEYWORDLEN) - return -1; - fkeyword = LDNS_XMALLOC(char, LDNS_MAX_KEYWORDLEN); - if(!fkeyword) - return -1; - - i = ldns_fget_token(f, fkeyword, k_del, LDNS_MAX_KEYWORDLEN); - if(i==0 || i==-1) { - LDNS_FREE(fkeyword); - return -1; - } - - /* case??? i instead of strlen? */ - if (strncmp(fkeyword, keyword, LDNS_MAX_KEYWORDLEN - 1) == 0) { - /* whee! */ - /* printf("%s\n%s\n", "Matching keyword", fkeyword); */ - i = ldns_fget_token_l(f, data, d_del, data_limit, line_nr); - LDNS_FREE(fkeyword); - return i; - } else { - /*printf("no match for %s (read: %s)\n", keyword, fkeyword);*/ - LDNS_FREE(fkeyword); - return -1; - } -} - - -ssize_t -ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit) -{ - int c, lc; - int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ - int com, quoted; - char *t; - size_t i; - const char *d; - const char *del; - - /* standard delimiters */ - if (!delim) { - /* from isspace(3) */ - del = LDNS_PARSE_NORMAL; - } else { - del = delim; - } - - p = 0; - i = 0; - com = 0; - quoted = 0; - t = token; - lc = 0; - if (del[0] == '"') { - quoted = 1; - } - - while ((c = ldns_bgetc(b)) != EOF) { - if (c == '\r') /* carriage return */ - c = ' '; - if (c == '(' && lc != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p++; - } - lc = c; - continue; - } - - if (c == ')' && lc != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p--; - } - lc = c; - continue; - } - - if (p < 0) { - /* more ) then ( */ - *t = '\0'; - return 0; - } - - /* do something with comments ; */ - if (c == ';' && quoted == 0) { - if (lc != '\\') { - com = 1; - } - } - if (c == '"' && com == 0 && lc != '\\') { - quoted = 1 - quoted; - } - - if (c == '\n' && com != 0) { - /* comments */ - com = 0; - *t = ' '; - lc = c; - continue; - } - - if (com == 1) { - *t = ' '; - lc = c; - continue; - } - - if (c == '\n' && p != 0) { - /* in parentheses */ - *t++ = ' '; - lc = c; - continue; - } - - /* check if we hit the delim */ - for (d = del; *d; d++) { - if (c == *d && lc != '\\' && p == 0) { - goto tokenread; - } - } - - i++; - if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { - *t = '\0'; - return -1; - } - *t++ = c; - - if (c == '\\' && lc == '\\') { - lc = 0; - } else { - lc = c; - } - } - *t = '\0'; - if (i == 0) { - /* nothing read */ - return -1; - } - if (p != 0) { - return -1; - } - return (ssize_t)i; - -tokenread: - if(*del == '"') /* do not skip over quotes, they are significant */ - ldns_bskipcs(b, del+1); - else ldns_bskipcs(b, del); - *t = '\0'; - - if (p != 0) { - return -1; - } - return (ssize_t)i; -} - - -void -ldns_bskipcs(ldns_buffer *buffer, const char *s) -{ - bool found; - char c; - const char *d; - - while(ldns_buffer_available_at(buffer, buffer->_position, sizeof(char))) { - c = (char) ldns_buffer_read_u8_at(buffer, buffer->_position); - found = false; - for (d = s; *d; d++) { - if (*d == c) { - found = true; - } - } - if (found && buffer->_limit > buffer->_position) { - buffer->_position += sizeof(char); - } else { - return; - } - } -} - -void -ldns_fskipcs(FILE *fp, const char *s) -{ - ldns_fskipcs_l(fp, s, NULL); -} - -void -ldns_fskipcs_l(FILE *fp, const char *s, int *line_nr) -{ - bool found; - int c; - const char *d; - - while ((c = fgetc(fp)) != EOF) { - if (line_nr && c == '\n') { - *line_nr = *line_nr + 1; - } - found = false; - for (d = s; *d; d++) { - if (*d == c) { - found = true; - } - } - if (!found) { - /* with getc, we've read too far */ - ungetc(c, fp); - return; - } - } -} - -ssize_t -ldns_bget_keyword_data(ldns_buffer *b, const char *keyword, const char *k_del, char -*data, const char *d_del, size_t data_limit) -{ - /* we assume: keyword|sep|data */ - char *fkeyword; - ssize_t i; - - if(strlen(keyword) >= LDNS_MAX_KEYWORDLEN) - return -1; - fkeyword = LDNS_XMALLOC(char, LDNS_MAX_KEYWORDLEN); - if(!fkeyword) - return -1; /* out of memory */ - - i = ldns_bget_token(b, fkeyword, k_del, data_limit); - if(i==0 || i==-1) { - LDNS_FREE(fkeyword); - return -1; /* nothing read */ - } - - /* case??? */ - if (strncmp(fkeyword, keyword, strlen(keyword)) == 0) { - LDNS_FREE(fkeyword); - /* whee, the match! */ - /* retrieve it's data */ - i = ldns_bget_token(b, data, d_del, 0); - return i; - } else { - LDNS_FREE(fkeyword); - return -1; - } -} - diff --git a/ldns/radix.c b/ldns/radix.c deleted file mode 100644 index 9695e13..0000000 --- a/ldns/radix.c +++ /dev/null @@ -1,1593 +0,0 @@ -/* - * radix.c -- generic radix tree - * - * Taken from NSD4, modified for ldns - * - * Copyright (c) 2012, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * \file - * Implementation of a radix tree. - */ - -#include <ldns/config.h> -#include <ldns/radix.h> -#include <ldns/util.h> -#include <stdlib.h> - -/** Helper functions */ -static ldns_radix_node_t* ldns_radix_new_node(void* data, uint8_t* key, - radix_strlen_t len); -static int ldns_radix_find_prefix(ldns_radix_t* tree, uint8_t* key, - radix_strlen_t len, ldns_radix_node_t** result, radix_strlen_t* pos); -static int ldns_radix_array_space(ldns_radix_node_t* node, uint8_t byte); -static int ldns_radix_array_grow(ldns_radix_node_t* node, unsigned need); -static int ldns_radix_str_create(ldns_radix_array_t* array, uint8_t* key, - radix_strlen_t pos, radix_strlen_t len); -static int ldns_radix_prefix_remainder(radix_strlen_t prefix_len, - uint8_t* longer_str, radix_strlen_t longer_len, uint8_t** split_str, - radix_strlen_t* split_len); -static int ldns_radix_array_split(ldns_radix_array_t* array, uint8_t* key, - radix_strlen_t pos, radix_strlen_t len, ldns_radix_node_t* add); -static int ldns_radix_str_is_prefix(uint8_t* str1, radix_strlen_t len1, - uint8_t* str2, radix_strlen_t len2); -static radix_strlen_t ldns_radix_str_common(uint8_t* str1, radix_strlen_t len1, - uint8_t* str2, radix_strlen_t len2); -static ldns_radix_node_t* ldns_radix_next_in_subtree(ldns_radix_node_t* node); -static ldns_radix_node_t* ldns_radix_prev_from_index(ldns_radix_node_t* node, - uint8_t index); -static ldns_radix_node_t* ldns_radix_last_in_subtree_incl_self( - ldns_radix_node_t* node); -static ldns_radix_node_t* ldns_radix_last_in_subtree(ldns_radix_node_t* node); -static void ldns_radix_del_fix(ldns_radix_t* tree, ldns_radix_node_t* node); -static void ldns_radix_cleanup_onechild(ldns_radix_node_t* node); -static void ldns_radix_cleanup_leaf(ldns_radix_node_t* node); -static void ldns_radix_node_free(ldns_radix_node_t* node, void* arg); -static void ldns_radix_node_array_free(ldns_radix_node_t* node); -static void ldns_radix_node_array_free_front(ldns_radix_node_t* node); -static void ldns_radix_node_array_free_end(ldns_radix_node_t* node); -static void ldns_radix_array_reduce(ldns_radix_node_t* node); -static void ldns_radix_self_or_prev(ldns_radix_node_t* node, - ldns_radix_node_t** result); - - -/** - * Create a new radix node. - * - */ -static ldns_radix_node_t* -ldns_radix_new_node(void* data, uint8_t* key, radix_strlen_t len) -{ - ldns_radix_node_t* node = LDNS_MALLOC(ldns_radix_node_t); - if (!node) { - return NULL; - } - node->data = data; - node->key = key; - node->klen = len; - node->parent = NULL; - node->parent_index = 0; - node->len = 0; - node->offset = 0; - node->capacity = 0; - node->array = NULL; - return node; -} - - -/** - * Create a new radix tree. - * - */ -ldns_radix_t * -ldns_radix_create(void) -{ - ldns_radix_t* tree; - - /** Allocate memory for it */ - tree = (ldns_radix_t *) LDNS_MALLOC(ldns_radix_t); - if (!tree) { - return NULL; - } - /** Initialize it */ - ldns_radix_init(tree); - return tree; -} - - -/** - * Initialize radix tree. - * - */ -void -ldns_radix_init(ldns_radix_t* tree) -{ - /** Initialize it */ - if (tree) { - tree->root = NULL; - tree->count = 0; - } - return; -} - - -/** - * Free radix tree. - * - */ -void -ldns_radix_free(ldns_radix_t* tree) -{ - if (tree) { - if (tree->root) { - ldns_radix_traverse_postorder(tree->root, - ldns_radix_node_free, NULL); - } - LDNS_FREE(tree); - } - return; -} - - -/** - * Insert data into the tree. - * - */ -ldns_status -ldns_radix_insert(ldns_radix_t* tree, uint8_t* key, radix_strlen_t len, - void* data) -{ - radix_strlen_t pos = 0; - ldns_radix_node_t* add = NULL; - ldns_radix_node_t* prefix = NULL; - - if (!tree || !key || !data) { - return LDNS_STATUS_NULL; - } - add = ldns_radix_new_node(data, key, len); - if (!add) { - return LDNS_STATUS_MEM_ERR; - } - /** Search the trie until we can make no further process. */ - if (!ldns_radix_find_prefix(tree, key, len, &prefix, &pos)) { - /** No prefix found */ - assert(tree->root == NULL); - if (len == 0) { - /** - * Example 1: The root: - * | [0] - **/ - tree->root = add; - } else { - /** Example 2: 'dns': - * | [0] - * --| [d+ns] dns - **/ - prefix = ldns_radix_new_node(NULL, (uint8_t*)"", 0); - if (!prefix) { - LDNS_FREE(add); - return LDNS_STATUS_MEM_ERR; - } - /** Find some space in the array for the first byte */ - if (!ldns_radix_array_space(prefix, key[0])) { - LDNS_FREE(add); - LDNS_FREE(prefix->array); - LDNS_FREE(prefix); - return LDNS_STATUS_MEM_ERR; - } - /** Set relational pointers */ - add->parent = prefix; - add->parent_index = 0; - prefix->array[0].edge = add; - if (len > 1) { - /** Store the remainder of the prefix */ - if (!ldns_radix_prefix_remainder(1, key, - len, &prefix->array[0].str, - &prefix->array[0].len)) { - LDNS_FREE(add); - LDNS_FREE(prefix->array); - LDNS_FREE(prefix); - return LDNS_STATUS_MEM_ERR; - } - } - tree->root = prefix; - } - } else if (pos == len) { - /** Exact match found */ - LDNS_FREE(add); - if (prefix->data) { - /* Element already exists */ - return LDNS_STATUS_EXISTS_ERR; - } - prefix->data = data; - prefix->key = key; - prefix->klen = len; /* redundant */ - } else { - /** Prefix found */ - uint8_t byte = key[pos]; - assert(pos < len); - if (byte < prefix->offset || - (byte - prefix->offset) >= prefix->len) { - /** Find some space in the array for the byte. */ - /** - * Example 3: 'ldns' - * | [0] - * --| [d+ns] dns - * --| [l+dns] ldns - **/ - if (!ldns_radix_array_space(prefix, byte)) { - LDNS_FREE(add); - return LDNS_STATUS_MEM_ERR; - } - assert(byte >= prefix->offset); - assert((byte - prefix->offset) <= prefix->len); - byte -= prefix->offset; - if (pos+1 < len) { - /** Create remainder of the string. */ - if (!ldns_radix_str_create( - &prefix->array[byte], key, pos+1, - len)) { - LDNS_FREE(add); - return LDNS_STATUS_MEM_ERR; - } - } - /** Add new node. */ - add->parent = prefix; - add->parent_index = byte; - prefix->array[byte].edge = add; - } else if (prefix->array[byte-prefix->offset].edge == NULL) { - /** Use existing element. */ - /** - * Example 4: 'edns' - * | [0] - * --| [d+ns] dns - * --| [e+dns] edns - * --| [l+dns] ldns - **/ - byte -= prefix->offset; - if (pos+1 < len) { - /** Create remainder of the string. */ - if (!ldns_radix_str_create( - &prefix->array[byte], key, pos+1, - len)) { - LDNS_FREE(add); - return LDNS_STATUS_MEM_ERR; - } - } - /** Add new node. */ - add->parent = prefix; - add->parent_index = byte; - prefix->array[byte].edge = add; - } else { - /** - * Use existing element, but it has a shared prefix, - * we need a split. - */ - if (!ldns_radix_array_split(&prefix->array[byte-(prefix->offset)], - key, pos+1, len, add)) { - LDNS_FREE(add); - return LDNS_STATUS_MEM_ERR; - } - } - } - - tree->count ++; - return LDNS_STATUS_OK; -} - - -/** - * Delete data from the tree. - * - */ -void* ldns_radix_delete(ldns_radix_t* tree, const uint8_t* key, radix_strlen_t len) -{ - ldns_radix_node_t* del = ldns_radix_search(tree, key, len); - void* data = NULL; - if (del) { - tree->count--; - data = del->data; - del->data = NULL; - ldns_radix_del_fix(tree, del); - return data; - } - return NULL; -} - - -/** - * Search data in the tree. - * - */ -ldns_radix_node_t* -ldns_radix_search(ldns_radix_t* tree, const uint8_t* key, radix_strlen_t len) -{ - ldns_radix_node_t* node = NULL; - radix_strlen_t pos = 0; - uint8_t byte = 0; - - if (!tree || !key) { - return NULL; - } - node = tree->root; - while (node) { - if (pos == len) { - return node->data?node:NULL; - } - byte = key[pos]; - if (byte < node->offset) { - return NULL; - } - byte -= node->offset; - if (byte >= node->len) { - return NULL; - } - pos++; - if (node->array[byte].len > 0) { - /** Must match additional string. */ - if (pos + node->array[byte].len > len) { - return NULL; - } - if (memcmp(&key[pos], node->array[byte].str, - node->array[byte].len) != 0) { - return NULL; - } - pos += node->array[byte].len; - } - node = node->array[byte].edge; - } - return NULL; -} - - -/** - * Search data in the tree, and if not found, find the closest smaller - * element in the tree. - * - */ -int -ldns_radix_find_less_equal(ldns_radix_t* tree, const uint8_t* key, - radix_strlen_t len, ldns_radix_node_t** result) -{ - ldns_radix_node_t* node = NULL; - radix_strlen_t pos = 0; - uint8_t byte; - int memcmp_res = 0; - - if (!tree || !tree->root || !key) { - *result = NULL; - return 0; - } - - node = tree->root; - while (pos < len) { - byte = key[pos]; - if (byte < node->offset) { - /** - * No exact match. The lesser is in this or the - * previous node. - */ - ldns_radix_self_or_prev(node, result); - return 0; - } - byte -= node->offset; - if (byte >= node->len) { - /** - * No exact match. The lesser is in this node or the - * last of this array, or something before this node. - */ - *result = ldns_radix_last_in_subtree_incl_self(node); - if (*result == NULL) { - *result = ldns_radix_prev(node); - } - return 0; - } - pos++; - if (!node->array[byte].edge) { - /** - * No exact match. Find the previous in the array - * from this index. - */ - *result = ldns_radix_prev_from_index(node, byte); - if (*result == NULL) { - ldns_radix_self_or_prev(node, result); - } - return 0; - } - if (node->array[byte].len != 0) { - /** Must match additional string. */ - if (pos + node->array[byte].len > len) { - /** Additional string is longer than key. */ - if (memcmp(&key[pos], node->array[byte].str, - len-pos) <= 0) { - /** Key is before this node. */ - *result = ldns_radix_prev( - node->array[byte].edge); - } else { - /** Key is after additional string. */ - *result = ldns_radix_last_in_subtree_incl_self(node->array[byte].edge); - if (*result == NULL) { - *result = ldns_radix_prev(node->array[byte].edge); - } - } - return 0; - } - memcmp_res = memcmp(&key[pos], node->array[byte].str, - node->array[byte].len); - if (memcmp_res < 0) { - *result = ldns_radix_prev( - node->array[byte].edge); - return 0; - } else if (memcmp_res > 0) { - *result = ldns_radix_last_in_subtree_incl_self(node->array[byte].edge); - if (*result == NULL) { - *result = ldns_radix_prev(node->array[byte].edge); - } - return 0; - } - - pos += node->array[byte].len; - } - node = node->array[byte].edge; - } - if (node->data) { - /** Exact match. */ - *result = node; - return 1; - } - /** There is a node which is an exact match, but has no element. */ - *result = ldns_radix_prev(node); - return 0; -} - - -/** - * Get the first element in the tree. - * - */ -ldns_radix_node_t* -ldns_radix_first(const ldns_radix_t* tree) -{ - ldns_radix_node_t* first = NULL; - if (!tree || !tree->root) { - return NULL; - } - first = tree->root; - if (first->data) { - return first; - } - return ldns_radix_next(first); -} - - -/** - * Get the last element in the tree. - * - */ -ldns_radix_node_t* -ldns_radix_last(const ldns_radix_t* tree) -{ - if (!tree || !tree->root) { - return NULL; - } - return ldns_radix_last_in_subtree_incl_self(tree->root); -} - - -/** - * Next element. - * - */ -ldns_radix_node_t* -ldns_radix_next(ldns_radix_node_t* node) -{ - if (!node) { - return NULL; - } - if (node->len) { - /** Go down: most-left child is the next. */ - ldns_radix_node_t* next = ldns_radix_next_in_subtree(node); - if (next) { - return next; - } - } - /** No elements in subtree, get to parent and go down next branch. */ - while (node->parent) { - uint8_t index = node->parent_index; - node = node->parent; - index++; - for (; index < node->len; index++) { - if (node->array[index].edge) { - ldns_radix_node_t* next; - /** Node itself. */ - if (node->array[index].edge->data) { - return node->array[index].edge; - } - /** Dive into subtree. */ - next = ldns_radix_next_in_subtree(node); - if (next) { - return next; - } - } - } - } - return NULL; -} - - -/** - * Previous element. - * - */ -ldns_radix_node_t* -ldns_radix_prev(ldns_radix_node_t* node) -{ - if (!node) { - return NULL; - } - - /** Get to parent and go down previous branch. */ - while (node->parent) { - uint8_t index = node->parent_index; - ldns_radix_node_t* prev; - node = node->parent; - assert(node->len > 0); - prev = ldns_radix_prev_from_index(node, index); - if (prev) { - return prev; - } - if (node->data) { - return node; - } - } - return NULL; -} - - -/** - * Print node. - * - */ -static void -ldns_radix_node_print(FILE* fd, ldns_radix_node_t* node, - uint8_t i, uint8_t* str, radix_strlen_t len, unsigned d) -{ - uint8_t j; - if (!node) { - return; - } - for (j = 0; j < d; j++) { - fprintf(fd, "--"); - } - if (str) { - radix_strlen_t l; - fprintf(fd, "| [%u+", (unsigned) i); - for (l=0; l < len; l++) { - fprintf(fd, "%c", (char) str[l]); - } - fprintf(fd, "]%u", (unsigned) len); - } else { - fprintf(fd, "| [%u]", (unsigned) i); - } - - if (node->data) { - fprintf(fd, " %s", (char*) node->data); - } - fprintf(fd, "\n"); - - for (j = 0; j < node->len; j++) { - if (node->array[j].edge) { - ldns_radix_node_print(fd, node->array[j].edge, j, - node->array[j].str, node->array[j].len, d+1); - } - } - return; -} - - -/** - * Print radix tree. - * - */ -void -ldns_radix_printf(FILE* fd, const ldns_radix_t* tree) -{ - if (!fd || !tree) { - return; - } - if (!tree->root) { - fprintf(fd, "; empty radix tree\n"); - return; - } - ldns_radix_node_print(fd, tree->root, 0, NULL, 0, 0); - return; -} - - -/** - * Join two radix trees. - * - */ -ldns_status -ldns_radix_join(ldns_radix_t* tree1, ldns_radix_t* tree2) -{ - ldns_radix_node_t* cur_node, *next_node; - ldns_status status; - if (!tree2 || !tree2->root) { - return LDNS_STATUS_OK; - } - /** Add all elements from tree2 into tree1. */ - - cur_node = ldns_radix_first(tree2); - while (cur_node) { - status = LDNS_STATUS_NO_DATA; - /** Insert current node into tree1 */ - if (cur_node->data) { - status = ldns_radix_insert(tree1, cur_node->key, - cur_node->klen, cur_node->data); - /** Exist errors may occur */ - if (status != LDNS_STATUS_OK && - status != LDNS_STATUS_EXISTS_ERR) { - return status; - } - } - next_node = ldns_radix_next(cur_node); - if (status == LDNS_STATUS_OK) { - (void) ldns_radix_delete(tree2, cur_node->key, - cur_node->klen); - } - cur_node = next_node; - } - - return LDNS_STATUS_OK; -} - - -/** - * Split a radix tree intwo. - * - */ -ldns_status -ldns_radix_split(ldns_radix_t* tree1, size_t num, ldns_radix_t** tree2) -{ - size_t count = 0; - ldns_radix_node_t* cur_node; - ldns_status status = LDNS_STATUS_OK; - if (!tree1 || !tree1->root || num == 0) { - return LDNS_STATUS_OK; - } - if (!tree2) { - return LDNS_STATUS_NULL; - } - if (!*tree2) { - *tree2 = ldns_radix_create(); - if (!*tree2) { - return LDNS_STATUS_MEM_ERR; - } - } - cur_node = ldns_radix_first(tree1); - while (count < num && cur_node) { - if (cur_node->data) { - /** Delete current node from tree1. */ - uint8_t* cur_key = cur_node->key; - radix_strlen_t cur_len = cur_node->klen; - void* cur_data = ldns_radix_delete(tree1, cur_key, - cur_len); - /** Insert current node into tree2/ */ - if (!cur_data) { - return LDNS_STATUS_NO_DATA; - } - status = ldns_radix_insert(*tree2, cur_key, cur_len, - cur_data); - if (status != LDNS_STATUS_OK && - status != LDNS_STATUS_EXISTS_ERR) { - return status; - } -/* - if (status == LDNS_STATUS_OK) { - cur_node->key = NULL; - cur_node->klen = 0; - } -*/ - /** Update count; get first element from tree1 again. */ - count++; - cur_node = ldns_radix_first(tree1); - } else { - cur_node = ldns_radix_next(cur_node); - } - } - return LDNS_STATUS_OK; -} - - -/** - * Call function for all nodes in the tree, such that leaf nodes are - * called before parent nodes. - * - */ -void -ldns_radix_traverse_postorder(ldns_radix_node_t* node, - void (*func)(ldns_radix_node_t*, void*), void* arg) -{ - uint8_t i; - if (!node) { - return; - } - for (i=0; i < node->len; i++) { - ldns_radix_traverse_postorder(node->array[i].edge, - func, arg); - } - /** Call user function */ - (*func)(node, arg); - return; -} - - -/** Static helper functions */ - -/** - * Find a prefix of the key. - * @param tree: tree. - * @param key: key. - * @param len: length of key. - * @param result: the longest prefix, the entry itself if *pos==len, - * otherwise an array entry. - * @param pos: position in string where next unmatched byte is. - * If *pos==len, an exact match is found. - * If *pos== 0, a "" match was found. - * @return 0 (false) if no prefix found. - * - */ -static int -ldns_radix_find_prefix(ldns_radix_t* tree, uint8_t* key, - radix_strlen_t len, ldns_radix_node_t** result, radix_strlen_t* respos) -{ - /** Start searching at the root node */ - ldns_radix_node_t* n = tree->root; - radix_strlen_t pos = 0; - uint8_t byte; - *respos = 0; - *result = n; - if (!n) { - /** No root, no prefix found */ - return 0; - } - /** For each node, look if we can make further progress */ - while (n) { - if (pos == len) { - /** Exact match */ - return 1; - } - byte = key[pos]; - if (byte < n->offset) { - /** key < node */ - return 1; - } - byte -= n->offset; - if (byte >= n->len) { - /** key > node */ - return 1; - } - /** So far, the trie matches */ - pos++; - if (n->array[byte].len != 0) { - /** Must match additional string */ - if (pos + n->array[byte].len > len) { - return 1; /* no match at child node */ - } - if (memcmp(&key[pos], n->array[byte].str, - n->array[byte].len) != 0) { - return 1; /* no match at child node */ - } - pos += n->array[byte].len; - } - /** Continue searching prefix at this child node */ - n = n->array[byte].edge; - if (!n) { - return 1; - } - /** Update the prefix node */ - *respos = pos; - *result = n; - } - /** Done */ - return 1; -} - - -/** - * Make space in the node's array for another byte. - * @param node: node. - * @param byte: byte. - * @return 1 if successful, 0 otherwise. - * - */ -static int -ldns_radix_array_space(ldns_radix_node_t* node, uint8_t byte) -{ - /** Is there an array? */ - if (!node->array) { - assert(node->capacity == 0); - /** No array, create new array */ - node->array = LDNS_MALLOC(ldns_radix_array_t); - if (!node->array) { - return 0; - } - memset(&node->array[0], 0, sizeof(ldns_radix_array_t)); - node->len = 1; - node->capacity = 1; - node->offset = byte; - return 1; - } - /** Array exist */ - assert(node->array != NULL); - assert(node->capacity > 0); - - if (node->len == 0) { - /** Unused array */ - node->len = 1; - node->offset = byte; - } else if (byte < node->offset) { - /** Byte is below the offset */ - uint8_t index; - uint16_t need = node->offset - byte; - /** Is there enough capacity? */ - if (node->len + need > node->capacity) { - /** Not enough capacity, grow array */ - if (!ldns_radix_array_grow(node, - (unsigned) (node->len + need))) { - return 0; /* failed to grow array */ - } - } - /** Move items to the end */ - memmove(&node->array[need], &node->array[0], - node->len*sizeof(ldns_radix_array_t)); - /** Fix parent index */ - for (index = 0; index < node->len; index++) { - if (node->array[index+need].edge) { - node->array[index+need].edge->parent_index = - index + need; - } - } - /** Zero the first */ - memset(&node->array[0], 0, need*sizeof(ldns_radix_array_t)); - node->len += need; - node->offset = byte; - } else if (byte - node->offset >= node->len) { - /** Byte does not fit in array */ - uint16_t need = (byte - node->offset) - node->len + 1; - /** Is there enough capacity? */ - if (node->len + need > node->capacity) { - /** Not enough capacity, grow array */ - if (!ldns_radix_array_grow(node, - (unsigned) (node->len + need))) { - return 0; /* failed to grow array */ - } - } - /** Zero the added items */ - memset(&node->array[node->len], 0, - need*sizeof(ldns_radix_array_t)); - node->len += need; - } - return 1; -} - - -/** - * Grow the array. - * @param node: node. - * @param need: number of elements the array at least need to grow. - * Can't be bigger than 256. - * @return: 0 if failed, 1 if was successful. - * - */ -static int -ldns_radix_array_grow(ldns_radix_node_t* node, unsigned need) -{ - unsigned size = ((unsigned)node->capacity)*2; - ldns_radix_array_t* a = NULL; - if (need > size) { - size = need; - } - if (size > 256) { - size = 256; - } - a = LDNS_XMALLOC(ldns_radix_array_t, size); - if (!a) { - return 0; - } - assert(node->len <= node->capacity); - assert(node->capacity < size); - memcpy(&a[0], &node->array[0], node->len*sizeof(ldns_radix_array_t)); - LDNS_FREE(node->array); - node->array = a; - node->capacity = size; - return 1; -} - - -/** - * Create a prefix in the array string. - * @param array: array. - * @param key: key. - * @param pos: start position in key. - * @param len: length of key. - * @return 0 if failed, 1 if was successful. - * - */ -static int -ldns_radix_str_create(ldns_radix_array_t* array, uint8_t* key, - radix_strlen_t pos, radix_strlen_t len) -{ - array->str = LDNS_XMALLOC(uint8_t, (len-pos)); - if (!array->str) { - return 0; - } - memmove(array->str, key+pos, len-pos); - array->len = (len-pos); - return 1; -} - - -/** - * Allocate remainder from prefixes for a split. - * @param prefixlen: length of prefix. - * @param longer_str: the longer string. - * @param longer_len: the longer string length. - * @param split_str: the split string. - * @param split_len: the split string length. - * @return 0 if failed, 1 if successful. - * - */ -static int -ldns_radix_prefix_remainder(radix_strlen_t prefix_len, - uint8_t* longer_str, radix_strlen_t longer_len, - uint8_t** split_str, radix_strlen_t* split_len) -{ - *split_len = longer_len - prefix_len; - *split_str = LDNS_XMALLOC(uint8_t, (*split_len)); - if (!*split_str) { - return 0; - } - memmove(*split_str, longer_str+prefix_len, longer_len-prefix_len); - return 1; -} - - -/** - * Create a split when two nodes have a shared prefix. - * @param array: array. - * @param key: key. - * @param pos: start position in key. - * @param len: length of the key. - * @param add: node to be added. - * @return 0 if failed, 1 if was successful. - * - */ -static int -ldns_radix_array_split(ldns_radix_array_t* array, uint8_t* key, - radix_strlen_t pos, radix_strlen_t len, ldns_radix_node_t* add) -{ - uint8_t* str_to_add = key + pos; - radix_strlen_t strlen_to_add = len - pos; - - if (ldns_radix_str_is_prefix(str_to_add, strlen_to_add, - array->str, array->len)) { - /** The string to add is a prefix of the existing string */ - uint8_t* split_str = NULL, *dup_str = NULL; - radix_strlen_t split_len = 0; - /** - * Example 5: 'ld' - * | [0] - * --| [d+ns] dns - * --| [e+dns] edns - * --| [l+d] ld - * ----| [n+s] ldns - **/ - assert(strlen_to_add < array->len); - /** Store the remainder in the split string */ - if (array->len - strlen_to_add > 1) { - if (!ldns_radix_prefix_remainder(strlen_to_add+1, - array->str, array->len, &split_str, - &split_len)) { - return 0; - } - } - /** Duplicate the string to add */ - if (strlen_to_add != 0) { - dup_str = LDNS_XMALLOC(uint8_t, strlen_to_add); - if (!dup_str) { - LDNS_FREE(split_str); - return 0; - } - memcpy(dup_str, str_to_add, strlen_to_add); - } - /** Make space in array for the new node */ - if (!ldns_radix_array_space(add, - array->str[strlen_to_add])) { - LDNS_FREE(split_str); - LDNS_FREE(dup_str); - return 0; - } - /** - * The added node should go direct under the existing parent. - * The existing node should go under the added node. - */ - add->parent = array->edge->parent; - add->parent_index = array->edge->parent_index; - add->array[0].edge = array->edge; - add->array[0].str = split_str; - add->array[0].len = split_len; - array->edge->parent = add; - array->edge->parent_index = 0; - LDNS_FREE(array->str); - array->edge = add; - array->str = dup_str; - array->len = strlen_to_add; - } else if (ldns_radix_str_is_prefix(array->str, array->len, - str_to_add, strlen_to_add)) { - /** The existing string is a prefix of the string to add */ - /** - * Example 6: 'dns-ng' - * | [0] - * --| [d+ns] dns - * ----| [-+ng] dns-ng - * --| [e+dns] edns - * --| [l+d] ld - * ----| [n+s] ldns - **/ - uint8_t* split_str = NULL; - radix_strlen_t split_len = 0; - assert(array->len < strlen_to_add); - if (strlen_to_add - array->len > 1) { - if (!ldns_radix_prefix_remainder(array->len+1, - str_to_add, strlen_to_add, &split_str, - &split_len)) { - return 0; - } - } - /** Make space in array for the new node */ - if (!ldns_radix_array_space(array->edge, - str_to_add[array->len])) { - LDNS_FREE(split_str); - return 0; - } - /** - * The added node should go direct under the existing node. - */ - add->parent = array->edge; - add->parent_index = str_to_add[array->len] - - array->edge->offset; - array->edge->array[add->parent_index].edge = add; - array->edge->array[add->parent_index].str = split_str; - array->edge->array[add->parent_index].len = split_len; - } else { - /** Create a new split node. */ - /** - * Example 7: 'dndns' - * | [0] - * --| [d+n] - * ----| [d+ns] dndns - * ----| [s] dns - * ------| [-+ng] dns-ng - * --| [e+dns] edns - * --| [l+d] ld - * ----| [n+s] ldns - **/ - ldns_radix_node_t* common = NULL; - uint8_t* common_str = NULL, *s1 = NULL, *s2 = NULL; - radix_strlen_t common_len = 0, l1 = 0, l2 = 0; - common_len = ldns_radix_str_common(array->str, array->len, - str_to_add, strlen_to_add); - assert(common_len < array->len); - assert(common_len < strlen_to_add); - /** Create the new common node. */ - common = ldns_radix_new_node(NULL, (uint8_t*)"", 0); - if (!common) { - return 0; - } - if (array->len - common_len > 1) { - if (!ldns_radix_prefix_remainder(common_len+1, - array->str, array->len, &s1, &l1)) { - LDNS_FREE(common); - return 0; - } - } - if (strlen_to_add - common_len > 1) { - if (!ldns_radix_prefix_remainder(common_len+1, - str_to_add, strlen_to_add, &s2, &l2)) { - LDNS_FREE(common); - LDNS_FREE(s1); - return 0; - } - } - /** Create the shared prefix. */ - if (common_len > 0) { - common_str = LDNS_XMALLOC(uint8_t, common_len); - if (!common_str) { - LDNS_FREE(common); - LDNS_FREE(s1); - LDNS_FREE(s2); - return 0; - } - memcpy(common_str, str_to_add, common_len); - } - /** Make space in the common node array. */ - if (!ldns_radix_array_space(common, array->str[common_len]) || - !ldns_radix_array_space(common, str_to_add[common_len])) { - LDNS_FREE(common->array); - LDNS_FREE(common); - LDNS_FREE(common_str); - LDNS_FREE(s1); - LDNS_FREE(s2); - return 0; - } - /** - * The common node should go direct under the parent node. - * The added and existing nodes go under the common node. - */ - common->parent = array->edge->parent; - common->parent_index = array->edge->parent_index; - array->edge->parent = common; - array->edge->parent_index = array->str[common_len] - - common->offset; - add->parent = common; - add->parent_index = str_to_add[common_len] - common->offset; - common->array[array->edge->parent_index].edge = array->edge; - common->array[array->edge->parent_index].str = s1; - common->array[array->edge->parent_index].len = l1; - common->array[add->parent_index].edge = add; - common->array[add->parent_index].str = s2; - common->array[add->parent_index].len = l2; - LDNS_FREE(array->str); - array->edge = common; - array->str = common_str; - array->len = common_len; - } - return 1; -} - - -/** - * Check if one string prefix of other string. - * @param str1: one string. - * @param len1: one string length. - * @param str2: other string. - * @param len2: other string length. - * @return 1 if prefix, 0 otherwise. - * - */ -static int -ldns_radix_str_is_prefix(uint8_t* str1, radix_strlen_t len1, - uint8_t* str2, radix_strlen_t len2) -{ - if (len1 == 0) { - return 1; /* empty prefix is also a prefix */ - } - if (len1 > len2) { - return 0; /* len1 is longer so str1 cannot be a prefix */ - } - return (memcmp(str1, str2, len1) == 0); -} - - -/** - * Return the number of bytes in common for the two strings. - * @param str1: one string. - * @param len1: one string length. - * @param str2: other string. - * @param len2: other string length. - * @return length of substring that the two strings have in common. - * - */ -static radix_strlen_t -ldns_radix_str_common(uint8_t* str1, radix_strlen_t len1, - uint8_t* str2, radix_strlen_t len2) -{ - radix_strlen_t i, max = (len1<len2)?len1:len2; - for (i=0; i<max; i++) { - if (str1[i] != str2[i]) { - return i; - } - } - return max; -} - - -/** - * Find the next element in the subtree of this node. - * @param node: node. - * @return: node with next element. - * - */ -static ldns_radix_node_t* -ldns_radix_next_in_subtree(ldns_radix_node_t* node) -{ - uint16_t i; - ldns_radix_node_t* next; - /** Try every subnode. */ - for (i = 0; i < node->len; i++) { - if (node->array[i].edge) { - /** Node itself. */ - if (node->array[i].edge->data) { - return node->array[i].edge; - } - /** Dive into subtree. */ - next = ldns_radix_next_in_subtree(node->array[i].edge); - if (next) { - return next; - } - } - } - return NULL; -} - - -/** - * Find the previous element in the array of this node, from index. - * @param node: node. - * @param index: index. - * @return previous node from index. - * - */ -static ldns_radix_node_t* -ldns_radix_prev_from_index(ldns_radix_node_t* node, uint8_t index) -{ - uint8_t i = index; - while (i > 0) { - i--; - if (node->array[i].edge) { - ldns_radix_node_t* prev = - ldns_radix_last_in_subtree_incl_self(node); - if (prev) { - return prev; - } - } - } - return NULL; -} - - -/** - * Find last node in subtree, or this node (if have data). - * @param node: node. - * @return last node in subtree, or this node, or NULL. - * - */ -static ldns_radix_node_t* -ldns_radix_last_in_subtree_incl_self(ldns_radix_node_t* node) -{ - ldns_radix_node_t* last = ldns_radix_last_in_subtree(node); - if (last) { - return last; - } else if (node->data) { - return node; - } - return NULL; -} - - -/** - * Find last node in subtree. - * @param node: node. - * @return last node in subtree. - * - */ -static ldns_radix_node_t* -ldns_radix_last_in_subtree(ldns_radix_node_t* node) -{ - int i; - /** Look for the most right leaf node. */ - for (i=(int)(node->len)-1; i >= 0; i--) { - if (node->array[i].edge) { - /** Keep looking for the most right leaf node. */ - if (node->array[i].edge->len > 0) { - ldns_radix_node_t* last = - ldns_radix_last_in_subtree( - node->array[i].edge); - if (last) { - return last; - } - } - /** Could this be the most right leaf node? */ - if (node->array[i].edge->data) { - return node->array[i].edge; - } - } - } - return NULL; -} - - -/** - * Fix tree after deleting element. - * @param tree: tree. - * @param node: node with deleted element. - * - */ -static void -ldns_radix_del_fix(ldns_radix_t* tree, ldns_radix_node_t* node) -{ - while (node) { - if (node->data) { - /** Thou should not delete nodes with data attached. */ - return; - } else if (node->len == 1 && node->parent) { - /** Node with one child is fold back into. */ - ldns_radix_cleanup_onechild(node); - return; - } else if (node->len == 0) { - /** Leaf node. */ - ldns_radix_node_t* parent = node->parent; - if (!parent) { - /** The root is a leaf node. */ - ldns_radix_node_free(node, NULL); - tree->root = NULL; - return; - } - /** Cleanup leaf node and continue with parent. */ - ldns_radix_cleanup_leaf(node); - node = parent; - } else { - /** - * Node cannot be deleted, because it has edge nodes - * and no parent to fix up to. - */ - return; - } - } - /** Not reached. */ - return; -} - - -/** - * Clean up a node with one child. - * @param node: node with one child. - * - */ -static void -ldns_radix_cleanup_onechild(ldns_radix_node_t* node) -{ - uint8_t* join_str; - radix_strlen_t join_len; - uint8_t parent_index = node->parent_index; - ldns_radix_node_t* child = node->array[0].edge; - ldns_radix_node_t* parent = node->parent; - - /** Node has one child, merge the child node into the parent node. */ - assert(parent_index < parent->len); - join_len = parent->array[parent_index].len + node->array[0].len + 1; - - join_str = LDNS_XMALLOC(uint8_t, join_len); - if (!join_str) { - /** - * Cleanup failed due to out of memory. - * This tree is now inefficient, with the empty node still - * existing, but it is still valid. - */ - return; - } - - memcpy(join_str, parent->array[parent_index].str, - parent->array[parent_index].len); - join_str[parent->array[parent_index].len] = child->parent_index + - node->offset; - memmove(join_str + parent->array[parent_index].len+1, - node->array[0].str, node->array[0].len); - - LDNS_FREE(parent->array[parent_index].str); - parent->array[parent_index].str = join_str; - parent->array[parent_index].len = join_len; - parent->array[parent_index].edge = child; - child->parent = parent; - child->parent_index = parent_index; - ldns_radix_node_free(node, NULL); - return; -} - - -/** - * Clean up a leaf node. - * @param node: leaf node. - * - */ -static void -ldns_radix_cleanup_leaf(ldns_radix_node_t* node) -{ - uint8_t parent_index = node->parent_index; - ldns_radix_node_t* parent = node->parent; - /** Delete lead node and fix parent array. */ - assert(parent_index < parent->len); - ldns_radix_node_free(node, NULL); - LDNS_FREE(parent->array[parent_index].str); - parent->array[parent_index].str = NULL; - parent->array[parent_index].len = 0; - parent->array[parent_index].edge = NULL; - /** Fix array in parent. */ - if (parent->len == 1) { - ldns_radix_node_array_free(parent); - } else if (parent_index == 0) { - ldns_radix_node_array_free_front(parent); - } else { - ldns_radix_node_array_free_end(parent); - } - return; -} - - -/** - * Free a radix node. - * @param node: node. - * @param arg: user argument. - * - */ -static void -ldns_radix_node_free(ldns_radix_node_t* node, void* arg) -{ - uint16_t i; - (void) arg; - if (!node) { - return; - } - for (i=0; i < node->len; i++) { - LDNS_FREE(node->array[i].str); - } - node->key = NULL; - node->klen = 0; - LDNS_FREE(node->array); - LDNS_FREE(node); - return; -} - - -/** - * Free select edge array. - * @param node: node. - * - */ -static void -ldns_radix_node_array_free(ldns_radix_node_t* node) -{ - node->offset = 0; - node->len = 0; - LDNS_FREE(node->array); - node->array = NULL; - node->capacity = 0; - return; -} - - -/** - * Free front of select edge array. - * @param node: node. - * - */ -static void -ldns_radix_node_array_free_front(ldns_radix_node_t* node) -{ - uint16_t i, n = 0; - /** Remove until a non NULL entry. */ - while (n < node->len && node->array[n].edge == NULL) { - n++; - } - if (n == 0) { - return; - } - if (n == node->len) { - ldns_radix_node_array_free(node); - return; - } - assert(n < node->len); - assert((int) n <= (255 - (int) node->offset)); - memmove(&node->array[0], &node->array[n], - (node->len - n)*sizeof(ldns_radix_array_t)); - node->offset += n; - node->len -= n; - for (i=0; i < node->len; i++) { - if (node->array[i].edge) { - node->array[i].edge->parent_index = i; - } - } - ldns_radix_array_reduce(node); - return; -} - - -/** - * Free front of select edge array. - * @param node: node. - * - */ -static void -ldns_radix_node_array_free_end(ldns_radix_node_t* node) -{ - uint16_t n = 0; - /** Shorten array. */ - while (n < node->len && node->array[node->len-1-n].edge == NULL) { - n++; - } - if (n == 0) { - return; - } - if (n == node->len) { - ldns_radix_node_array_free(node); - return; - } - assert(n < node->len); - node->len -= n; - ldns_radix_array_reduce(node); - return; -} - - -/** - * Reduce the capacity of the array if needed. - * @param node: node. - * - */ -static void -ldns_radix_array_reduce(ldns_radix_node_t* node) -{ - if (node->len <= node->capacity/2 && node->len != node->capacity) { - ldns_radix_array_t* a = LDNS_XMALLOC(ldns_radix_array_t, - node->len); - if (!a) { - return; - } - memcpy(a, node->array, sizeof(ldns_radix_array_t)*node->len); - LDNS_FREE(node->array); - node->array = a; - node->capacity = node->len; - } - return; -} - - -/** - * Return this element if it exists, the previous otherwise. - * @param node: from this node. - * @param result: result node. - * - */ -static void -ldns_radix_self_or_prev(ldns_radix_node_t* node, ldns_radix_node_t** result) -{ - if (node->data) { - *result = node; - } else { - *result = ldns_radix_prev(node); - } - return; -} diff --git a/ldns/rbtree.c b/ldns/rbtree.c deleted file mode 100644 index 01ae9c7..0000000 --- a/ldns/rbtree.c +++ /dev/null @@ -1,670 +0,0 @@ -/* - * rbtree.c -- generic red black tree - * - * Taken from Unbound, modified for ldns - * - * Copyright (c) 2001-2008, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * \file - * Implementation of a redblack tree. - */ - -#include <ldns/config.h> -#include <ldns/rbtree.h> -#include <ldns/util.h> -#include <stdlib.h> - -/** Node colour black */ -#define BLACK 0 -/** Node colour red */ -#define RED 1 - -/** the NULL node, global alloc */ -ldns_rbnode_t ldns_rbtree_null_node = { - LDNS_RBTREE_NULL, /* Parent. */ - LDNS_RBTREE_NULL, /* Left. */ - LDNS_RBTREE_NULL, /* Right. */ - NULL, /* Key. */ - NULL, /* Data. */ - BLACK /* Color. */ -}; - -/** rotate subtree left (to preserve redblack property) */ -static void ldns_rbtree_rotate_left(ldns_rbtree_t *rbtree, ldns_rbnode_t *node); -/** rotate subtree right (to preserve redblack property) */ -static void ldns_rbtree_rotate_right(ldns_rbtree_t *rbtree, ldns_rbnode_t *node); -/** Fixup node colours when insert happened */ -static void ldns_rbtree_insert_fixup(ldns_rbtree_t *rbtree, ldns_rbnode_t *node); -/** Fixup node colours when delete happened */ -static void ldns_rbtree_delete_fixup(ldns_rbtree_t* rbtree, ldns_rbnode_t* child, ldns_rbnode_t* child_parent); - -/* - * Creates a new red black tree, intializes and returns a pointer to it. - * - * Return NULL on failure. - * - */ -ldns_rbtree_t * -ldns_rbtree_create (int (*cmpf)(const void *, const void *)) -{ - ldns_rbtree_t *rbtree; - - /* Allocate memory for it */ - rbtree = (ldns_rbtree_t *) LDNS_MALLOC(ldns_rbtree_t); - if (!rbtree) { - return NULL; - } - - /* Initialize it */ - ldns_rbtree_init(rbtree, cmpf); - - return rbtree; -} - -void -ldns_rbtree_init(ldns_rbtree_t *rbtree, int (*cmpf)(const void *, const void *)) -{ - /* Initialize it */ - rbtree->root = LDNS_RBTREE_NULL; - rbtree->count = 0; - rbtree->cmp = cmpf; -} - -void -ldns_rbtree_free(ldns_rbtree_t *rbtree) -{ - LDNS_FREE(rbtree); -} - -/* - * Rotates the node to the left. - * - */ -static void -ldns_rbtree_rotate_left(ldns_rbtree_t *rbtree, ldns_rbnode_t *node) -{ - ldns_rbnode_t *right = node->right; - node->right = right->left; - if (right->left != LDNS_RBTREE_NULL) - right->left->parent = node; - - right->parent = node->parent; - - if (node->parent != LDNS_RBTREE_NULL) { - if (node == node->parent->left) { - node->parent->left = right; - } else { - node->parent->right = right; - } - } else { - rbtree->root = right; - } - right->left = node; - node->parent = right; -} - -/* - * Rotates the node to the right. - * - */ -static void -ldns_rbtree_rotate_right(ldns_rbtree_t *rbtree, ldns_rbnode_t *node) -{ - ldns_rbnode_t *left = node->left; - node->left = left->right; - if (left->right != LDNS_RBTREE_NULL) - left->right->parent = node; - - left->parent = node->parent; - - if (node->parent != LDNS_RBTREE_NULL) { - if (node == node->parent->right) { - node->parent->right = left; - } else { - node->parent->left = left; - } - } else { - rbtree->root = left; - } - left->right = node; - node->parent = left; -} - -static void -ldns_rbtree_insert_fixup(ldns_rbtree_t *rbtree, ldns_rbnode_t *node) -{ - ldns_rbnode_t *uncle; - - /* While not at the root and need fixing... */ - while (node != rbtree->root && node->parent->color == RED) { - /* If our parent is left child of our grandparent... */ - if (node->parent == node->parent->parent->left) { - uncle = node->parent->parent->right; - - /* If our uncle is red... */ - if (uncle->color == RED) { - /* Paint the parent and the uncle black... */ - node->parent->color = BLACK; - uncle->color = BLACK; - - /* And the grandparent red... */ - node->parent->parent->color = RED; - - /* And continue fixing the grandparent */ - node = node->parent->parent; - } else { /* Our uncle is black... */ - /* Are we the right child? */ - if (node == node->parent->right) { - node = node->parent; - ldns_rbtree_rotate_left(rbtree, node); - } - /* Now we're the left child, repaint and rotate... */ - node->parent->color = BLACK; - node->parent->parent->color = RED; - ldns_rbtree_rotate_right(rbtree, node->parent->parent); - } - } else { - uncle = node->parent->parent->left; - - /* If our uncle is red... */ - if (uncle->color == RED) { - /* Paint the parent and the uncle black... */ - node->parent->color = BLACK; - uncle->color = BLACK; - - /* And the grandparent red... */ - node->parent->parent->color = RED; - - /* And continue fixing the grandparent */ - node = node->parent->parent; - } else { /* Our uncle is black... */ - /* Are we the right child? */ - if (node == node->parent->left) { - node = node->parent; - ldns_rbtree_rotate_right(rbtree, node); - } - /* Now we're the right child, repaint and rotate... */ - node->parent->color = BLACK; - node->parent->parent->color = RED; - ldns_rbtree_rotate_left(rbtree, node->parent->parent); - } - } - } - rbtree->root->color = BLACK; -} - -void -ldns_rbtree_insert_vref(ldns_rbnode_t *data, void *rbtree) -{ - (void) ldns_rbtree_insert((ldns_rbtree_t *) rbtree, - data); -} - -/* - * Inserts a node into a red black tree. - * - * Returns NULL on failure or the pointer to the newly added node - * otherwise. - */ -ldns_rbnode_t * -ldns_rbtree_insert (ldns_rbtree_t *rbtree, ldns_rbnode_t *data) -{ - /* XXX Not necessary, but keeps compiler quiet... */ - int r = 0; - - /* We start at the root of the tree */ - ldns_rbnode_t *node = rbtree->root; - ldns_rbnode_t *parent = LDNS_RBTREE_NULL; - - /* Lets find the new parent... */ - while (node != LDNS_RBTREE_NULL) { - /* Compare two keys, do we have a duplicate? */ - if ((r = rbtree->cmp(data->key, node->key)) == 0) { - return NULL; - } - parent = node; - - if (r < 0) { - node = node->left; - } else { - node = node->right; - } - } - - /* Initialize the new node */ - data->parent = parent; - data->left = data->right = LDNS_RBTREE_NULL; - data->color = RED; - rbtree->count++; - - /* Insert it into the tree... */ - if (parent != LDNS_RBTREE_NULL) { - if (r < 0) { - parent->left = data; - } else { - parent->right = data; - } - } else { - rbtree->root = data; - } - - /* Fix up the red-black properties... */ - ldns_rbtree_insert_fixup(rbtree, data); - - return data; -} - -/* - * Searches the red black tree, returns the data if key is found or NULL otherwise. - * - */ -ldns_rbnode_t * -ldns_rbtree_search (ldns_rbtree_t *rbtree, const void *key) -{ - ldns_rbnode_t *node; - - if (ldns_rbtree_find_less_equal(rbtree, key, &node)) { - return node; - } else { - return NULL; - } -} - -/** helpers for delete: swap node colours */ -static void swap_int8(uint8_t* x, uint8_t* y) -{ - uint8_t t = *x; *x = *y; *y = t; -} - -/** helpers for delete: swap node pointers */ -static void swap_np(ldns_rbnode_t** x, ldns_rbnode_t** y) -{ - ldns_rbnode_t* t = *x; *x = *y; *y = t; -} - -/** Update parent pointers of child trees of 'parent' */ -static void change_parent_ptr(ldns_rbtree_t* rbtree, ldns_rbnode_t* parent, ldns_rbnode_t* old, ldns_rbnode_t* new) -{ - if(parent == LDNS_RBTREE_NULL) - { - if(rbtree->root == old) rbtree->root = new; - return; - } - if(parent->left == old) parent->left = new; - if(parent->right == old) parent->right = new; -} -/** Update parent pointer of a node 'child' */ -static void change_child_ptr(ldns_rbnode_t* child, ldns_rbnode_t* old, ldns_rbnode_t* new) -{ - if(child == LDNS_RBTREE_NULL) return; - if(child->parent == old) child->parent = new; -} - -ldns_rbnode_t* -ldns_rbtree_delete(ldns_rbtree_t *rbtree, const void *key) -{ - ldns_rbnode_t *to_delete; - ldns_rbnode_t *child; - if((to_delete = ldns_rbtree_search(rbtree, key)) == 0) return 0; - rbtree->count--; - - /* make sure we have at most one non-leaf child */ - if(to_delete->left != LDNS_RBTREE_NULL && - to_delete->right != LDNS_RBTREE_NULL) - { - /* swap with smallest from right subtree (or largest from left) */ - ldns_rbnode_t *smright = to_delete->right; - while(smright->left != LDNS_RBTREE_NULL) - smright = smright->left; - /* swap the smright and to_delete elements in the tree, - * but the ldns_rbnode_t is first part of user data struct - * so cannot just swap the keys and data pointers. Instead - * readjust the pointers left,right,parent */ - - /* swap colors - colors are tied to the position in the tree */ - swap_int8(&to_delete->color, &smright->color); - - /* swap child pointers in parents of smright/to_delete */ - change_parent_ptr(rbtree, to_delete->parent, to_delete, smright); - if(to_delete->right != smright) - change_parent_ptr(rbtree, smright->parent, smright, to_delete); - - /* swap parent pointers in children of smright/to_delete */ - change_child_ptr(smright->left, smright, to_delete); - change_child_ptr(smright->left, smright, to_delete); - change_child_ptr(smright->right, smright, to_delete); - change_child_ptr(smright->right, smright, to_delete); - change_child_ptr(to_delete->left, to_delete, smright); - if(to_delete->right != smright) - change_child_ptr(to_delete->right, to_delete, smright); - if(to_delete->right == smright) - { - /* set up so after swap they work */ - to_delete->right = to_delete; - smright->parent = smright; - } - - /* swap pointers in to_delete/smright nodes */ - swap_np(&to_delete->parent, &smright->parent); - swap_np(&to_delete->left, &smright->left); - swap_np(&to_delete->right, &smright->right); - - /* now delete to_delete (which is at the location where the smright previously was) */ - } - - if(to_delete->left != LDNS_RBTREE_NULL) child = to_delete->left; - else child = to_delete->right; - - /* unlink to_delete from the tree, replace to_delete with child */ - change_parent_ptr(rbtree, to_delete->parent, to_delete, child); - change_child_ptr(child, to_delete, to_delete->parent); - - if(to_delete->color == RED) - { - /* if node is red then the child (black) can be swapped in */ - } - else if(child->color == RED) - { - /* change child to BLACK, removing a RED node is no problem */ - if(child!=LDNS_RBTREE_NULL) child->color = BLACK; - } - else ldns_rbtree_delete_fixup(rbtree, child, to_delete->parent); - - /* unlink completely */ - to_delete->parent = LDNS_RBTREE_NULL; - to_delete->left = LDNS_RBTREE_NULL; - to_delete->right = LDNS_RBTREE_NULL; - to_delete->color = BLACK; - return to_delete; -} - -static void ldns_rbtree_delete_fixup(ldns_rbtree_t* rbtree, ldns_rbnode_t* child, ldns_rbnode_t* child_parent) -{ - ldns_rbnode_t* sibling; - int go_up = 1; - - /* determine sibling to the node that is one-black short */ - if(child_parent->right == child) sibling = child_parent->left; - else sibling = child_parent->right; - - while(go_up) - { - if(child_parent == LDNS_RBTREE_NULL) - { - /* removed parent==black from root, every path, so ok */ - return; - } - - if(sibling->color == RED) - { /* rotate to get a black sibling */ - child_parent->color = RED; - sibling->color = BLACK; - if(child_parent->right == child) - ldns_rbtree_rotate_right(rbtree, child_parent); - else ldns_rbtree_rotate_left(rbtree, child_parent); - /* new sibling after rotation */ - if(child_parent->right == child) sibling = child_parent->left; - else sibling = child_parent->right; - } - - if(child_parent->color == BLACK - && sibling->color == BLACK - && sibling->left->color == BLACK - && sibling->right->color == BLACK) - { /* fixup local with recolor of sibling */ - if(sibling != LDNS_RBTREE_NULL) - sibling->color = RED; - - child = child_parent; - child_parent = child_parent->parent; - /* prepare to go up, new sibling */ - if(child_parent->right == child) sibling = child_parent->left; - else sibling = child_parent->right; - } - else go_up = 0; - } - - if(child_parent->color == RED - && sibling->color == BLACK - && sibling->left->color == BLACK - && sibling->right->color == BLACK) - { - /* move red to sibling to rebalance */ - if(sibling != LDNS_RBTREE_NULL) - sibling->color = RED; - child_parent->color = BLACK; - return; - } - - /* get a new sibling, by rotating at sibling. See which child - of sibling is red */ - if(child_parent->right == child - && sibling->color == BLACK - && sibling->right->color == RED - && sibling->left->color == BLACK) - { - sibling->color = RED; - sibling->right->color = BLACK; - ldns_rbtree_rotate_left(rbtree, sibling); - /* new sibling after rotation */ - if(child_parent->right == child) sibling = child_parent->left; - else sibling = child_parent->right; - } - else if(child_parent->left == child - && sibling->color == BLACK - && sibling->left->color == RED - && sibling->right->color == BLACK) - { - sibling->color = RED; - sibling->left->color = BLACK; - ldns_rbtree_rotate_right(rbtree, sibling); - /* new sibling after rotation */ - if(child_parent->right == child) sibling = child_parent->left; - else sibling = child_parent->right; - } - - /* now we have a black sibling with a red child. rotate and exchange colors. */ - sibling->color = child_parent->color; - child_parent->color = BLACK; - if(child_parent->right == child) - { - sibling->left->color = BLACK; - ldns_rbtree_rotate_right(rbtree, child_parent); - } - else - { - sibling->right->color = BLACK; - ldns_rbtree_rotate_left(rbtree, child_parent); - } -} - -int -ldns_rbtree_find_less_equal(ldns_rbtree_t *rbtree, const void *key, ldns_rbnode_t **result) -{ - int r; - ldns_rbnode_t *node; - - /* We start at root... */ - node = rbtree->root; - - *result = NULL; - - /* While there are children... */ - while (node != LDNS_RBTREE_NULL) { - r = rbtree->cmp(key, node->key); - if (r == 0) { - /* Exact match */ - *result = node; - return 1; - } - if (r < 0) { - node = node->left; - } else { - /* Temporary match */ - *result = node; - node = node->right; - } - } - return 0; -} - -/* - * Finds the first element in the red black tree - * - */ -ldns_rbnode_t * -ldns_rbtree_first(const ldns_rbtree_t *rbtree) -{ - ldns_rbnode_t *node = rbtree->root; - - if (rbtree->root != LDNS_RBTREE_NULL) { - for (node = rbtree->root; node->left != LDNS_RBTREE_NULL; node = node->left); - } - return node; -} - -ldns_rbnode_t * -ldns_rbtree_last(const ldns_rbtree_t *rbtree) -{ - ldns_rbnode_t *node = rbtree->root; - - if (rbtree->root != LDNS_RBTREE_NULL) { - for (node = rbtree->root; node->right != LDNS_RBTREE_NULL; node = node->right); - } - return node; -} - -/* - * Returns the next node... - * - */ -ldns_rbnode_t * -ldns_rbtree_next(ldns_rbnode_t *node) -{ - ldns_rbnode_t *parent; - - if (node->right != LDNS_RBTREE_NULL) { - /* One right, then keep on going left... */ - for (node = node->right; - node->left != LDNS_RBTREE_NULL; - node = node->left); - } else { - parent = node->parent; - while (parent != LDNS_RBTREE_NULL && node == parent->right) { - node = parent; - parent = parent->parent; - } - node = parent; - } - return node; -} - -ldns_rbnode_t * -ldns_rbtree_previous(ldns_rbnode_t *node) -{ - ldns_rbnode_t *parent; - - if (node->left != LDNS_RBTREE_NULL) { - /* One left, then keep on going right... */ - for (node = node->left; - node->right != LDNS_RBTREE_NULL; - node = node->right); - } else { - parent = node->parent; - while (parent != LDNS_RBTREE_NULL && node == parent->left) { - node = parent; - parent = parent->parent; - } - node = parent; - } - return node; -} - -/** - * split off elements number of elements from the start - * of the name tree and return a new tree - */ -ldns_rbtree_t * -ldns_rbtree_split(ldns_rbtree_t *tree, - size_t elements) -{ - ldns_rbtree_t *new_tree; - ldns_rbnode_t *cur_node; - ldns_rbnode_t *move_node; - size_t count = 0; - - new_tree = ldns_rbtree_create(tree->cmp); - - cur_node = ldns_rbtree_first(tree); - while (count < elements && cur_node != LDNS_RBTREE_NULL) { - move_node = ldns_rbtree_delete(tree, cur_node->key); - (void)ldns_rbtree_insert(new_tree, move_node); - cur_node = ldns_rbtree_first(tree); - count++; - } - - return new_tree; -} - -/* - * add all node from the second tree to the first (removing them from the - * second), and fix up nsec(3)s if present - */ -void -ldns_rbtree_join(ldns_rbtree_t *tree1, ldns_rbtree_t *tree2) -{ - ldns_traverse_postorder(tree2, ldns_rbtree_insert_vref, tree1); -} - -/** recursive descent traverse */ -static void -traverse_post(void (*func)(ldns_rbnode_t*, void*), void* arg, - ldns_rbnode_t* node) -{ - if(!node || node == LDNS_RBTREE_NULL) - return; - /* recurse */ - traverse_post(func, arg, node->left); - traverse_post(func, arg, node->right); - /* call user func */ - (*func)(node, arg); -} - -void -ldns_traverse_postorder(ldns_rbtree_t* tree, - void (*func)(ldns_rbnode_t*, void*), void* arg) -{ - traverse_post(func, arg, tree->root); -} diff --git a/ldns/rdata.c b/ldns/rdata.c deleted file mode 100644 index caf853d..0000000 --- a/ldns/rdata.c +++ /dev/null @@ -1,760 +0,0 @@ -/* - * rdata.c - * - * rdata implementation - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -/* - * Access functions - * do this as functions to get type checking - */ - -/* read */ -size_t -ldns_rdf_size(const ldns_rdf *rd) -{ - assert(rd != NULL); - return rd->_size; -} - -ldns_rdf_type -ldns_rdf_get_type(const ldns_rdf *rd) -{ - assert(rd != NULL); - return rd->_type; -} - -uint8_t * -ldns_rdf_data(const ldns_rdf *rd) -{ - assert(rd != NULL); - return rd->_data; -} - -/* write */ -void -ldns_rdf_set_size(ldns_rdf *rd, size_t size) -{ - assert(rd != NULL); - rd->_size = size; -} - -void -ldns_rdf_set_type(ldns_rdf *rd, ldns_rdf_type type) -{ - assert(rd != NULL); - rd->_type = type; -} - -void -ldns_rdf_set_data(ldns_rdf *rd, void *data) -{ - /* only copy the pointer */ - assert(rd != NULL); - rd->_data = data; -} - -/* for types that allow it, return - * the native/host order type */ -uint8_t -ldns_rdf2native_int8(const ldns_rdf *rd) -{ - uint8_t data; - - /* only allow 8 bit rdfs */ - if (ldns_rdf_size(rd) != LDNS_RDF_SIZE_BYTE) { - return 0; - } - - memcpy(&data, ldns_rdf_data(rd), sizeof(data)); - return data; -} - -uint16_t -ldns_rdf2native_int16(const ldns_rdf *rd) -{ - uint16_t data; - - /* only allow 16 bit rdfs */ - if (ldns_rdf_size(rd) != LDNS_RDF_SIZE_WORD) { - return 0; - } - - memcpy(&data, ldns_rdf_data(rd), sizeof(data)); - return ntohs(data); -} - -uint32_t -ldns_rdf2native_int32(const ldns_rdf *rd) -{ - uint32_t data; - - /* only allow 32 bit rdfs */ - if (ldns_rdf_size(rd) != LDNS_RDF_SIZE_DOUBLEWORD) { - return 0; - } - - memcpy(&data, ldns_rdf_data(rd), sizeof(data)); - return ntohl(data); -} - -time_t -ldns_rdf2native_time_t(const ldns_rdf *rd) -{ - uint32_t data; - - /* only allow 32 bit rdfs */ - if (ldns_rdf_size(rd) != LDNS_RDF_SIZE_DOUBLEWORD || - ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TIME) { - return 0; - } - memcpy(&data, ldns_rdf_data(rd), sizeof(data)); - return (time_t)ntohl(data); -} - -ldns_rdf * -ldns_native2rdf_int8(ldns_rdf_type type, uint8_t value) -{ - return ldns_rdf_new_frm_data(type, LDNS_RDF_SIZE_BYTE, &value); -} - -ldns_rdf * -ldns_native2rdf_int16(ldns_rdf_type type, uint16_t value) -{ - uint16_t *rdf_data = LDNS_XMALLOC(uint16_t, 1); - ldns_rdf* rdf; - if (!rdf_data) { - return NULL; - } - ldns_write_uint16(rdf_data, value); - rdf = ldns_rdf_new(type, LDNS_RDF_SIZE_WORD, rdf_data); - if(!rdf) - LDNS_FREE(rdf_data); - return rdf; -} - -ldns_rdf * -ldns_native2rdf_int32(ldns_rdf_type type, uint32_t value) -{ - uint32_t *rdf_data = LDNS_XMALLOC(uint32_t, 1); - ldns_rdf* rdf; - if (!rdf_data) { - return NULL; - } - ldns_write_uint32(rdf_data, value); - rdf = ldns_rdf_new(type, LDNS_RDF_SIZE_DOUBLEWORD, rdf_data); - if(!rdf) - LDNS_FREE(rdf_data); - return rdf; -} - -ldns_rdf * -ldns_native2rdf_int16_data(size_t size, uint8_t *data) -{ - uint8_t *rdf_data = LDNS_XMALLOC(uint8_t, size + 2); - ldns_rdf* rdf; - if (!rdf_data) { - return NULL; - } - ldns_write_uint16(rdf_data, size); - memcpy(rdf_data + 2, data, size); - rdf = ldns_rdf_new(LDNS_RDF_TYPE_INT16_DATA, size + 2, rdf_data); - if(!rdf) - LDNS_FREE(rdf_data); - return rdf; -} - -/* note: data must be allocated memory */ -ldns_rdf * -ldns_rdf_new(ldns_rdf_type type, size_t size, void *data) -{ - ldns_rdf *rd; - rd = LDNS_MALLOC(ldns_rdf); - if (!rd) { - return NULL; - } - ldns_rdf_set_size(rd, size); - ldns_rdf_set_type(rd, type); - ldns_rdf_set_data(rd, data); - return rd; -} - -ldns_rdf * -ldns_rdf_new_frm_data(ldns_rdf_type type, size_t size, const void *data) -{ - ldns_rdf *rdf; - - /* if the size is too big, fail */ - if (size > LDNS_MAX_RDFLEN) { - return NULL; - } - - /* allocate space */ - rdf = LDNS_MALLOC(ldns_rdf); - if (!rdf) { - return NULL; - } - rdf->_data = LDNS_XMALLOC(uint8_t, size); - if (!rdf->_data) { - LDNS_FREE(rdf); - return NULL; - } - - /* set the values */ - ldns_rdf_set_type(rdf, type); - ldns_rdf_set_size(rdf, size); - memcpy(rdf->_data, data, size); - - return rdf; -} - -ldns_rdf * -ldns_rdf_clone(const ldns_rdf *rd) -{ - assert(rd != NULL); - return (ldns_rdf_new_frm_data( ldns_rdf_get_type(rd), - ldns_rdf_size(rd), ldns_rdf_data(rd))); -} - -void -ldns_rdf_deep_free(ldns_rdf *rd) -{ - if (rd) { - if (rd->_data) { - LDNS_FREE(rd->_data); - } - LDNS_FREE(rd); - } -} - -void -ldns_rdf_free(ldns_rdf *rd) -{ - if (rd) { - LDNS_FREE(rd); - } -} - -ldns_rdf * -ldns_rdf_new_frm_str(ldns_rdf_type type, const char *str) -{ - ldns_rdf *rdf = NULL; - ldns_status status; - - switch (type) { - case LDNS_RDF_TYPE_DNAME: - status = ldns_str2rdf_dname(&rdf, str); - break; - case LDNS_RDF_TYPE_INT8: - status = ldns_str2rdf_int8(&rdf, str); - break; - case LDNS_RDF_TYPE_INT16: - status = ldns_str2rdf_int16(&rdf, str); - break; - case LDNS_RDF_TYPE_INT32: - status = ldns_str2rdf_int32(&rdf, str); - break; - case LDNS_RDF_TYPE_A: - status = ldns_str2rdf_a(&rdf, str); - break; - case LDNS_RDF_TYPE_AAAA: - status = ldns_str2rdf_aaaa(&rdf, str); - break; - case LDNS_RDF_TYPE_STR: - status = ldns_str2rdf_str(&rdf, str); - break; - case LDNS_RDF_TYPE_APL: - status = ldns_str2rdf_apl(&rdf, str); - break; - case LDNS_RDF_TYPE_B64: - status = ldns_str2rdf_b64(&rdf, str); - break; - case LDNS_RDF_TYPE_B32_EXT: - status = ldns_str2rdf_b32_ext(&rdf, str); - break; - case LDNS_RDF_TYPE_HEX: - status = ldns_str2rdf_hex(&rdf, str); - break; - case LDNS_RDF_TYPE_NSEC: - status = ldns_str2rdf_nsec(&rdf, str); - break; - case LDNS_RDF_TYPE_TYPE: - status = ldns_str2rdf_type(&rdf, str); - break; - case LDNS_RDF_TYPE_CLASS: - status = ldns_str2rdf_class(&rdf, str); - break; - case LDNS_RDF_TYPE_CERT_ALG: - status = ldns_str2rdf_cert_alg(&rdf, str); - break; - case LDNS_RDF_TYPE_ALG: - status = ldns_str2rdf_alg(&rdf, str); - break; - case LDNS_RDF_TYPE_UNKNOWN: - status = ldns_str2rdf_unknown(&rdf, str); - break; - case LDNS_RDF_TYPE_TIME: - status = ldns_str2rdf_time(&rdf, str); - break; - case LDNS_RDF_TYPE_PERIOD: - status = ldns_str2rdf_period(&rdf, str); - break; - case LDNS_RDF_TYPE_HIP: - status = ldns_str2rdf_hip(&rdf, str); - break; - case LDNS_RDF_TYPE_SERVICE: - status = ldns_str2rdf_service(&rdf, str); - break; - case LDNS_RDF_TYPE_LOC: - status = ldns_str2rdf_loc(&rdf, str); - break; - case LDNS_RDF_TYPE_WKS: - status = ldns_str2rdf_wks(&rdf, str); - break; - case LDNS_RDF_TYPE_NSAP: - status = ldns_str2rdf_nsap(&rdf, str); - break; - case LDNS_RDF_TYPE_ATMA: - status = ldns_str2rdf_atma(&rdf, str); - break; - case LDNS_RDF_TYPE_IPSECKEY: - status = ldns_str2rdf_ipseckey(&rdf, str); - break; - case LDNS_RDF_TYPE_NSEC3_SALT: - status = ldns_str2rdf_nsec3_salt(&rdf, str); - break; - case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: - status = ldns_str2rdf_b32_ext(&rdf, str); - break; - case LDNS_RDF_TYPE_ILNP64: - status = ldns_str2rdf_ilnp64(&rdf, str); - break; - case LDNS_RDF_TYPE_EUI48: - status = ldns_str2rdf_eui48(&rdf, str); - break; - case LDNS_RDF_TYPE_EUI64: - status = ldns_str2rdf_eui64(&rdf, str); - break; - case LDNS_RDF_TYPE_TAG: - status = ldns_str2rdf_tag(&rdf, str); - break; - case LDNS_RDF_TYPE_LONG_STR: - status = ldns_str2rdf_long_str(&rdf, str); - break; - case LDNS_RDF_TYPE_CERTIFICATE_USAGE: - status = ldns_str2rdf_certificate_usage(&rdf, str); - break; - case LDNS_RDF_TYPE_SELECTOR: - status = ldns_str2rdf_selector(&rdf, str); - break; - case LDNS_RDF_TYPE_MATCHING_TYPE: - status = ldns_str2rdf_matching_type(&rdf, str); - break; - case LDNS_RDF_TYPE_AMTRELAY: - status = ldns_str2rdf_amtrelay(&rdf, str); - break; - case LDNS_RDF_TYPE_NONE: - default: - /* default default ??? */ - status = LDNS_STATUS_ERR; - break; - } - if (LDNS_STATUS_OK == status) { - ldns_rdf_set_type(rdf, type); - return rdf; - } - if (rdf) { - LDNS_FREE(rdf); - } - return NULL; -} - -ldns_status -ldns_rdf_new_frm_fp(ldns_rdf **rdf, ldns_rdf_type type, FILE *fp) -{ - return ldns_rdf_new_frm_fp_l(rdf, type, fp, NULL); -} - -ldns_status -ldns_rdf_new_frm_fp_l(ldns_rdf **rdf, ldns_rdf_type type, FILE *fp, int *line_nr) -{ - char *line; - ldns_rdf *r; - ssize_t t; - - line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - if (!line) { - return LDNS_STATUS_MEM_ERR; - } - - /* read an entire line in from the file */ - if ((t = ldns_fget_token_l(fp, line, LDNS_PARSE_SKIP_SPACE, 0, line_nr)) == -1 || t == 0) { - LDNS_FREE(line); - return LDNS_STATUS_SYNTAX_RDATA_ERR; - } - r = ldns_rdf_new_frm_str(type, (const char*) line); - LDNS_FREE(line); - if (rdf) { - *rdf = r; - return LDNS_STATUS_OK; - } else { - return LDNS_STATUS_NULL; - } -} - -ldns_rdf * -ldns_rdf_address_reverse(const ldns_rdf *rd) -{ - uint8_t buf_4[LDNS_IP4ADDRLEN]; - uint8_t buf_6[LDNS_IP6ADDRLEN * 2]; - ldns_rdf *rev; - ldns_rdf *in_addr; - ldns_rdf *ret_dname; - uint8_t octet; - uint8_t nnibble; - uint8_t nibble; - uint8_t i, j; - - char *char_dname; - int nbit; - - if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_A && - ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_AAAA) { - return NULL; - } - - in_addr = NULL; - ret_dname = NULL; - - switch(ldns_rdf_get_type(rd)) { - case LDNS_RDF_TYPE_A: - /* the length of the buffer is 4 */ - buf_4[3] = ldns_rdf_data(rd)[0]; - buf_4[2] = ldns_rdf_data(rd)[1]; - buf_4[1] = ldns_rdf_data(rd)[2]; - buf_4[0] = ldns_rdf_data(rd)[3]; - in_addr = ldns_dname_new_frm_str("in-addr.arpa."); - if (!in_addr) { - return NULL; - } - /* make a new rdf and convert that back */ - rev = ldns_rdf_new_frm_data( LDNS_RDF_TYPE_A, - LDNS_IP4ADDRLEN, (void*)&buf_4); - if (!rev) { - LDNS_FREE(in_addr); - return NULL; - } - - /* convert rev to a string */ - char_dname = ldns_rdf2str(rev); - if (!char_dname) { - LDNS_FREE(in_addr); - ldns_rdf_deep_free(rev); - return NULL; - } - /* transform back to rdf with type dname */ - ret_dname = ldns_dname_new_frm_str(char_dname); - if (!ret_dname) { - LDNS_FREE(in_addr); - ldns_rdf_deep_free(rev); - LDNS_FREE(char_dname); - return NULL; - } - /* not needed anymore */ - ldns_rdf_deep_free(rev); - LDNS_FREE(char_dname); - break; - case LDNS_RDF_TYPE_AAAA: - /* some foo magic to reverse the nibbles ... */ - - for (nbit = 127; nbit >= 0; nbit = nbit - 4) { - /* calculate octet (8 bit) */ - octet = ( ((unsigned int) nbit) & 0x78) >> 3; - /* calculate nibble */ - nnibble = ( ((unsigned int) nbit) & 0x04) >> 2; - /* extract nibble */ - nibble = (ldns_rdf_data(rd)[octet] & ( 0xf << (4 * (1 - - nnibble)) ) ) >> ( 4 * (1 - - nnibble)); - - buf_6[(LDNS_IP6ADDRLEN * 2 - 1) - - (octet * 2 + nnibble)] = - (uint8_t)ldns_int_to_hexdigit((int)nibble); - } - - char_dname = LDNS_XMALLOC(char, (LDNS_IP6ADDRLEN * 4)); - if (!char_dname) { - return NULL; - } - char_dname[LDNS_IP6ADDRLEN * 4 - 1] = '\0'; /* closure */ - - /* walk the string and add . 's */ - for (i = 0, j = 0; i < LDNS_IP6ADDRLEN * 2; i++, j = j + 2) { - char_dname[j] = (char)buf_6[i]; - if (i != LDNS_IP6ADDRLEN * 2 - 1) { - char_dname[j + 1] = '.'; - } - } - in_addr = ldns_dname_new_frm_str("ip6.arpa."); - if (!in_addr) { - LDNS_FREE(char_dname); - return NULL; - } - - /* convert rev to a string */ - ret_dname = ldns_dname_new_frm_str(char_dname); - LDNS_FREE(char_dname); - if (!ret_dname) { - ldns_rdf_deep_free(in_addr); - return NULL; - } - break; - default: - break; - } - /* add the suffix */ - rev = ldns_dname_cat_clone(ret_dname, in_addr); - - ldns_rdf_deep_free(ret_dname); - ldns_rdf_deep_free(in_addr); - return rev; -} - -ldns_status -ldns_rdf_hip_get_alg_hit_pk(ldns_rdf *rdf, uint8_t* alg, - uint8_t *hit_size, uint8_t** hit, - uint16_t *pk_size, uint8_t** pk) -{ - uint8_t *data; - size_t rdf_size; - - if (! rdf || ! alg || ! hit || ! hit_size || ! pk || ! pk_size) { - return LDNS_STATUS_INVALID_POINTER; - } else if (ldns_rdf_get_type(rdf) != LDNS_RDF_TYPE_HIP) { - return LDNS_STATUS_INVALID_RDF_TYPE; - } else if ((rdf_size = ldns_rdf_size(rdf)) < 6) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - data = ldns_rdf_data(rdf); - *hit_size = data[0]; - *alg = data[1]; - *pk_size = ldns_read_uint16(data + 2); - *hit = data + 4; - *pk = data + 4 + *hit_size; - if (*hit_size == 0 || *pk_size == 0 || - rdf_size < (size_t) *hit_size + *pk_size + 4) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_rdf_hip_new_frm_alg_hit_pk(ldns_rdf** rdf, uint8_t alg, - uint8_t hit_size, uint8_t *hit, - uint16_t pk_size, uint8_t *pk) -{ - uint8_t *data; - - if (! rdf) { - return LDNS_STATUS_INVALID_POINTER; - } - if (4 + hit_size + pk_size > LDNS_MAX_RDFLEN) { - return LDNS_STATUS_RDATA_OVERFLOW; - } - data = LDNS_XMALLOC(uint8_t, 4 + hit_size + pk_size); - if (data == NULL) { - return LDNS_STATUS_MEM_ERR; - } - data[0] = hit_size; - data[1] = alg; - ldns_write_uint16(data + 2, pk_size); - memcpy(data + 4, hit, hit_size); - memcpy(data + 4 + hit_size, pk, pk_size); - *rdf = ldns_rdf_new(LDNS_RDF_TYPE_HIP, 4 + hit_size + pk_size, data); - if (! *rdf) { - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_octet(char *word, size_t *length) -{ - char *s; - char *p; - *length = 0; - - for (s = p = word; *s != '\0'; s++,p++) { - switch (*s) { - case '.': - if (s[1] == '.') { - return LDNS_STATUS_EMPTY_LABEL; - } - *p = *s; - (*length)++; - break; - case '\\': - if ('0' <= s[1] && s[1] <= '9' && - '0' <= s[2] && s[2] <= '9' && - '0' <= s[3] && s[3] <= '9') { - /* \DDD seen */ - int val = ((s[1] - '0') * 100 + - (s[2] - '0') * 10 + (s[3] - '0')); - - if (0 <= val && val <= 255) { - /* this also handles \0 */ - s += 3; - *p = val; - (*length)++; - } else { - return LDNS_STATUS_DDD_OVERFLOW; - } - } else { - /* an espaced character, like \<space> ? - * remove the '\' keep the rest */ - *p = *++s; - (*length)++; - } - break; - case '\"': - /* non quoted " Is either first or the last character in - * the string */ - - *p = *++s; /* skip it */ - (*length)++; - /* I'm not sure if this is needed in libdns... MG */ - if ( *s == '\0' ) { - /* ok, it was the last one */ - *p = '\0'; - return LDNS_STATUS_OK; - } - break; - default: - *p = *s; - (*length)++; - break; - } - } - *p = '\0'; - return LDNS_STATUS_OK; -} - -int -ldns_rdf_compare(const ldns_rdf *rd1, const ldns_rdf *rd2) -{ - uint16_t i1, i2, i; - uint8_t *d1, *d2; - - /* only when both are not NULL we can say anything about them */ - if (!rd1 && !rd2) { - return 0; - } - if (!rd1 || !rd2) { - return -1; - } - i1 = ldns_rdf_size(rd1); - i2 = ldns_rdf_size(rd2); - - if (i1 < i2) { - return -1; - } else if (i1 > i2) { - return +1; - } else { - d1 = (uint8_t*)ldns_rdf_data(rd1); - d2 = (uint8_t*)ldns_rdf_data(rd2); - for(i = 0; i < i1; i++) { - if (d1[i] < d2[i]) { - return -1; - } else if (d1[i] > d2[i]) { - return +1; - } - } - } - return 0; -} - -uint32_t -ldns_str2period(const char *nptr, const char **endptr) -{ - int sign = 0; - uint32_t i = 0; - uint32_t seconds = 0; - - for(*endptr = nptr; **endptr; (*endptr)++) { - switch (**endptr) { - case ' ': - case '\t': - break; - case '-': - if(sign == 0) { - sign = -1; - } else { - return seconds; - } - break; - case '+': - if(sign == 0) { - sign = 1; - } else { - return seconds; - } - break; - case 's': - case 'S': - seconds += i; - i = 0; - break; - case 'm': - case 'M': - seconds += i * 60; - i = 0; - break; - case 'h': - case 'H': - seconds += i * 60 * 60; - i = 0; - break; - case 'd': - case 'D': - seconds += i * 60 * 60 * 24; - i = 0; - break; - case 'w': - case 'W': - seconds += i * 60 * 60 * 24 * 7; - i = 0; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - i *= 10; - i += (**endptr - '0'); - break; - default: - seconds += i; - /* disregard signedness */ - return seconds; - } - } - seconds += i; - /* disregard signedness */ - return seconds; -} diff --git a/ldns/resolver.c b/ldns/resolver.c deleted file mode 100644 index 84dfe95..0000000 --- a/ldns/resolver.c +++ /dev/null @@ -1,1598 +0,0 @@ -/* - * resolver.c - * - * resolver implementation - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> -#include <strings.h> - -/* Access function for reading - * and setting the different Resolver - * options */ - -/* read */ -uint16_t -ldns_resolver_port(const ldns_resolver *r) -{ - return r->_port; -} - -ldns_rdf * -ldns_resolver_source(const ldns_resolver *r) -{ - return r->_source; -} - -uint16_t -ldns_resolver_edns_udp_size(const ldns_resolver *r) -{ - return r->_edns_udp_size; -} - -uint8_t -ldns_resolver_retry(const ldns_resolver *r) -{ - return r->_retry; -} - -uint8_t -ldns_resolver_retrans(const ldns_resolver *r) -{ - return r->_retrans; -} - -bool -ldns_resolver_fallback(const ldns_resolver *r) -{ - return r->_fallback; -} - -uint8_t -ldns_resolver_ip6(const ldns_resolver *r) -{ - return r->_ip6; -} - -bool -ldns_resolver_recursive(const ldns_resolver *r) -{ - return r->_recursive; -} - -bool -ldns_resolver_debug(const ldns_resolver *r) -{ - return r->_debug; -} - -bool -ldns_resolver_dnsrch(const ldns_resolver *r) -{ - return r->_dnsrch; -} - -bool -ldns_resolver_fail(const ldns_resolver *r) -{ - return r->_fail; -} - -bool -ldns_resolver_defnames(const ldns_resolver *r) -{ - return r->_defnames; -} - -ldns_rdf * -ldns_resolver_domain(const ldns_resolver *r) -{ - return r->_domain; -} - -ldns_rdf ** -ldns_resolver_searchlist(const ldns_resolver *r) -{ - return r->_searchlist; -} - -ldns_rdf ** -ldns_resolver_nameservers(const ldns_resolver *r) -{ - return r->_nameservers; -} - -size_t -ldns_resolver_nameserver_count(const ldns_resolver *r) -{ - return r->_nameserver_count; -} - -bool -ldns_resolver_dnssec(const ldns_resolver *r) -{ - return r->_dnssec; -} - -bool -ldns_resolver_dnssec_cd(const ldns_resolver *r) -{ - return r->_dnssec_cd; -} - -ldns_rr_list * -ldns_resolver_dnssec_anchors(const ldns_resolver *r) -{ - return r->_dnssec_anchors; -} - -bool -ldns_resolver_trusted_key(const ldns_resolver *r, ldns_rr_list * keys, ldns_rr_list * trusted_keys) -{ - size_t i; - bool result = false; - - ldns_rr_list * trust_anchors; - ldns_rr * cur_rr; - - if (!r || !keys) { return false; } - - trust_anchors = ldns_resolver_dnssec_anchors(r); - - if (!trust_anchors) { return false; } - - for (i = 0; i < ldns_rr_list_rr_count(keys); i++) { - - cur_rr = ldns_rr_list_rr(keys, i); - if (ldns_rr_list_contains_rr(trust_anchors, cur_rr)) { - if (trusted_keys) { ldns_rr_list_push_rr(trusted_keys, cur_rr); } - result = true; - } - } - - return result; -} - -bool -ldns_resolver_igntc(const ldns_resolver *r) -{ - return r->_igntc; -} - -bool -ldns_resolver_usevc(const ldns_resolver *r) -{ - return r->_usevc; -} - -size_t * -ldns_resolver_rtt(const ldns_resolver *r) -{ - return r->_rtt; -} - -size_t -ldns_resolver_nameserver_rtt(const ldns_resolver *r, size_t pos) -{ - size_t *rtt; - - assert(r != NULL); - - rtt = ldns_resolver_rtt(r); - - if (pos >= ldns_resolver_nameserver_count(r)) { - /* error ?*/ - return 0; - } else { - return rtt[pos]; - } - -} - -struct timeval -ldns_resolver_timeout(const ldns_resolver *r) -{ - return r->_timeout; -} - -const char * -ldns_resolver_tsig_keyname(const ldns_resolver *r) -{ - return r->_tsig_keyname; -} - -const char * -ldns_resolver_tsig_algorithm(const ldns_resolver *r) -{ - return r->_tsig_algorithm; -} - -const char * -ldns_resolver_tsig_keydata(const ldns_resolver *r) -{ - return r->_tsig_keydata; -} - -bool -ldns_resolver_random(const ldns_resolver *r) -{ - return r->_random; -} - -size_t -ldns_resolver_searchlist_count(const ldns_resolver *r) -{ - return r->_searchlist_count; -} - -/* write */ -void -ldns_resolver_set_port(ldns_resolver *r, uint16_t p) -{ - r->_port = p; -} - -void -ldns_resolver_set_source(ldns_resolver *r, ldns_rdf *s) -{ - r->_source = s; -} - -ldns_rdf * -ldns_resolver_pop_nameserver(ldns_resolver *r) -{ - ldns_rdf **nameservers; - ldns_rdf *pop; - size_t ns_count; - size_t *rtt; - - assert(r != NULL); - - ns_count = ldns_resolver_nameserver_count(r); - nameservers = ldns_resolver_nameservers(r); - rtt = ldns_resolver_rtt(r); - if (ns_count == 0 || !nameservers) { - return NULL; - } - - pop = nameservers[ns_count - 1]; - - if (ns_count == 1) { - LDNS_FREE(nameservers); - LDNS_FREE(rtt); - - ldns_resolver_set_nameservers(r, NULL); - ldns_resolver_set_rtt(r, NULL); - } else { - nameservers = LDNS_XREALLOC(nameservers, ldns_rdf *, - (ns_count - 1)); - rtt = LDNS_XREALLOC(rtt, size_t, (ns_count - 1)); - - ldns_resolver_set_nameservers(r, nameservers); - ldns_resolver_set_rtt(r, rtt); - } - /* decr the count */ - ldns_resolver_dec_nameserver_count(r); - return pop; -} - -ldns_status -ldns_resolver_push_nameserver(ldns_resolver *r, const ldns_rdf *n) -{ - ldns_rdf **nameservers; - size_t ns_count; - size_t *rtt; - - if (ldns_rdf_get_type(n) != LDNS_RDF_TYPE_A && - ldns_rdf_get_type(n) != LDNS_RDF_TYPE_AAAA) { - return LDNS_STATUS_ERR; - } - - ns_count = ldns_resolver_nameserver_count(r); - nameservers = ldns_resolver_nameservers(r); - rtt = ldns_resolver_rtt(r); - - /* make room for the next one */ - if (ns_count == 0) { - nameservers = LDNS_XMALLOC(ldns_rdf *, 1); - } else { - nameservers = LDNS_XREALLOC(nameservers, ldns_rdf *, (ns_count + 1)); - } - if(!nameservers) - return LDNS_STATUS_MEM_ERR; - - /* set the new value in the resolver */ - ldns_resolver_set_nameservers(r, nameservers); - - /* don't forget the rtt */ - if (ns_count == 0) { - rtt = LDNS_XMALLOC(size_t, 1); - } else { - rtt = LDNS_XREALLOC(rtt, size_t, (ns_count + 1)); - } - if(!rtt) - return LDNS_STATUS_MEM_ERR; - - /* slide n in its slot. */ - /* we clone it here, because then we can free the original - * rr's where it stood */ - nameservers[ns_count] = ldns_rdf_clone(n); - rtt[ns_count] = LDNS_RESOLV_RTT_MIN; - ldns_resolver_incr_nameserver_count(r); - ldns_resolver_set_rtt(r, rtt); - return LDNS_STATUS_OK; -} - -ldns_status -ldns_resolver_push_nameserver_rr(ldns_resolver *r, const ldns_rr *rr) -{ - ldns_rdf *address; - if ((!rr) || (ldns_rr_get_type(rr) != LDNS_RR_TYPE_A && - ldns_rr_get_type(rr) != LDNS_RR_TYPE_AAAA)) { - return LDNS_STATUS_ERR; - } - address = ldns_rr_rdf(rr, 0); /* extract the ip number */ - if (address) { - return ldns_resolver_push_nameserver(r, address); - } else { - return LDNS_STATUS_ERR; - } -} - -ldns_status -ldns_resolver_push_nameserver_rr_list(ldns_resolver *r, const ldns_rr_list *rrlist) -{ - ldns_rr *rr; - ldns_status stat; - size_t i; - - stat = LDNS_STATUS_OK; - if (rrlist) { - for(i = 0; i < ldns_rr_list_rr_count(rrlist); i++) { - rr = ldns_rr_list_rr(rrlist, i); - if (ldns_resolver_push_nameserver_rr(r, rr) != LDNS_STATUS_OK) { - stat = LDNS_STATUS_ERR; - break; - } - } - return stat; - } else { - return LDNS_STATUS_ERR; - } -} - -void -ldns_resolver_set_edns_udp_size(ldns_resolver *r, uint16_t s) -{ - r->_edns_udp_size = s; -} - -void -ldns_resolver_set_recursive(ldns_resolver *r, bool re) -{ - r->_recursive = re; -} - -void -ldns_resolver_set_dnssec(ldns_resolver *r, bool d) -{ - r->_dnssec = d; -} - -void -ldns_resolver_set_dnssec_cd(ldns_resolver *r, bool d) -{ - r->_dnssec_cd = d; -} - -void -ldns_resolver_set_dnssec_anchors(ldns_resolver *r, ldns_rr_list * l) -{ - r->_dnssec_anchors = l; -} - -ldns_status -ldns_resolver_push_dnssec_anchor(ldns_resolver *r, ldns_rr *rr) -{ - ldns_rr_list * trust_anchors; - - if ((!rr) || (ldns_rr_get_type(rr) != LDNS_RR_TYPE_DNSKEY && - ldns_rr_get_type(rr) != LDNS_RR_TYPE_DS)) { - - return LDNS_STATUS_ERR; - } - - if (!(trust_anchors = ldns_resolver_dnssec_anchors(r))) { /* Initialize */ - trust_anchors = ldns_rr_list_new(); - ldns_resolver_set_dnssec_anchors(r, trust_anchors); - } - - return (ldns_rr_list_push_rr(trust_anchors, ldns_rr_clone(rr))) ? LDNS_STATUS_OK : LDNS_STATUS_ERR; -} - -void -ldns_resolver_set_igntc(ldns_resolver *r, bool i) -{ - r->_igntc = i; -} - -void -ldns_resolver_set_usevc(ldns_resolver *r, bool vc) -{ - r->_usevc = vc; -} - -void -ldns_resolver_set_debug(ldns_resolver *r, bool d) -{ - r->_debug = d; -} - -void -ldns_resolver_set_ip6(ldns_resolver *r, uint8_t ip6) -{ - r->_ip6 = ip6; -} - -void -ldns_resolver_set_fail(ldns_resolver *r, bool f) -{ - r->_fail =f; -} - -static void -ldns_resolver_set_searchlist_count(ldns_resolver *r, size_t c) -{ - r->_searchlist_count = c; -} - -void -ldns_resolver_set_nameserver_count(ldns_resolver *r, size_t c) -{ - r->_nameserver_count = c; -} - -void -ldns_resolver_set_dnsrch(ldns_resolver *r, bool d) -{ - r->_dnsrch = d; -} - -void -ldns_resolver_set_retry(ldns_resolver *r, uint8_t retry) -{ - r->_retry = retry; -} - -void -ldns_resolver_set_retrans(ldns_resolver *r, uint8_t retrans) -{ - r->_retrans = retrans; -} - -void -ldns_resolver_set_fallback(ldns_resolver *r, bool fallback) -{ - r->_fallback = fallback; -} - -void -ldns_resolver_set_nameservers(ldns_resolver *r, ldns_rdf **n) -{ - r->_nameservers = n; -} - -void -ldns_resolver_set_defnames(ldns_resolver *r, bool d) -{ - r->_defnames = d; -} - -void -ldns_resolver_set_rtt(ldns_resolver *r, size_t *rtt) -{ - r->_rtt = rtt; -} - -void -ldns_resolver_set_nameserver_rtt(ldns_resolver *r, size_t pos, size_t value) -{ - size_t *rtt; - - assert(r != NULL); - - rtt = ldns_resolver_rtt(r); - - if (pos >= ldns_resolver_nameserver_count(r)) { - /* error ?*/ - } else { - rtt[pos] = value; - } - -} - -void -ldns_resolver_incr_nameserver_count(ldns_resolver *r) -{ - size_t c; - - c = ldns_resolver_nameserver_count(r); - ldns_resolver_set_nameserver_count(r, ++c); -} - -void -ldns_resolver_dec_nameserver_count(ldns_resolver *r) -{ - size_t c; - - c = ldns_resolver_nameserver_count(r); - if (c == 0) { - return; - } else { - ldns_resolver_set_nameserver_count(r, --c); - } -} - -void -ldns_resolver_set_domain(ldns_resolver *r, ldns_rdf *d) -{ - r->_domain = d; -} - -void -ldns_resolver_set_timeout(ldns_resolver *r, struct timeval timeout) -{ - r->_timeout.tv_sec = timeout.tv_sec; - r->_timeout.tv_usec = timeout.tv_usec; -} - -void -ldns_resolver_push_searchlist(ldns_resolver *r, ldns_rdf *d) -{ - ldns_rdf **searchlist; - size_t list_count; - - if (ldns_rdf_get_type(d) != LDNS_RDF_TYPE_DNAME) { - return; - } - - list_count = ldns_resolver_searchlist_count(r); - searchlist = ldns_resolver_searchlist(r); - - searchlist = LDNS_XREALLOC(searchlist, ldns_rdf *, (list_count + 1)); - if (searchlist) { - r->_searchlist = searchlist; - - searchlist[list_count] = ldns_rdf_clone(d); - ldns_resolver_set_searchlist_count(r, list_count + 1); - } /* no way to report mem err */ -} - -void -ldns_resolver_set_tsig_keyname(ldns_resolver *r, const char *tsig_keyname) -{ - LDNS_FREE(r->_tsig_keyname); - r->_tsig_keyname = strdup(tsig_keyname); -} - -void -ldns_resolver_set_tsig_algorithm(ldns_resolver *r, const char *tsig_algorithm) -{ - LDNS_FREE(r->_tsig_algorithm); - r->_tsig_algorithm = strdup(tsig_algorithm); -} - -void -ldns_resolver_set_tsig_keydata(ldns_resolver *r, const char *tsig_keydata) -{ - LDNS_FREE(r->_tsig_keydata); - r->_tsig_keydata = strdup(tsig_keydata); -} - -void -ldns_resolver_set_random(ldns_resolver *r, bool b) -{ - r->_random = b; -} - -/* more sophisticated functions */ -ldns_resolver * -ldns_resolver_new(void) -{ - ldns_resolver *r; - - r = LDNS_MALLOC(ldns_resolver); - if (!r) { - return NULL; - } - - r->_searchlist = NULL; - r->_nameservers = NULL; - r->_rtt = NULL; - - /* defaults are filled out */ - ldns_resolver_set_searchlist_count(r, 0); - ldns_resolver_set_nameserver_count(r, 0); - ldns_resolver_set_usevc(r, 0); - ldns_resolver_set_port(r, LDNS_PORT); - ldns_resolver_set_domain(r, NULL); - ldns_resolver_set_defnames(r, false); - ldns_resolver_set_retry(r, 3); - ldns_resolver_set_retrans(r, 2); - ldns_resolver_set_fallback(r, true); - ldns_resolver_set_fail(r, false); - ldns_resolver_set_edns_udp_size(r, 0); - ldns_resolver_set_dnssec(r, false); - ldns_resolver_set_dnssec_cd(r, false); - ldns_resolver_set_dnssec_anchors(r, NULL); - ldns_resolver_set_ip6(r, LDNS_RESOLV_INETANY); - ldns_resolver_set_igntc(r, false); - ldns_resolver_set_recursive(r, false); - ldns_resolver_set_dnsrch(r, true); - ldns_resolver_set_source(r, NULL); - ldns_resolver_set_ixfr_serial(r, 0); - - /* randomize the nameserver to be queried - * when there are multiple - */ - ldns_resolver_set_random(r, true); - - ldns_resolver_set_debug(r, 0); - - r->_timeout.tv_sec = LDNS_DEFAULT_TIMEOUT_SEC; - r->_timeout.tv_usec = LDNS_DEFAULT_TIMEOUT_USEC; - - r->_socket = -1; - r->_axfr_soa_count = 0; - r->_axfr_i = 0; - r->_cur_axfr_pkt = NULL; - - r->_tsig_keyname = NULL; - r->_tsig_keydata = NULL; - r->_tsig_algorithm = NULL; - return r; -} - -ldns_resolver * -ldns_resolver_clone(ldns_resolver *src) -{ - ldns_resolver *dst; - size_t i; - - assert(src != NULL); - - if (!(dst = LDNS_MALLOC(ldns_resolver))) return NULL; - (void) memcpy(dst, src, sizeof(ldns_resolver)); - - if (dst->_searchlist_count == 0) - dst->_searchlist = NULL; - else { - if (!(dst->_searchlist = - LDNS_XMALLOC(ldns_rdf *, dst->_searchlist_count))) - goto error; - for (i = 0; i < dst->_searchlist_count; i++) - if (!(dst->_searchlist[i] = - ldns_rdf_clone(src->_searchlist[i]))) { - dst->_searchlist_count = i; - goto error_searchlist; - } - } - if (dst->_nameserver_count == 0) { - dst->_nameservers = NULL; - dst->_rtt = NULL; - } else { - if (!(dst->_nameservers = - LDNS_XMALLOC(ldns_rdf *, dst->_nameserver_count))) - goto error_searchlist; - for (i = 0; i < dst->_nameserver_count; i++) - if (!(dst->_nameservers[i] = - ldns_rdf_clone(src->_nameservers[i]))) { - dst->_nameserver_count = i; - goto error_nameservers; - } - if (!(dst->_rtt = - LDNS_XMALLOC(size_t, dst->_nameserver_count))) - goto error_nameservers; - (void) memcpy(dst->_rtt, src->_rtt, - sizeof(size_t) * dst->_nameserver_count); - } - if (dst->_domain && (!(dst->_domain = ldns_rdf_clone(src->_domain)))) - goto error_rtt; - - if (dst->_tsig_keyname && - (!(dst->_tsig_keyname = strdup(src->_tsig_keyname)))) - goto error_domain; - - if (dst->_tsig_keydata && - (!(dst->_tsig_keydata = strdup(src->_tsig_keydata)))) - goto error_tsig_keyname; - - if (dst->_tsig_algorithm && - (!(dst->_tsig_algorithm = strdup(src->_tsig_algorithm)))) - goto error_tsig_keydata; - - if (dst->_cur_axfr_pkt && - (!(dst->_cur_axfr_pkt = ldns_pkt_clone(src->_cur_axfr_pkt)))) - goto error_tsig_algorithm; - - if (dst->_dnssec_anchors && - (!(dst->_dnssec_anchors=ldns_rr_list_clone(src->_dnssec_anchors)))) - goto error_cur_axfr_pkt; - - return dst; - -error_cur_axfr_pkt: - ldns_pkt_free(dst->_cur_axfr_pkt); -error_tsig_algorithm: - LDNS_FREE(dst->_tsig_algorithm); -error_tsig_keydata: - LDNS_FREE(dst->_tsig_keydata); -error_tsig_keyname: - LDNS_FREE(dst->_tsig_keyname); -error_domain: - ldns_rdf_deep_free(dst->_domain); -error_rtt: - LDNS_FREE(dst->_rtt); -error_nameservers: - for (i = 0; i < dst->_nameserver_count; i++) - ldns_rdf_deep_free(dst->_nameservers[i]); - LDNS_FREE(dst->_nameservers); -error_searchlist: - for (i = 0; i < dst->_searchlist_count; i++) - ldns_rdf_deep_free(dst->_searchlist[i]); - LDNS_FREE(dst->_searchlist); -error: - LDNS_FREE(dst); - return NULL; -} - - -ldns_status -ldns_resolver_new_frm_fp(ldns_resolver **res, FILE *fp) -{ - return ldns_resolver_new_frm_fp_l(res, fp, NULL); -} - -ldns_status -ldns_resolver_new_frm_fp_l(ldns_resolver **res, FILE *fp, int *line_nr) -{ - ldns_resolver *r = NULL; - const char *keyword[LDNS_RESOLV_KEYWORDS]; - char word[LDNS_MAX_LINELEN + 1]; - int8_t expect; - uint8_t i; - ldns_rdf *tmp; -#ifdef HAVE_SSL - ldns_rr *tmp_rr; -#endif - ssize_t gtr, bgtr; - ldns_buffer *b; - int lnr = 0, oldline; - FILE* myfp = fp; - if(!line_nr) line_nr = &lnr; - - if(!fp) { - myfp = fopen("/etc/resolv.conf", "r"); - if(!myfp) - return LDNS_STATUS_FILE_ERR; - } - - /* do this better - * expect = - * 0: keyword - * 1: default domain dname - * 2: NS aaaa or a record - */ - - /* recognized keywords */ - keyword[LDNS_RESOLV_NAMESERVER] = "nameserver"; - keyword[LDNS_RESOLV_DEFDOMAIN] = "domain"; - keyword[LDNS_RESOLV_SEARCH] = "search"; - /* these two are read but not used atm TODO */ - keyword[LDNS_RESOLV_SORTLIST] = "sortlist"; - keyword[LDNS_RESOLV_OPTIONS] = "options"; - keyword[LDNS_RESOLV_ANCHOR] = "anchor"; - - r = ldns_resolver_new(); - if (!r) { - if(!fp) fclose(myfp); - return LDNS_STATUS_MEM_ERR; - } - - gtr = 1; - word[0] = 0; - oldline = *line_nr; - expect = LDNS_RESOLV_KEYWORD; - while (gtr > 0) { - /* check comments */ - if (word[0] == '#') { - word[0]='x'; - if(oldline == *line_nr) { - /* skip until end of line */ - int c; - do { - c = fgetc(myfp); - } while(c != EOF && c != '\n'); - if(c=='\n') (*line_nr)++; - } - /* and read next to prepare for further parsing */ - oldline = *line_nr; - continue; - } - oldline = *line_nr; - switch(expect) { - case LDNS_RESOLV_KEYWORD: - /* keyword */ - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr); - if (gtr != 0) { - if(word[0] == '#') continue; - for(i = 0; i < LDNS_RESOLV_KEYWORDS; i++) { - if (strcasecmp(keyword[i], word) == 0) { - /* chosen the keyword and - * expect values carefully - */ - expect = i; - break; - } - } - /* no keyword recognized */ - if (expect == LDNS_RESOLV_KEYWORD) { - /* skip line */ - /* - ldns_resolver_deep_free(r); - if(!fp) fclose(myfp); - return LDNS_STATUS_SYNTAX_KEYWORD_ERR; - */ - } - } - break; - case LDNS_RESOLV_DEFDOMAIN: - /* default domain dname */ - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr); - if (gtr == 0) { - if(!fp) fclose(myfp); - ldns_resolver_deep_free(r); - return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; - } - if(word[0] == '#') { - expect = LDNS_RESOLV_KEYWORD; - continue; - } - tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word); - if (!tmp) { - if(!fp) fclose(myfp); - ldns_resolver_deep_free(r); - return LDNS_STATUS_SYNTAX_DNAME_ERR; - } - - /* DOn't free, because we copy the pointer */ - ldns_resolver_set_domain(r, tmp); - expect = LDNS_RESOLV_KEYWORD; - break; - case LDNS_RESOLV_NAMESERVER: - /* NS aaaa or a record */ - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr); - if (gtr == 0) { - if(!fp) fclose(myfp); - ldns_resolver_deep_free(r); - return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; - } - if(word[0] == '#') { - expect = LDNS_RESOLV_KEYWORD; - continue; - } - if(strchr(word, '%')) { - /* snip off interface labels, - * fe80::222:19ff:fe31:4222%eth0 */ - strchr(word, '%')[0]=0; - } - tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_AAAA, word); - if (!tmp) { - /* try ip4 */ - tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_A, word); - } - /* could not parse it, exit */ - if (!tmp) { - ldns_resolver_deep_free(r); - if(!fp) fclose(myfp); - return LDNS_STATUS_SYNTAX_ERR; - } - (void)ldns_resolver_push_nameserver(r, tmp); - ldns_rdf_deep_free(tmp); - expect = LDNS_RESOLV_KEYWORD; - break; - case LDNS_RESOLV_SEARCH: - /* search list domain dname */ - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr); - b = LDNS_MALLOC(ldns_buffer); - if(!b) { - ldns_resolver_deep_free(r); - if(!fp) fclose(myfp); - return LDNS_STATUS_MEM_ERR; - } - - ldns_buffer_new_frm_data(b, word, (size_t) gtr); - if(ldns_buffer_status(b) != LDNS_STATUS_OK) { - LDNS_FREE(b); - ldns_resolver_deep_free(r); - if(!fp) fclose(myfp); - return LDNS_STATUS_MEM_ERR; - } - bgtr = ldns_bget_token(b, word, LDNS_PARSE_NORMAL, (size_t) gtr + 1); - while (bgtr > 0) { - gtr -= bgtr; - if(word[0] == '#') { - expect = LDNS_RESOLV_KEYWORD; - break; - } - tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, word); - if (!tmp) { - ldns_resolver_deep_free(r); - ldns_buffer_free(b); - if(!fp) fclose(myfp); - return LDNS_STATUS_SYNTAX_DNAME_ERR; - } - - ldns_resolver_push_searchlist(r, tmp); - - ldns_rdf_deep_free(tmp); - bgtr = ldns_bget_token(b, word, LDNS_PARSE_NORMAL, - (size_t) gtr + 1); - } - ldns_buffer_free(b); - if (expect != LDNS_RESOLV_KEYWORD) { - gtr = 1; - expect = LDNS_RESOLV_KEYWORD; - } - break; - case LDNS_RESOLV_SORTLIST: - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr); - /* sortlist not implemented atm */ - expect = LDNS_RESOLV_KEYWORD; - break; - case LDNS_RESOLV_OPTIONS: - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_SKIP_SPACE, 0, line_nr); - /* options not implemented atm */ - expect = LDNS_RESOLV_KEYWORD; - break; - case LDNS_RESOLV_ANCHOR: - /* a file containing a DNSSEC trust anchor */ - gtr = ldns_fget_token_l(myfp, word, LDNS_PARSE_NORMAL, 0, line_nr); - if (gtr == 0) { - ldns_resolver_deep_free(r); - if(!fp) fclose(myfp); - return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; - } - if(word[0] == '#') { - expect = LDNS_RESOLV_KEYWORD; - continue; - } - -#ifdef HAVE_SSL - tmp_rr = ldns_read_anchor_file(word); - (void) ldns_resolver_push_dnssec_anchor(r, tmp_rr); - ldns_rr_free(tmp_rr); -#endif - expect = LDNS_RESOLV_KEYWORD; - break; - } - } - - if(!fp) - fclose(myfp); - - if (res) { - *res = r; - return LDNS_STATUS_OK; - } else { - ldns_resolver_deep_free(r); - return LDNS_STATUS_NULL; - } -} - -ldns_status -ldns_resolver_new_frm_file(ldns_resolver **res, const char *filename) -{ - ldns_resolver *r; - FILE *fp; - ldns_status s; - - if (!filename) { - fp = fopen(LDNS_RESOLV_CONF, "r"); - - } else { - fp = fopen(filename, "r"); - } - if (!fp) { - return LDNS_STATUS_FILE_ERR; - } - - s = ldns_resolver_new_frm_fp(&r, fp); - fclose(fp); - if (s == LDNS_STATUS_OK) { - if (res) { - *res = r; - return LDNS_STATUS_OK; - } else { - ldns_resolver_free(r); - return LDNS_STATUS_NULL; - } - } - return s; -} - -void -ldns_resolver_free(ldns_resolver *res) -{ - LDNS_FREE(res); -} - -void -ldns_resolver_deep_free(ldns_resolver *res) -{ - size_t i; - - if (res) { - close_socket(res->_socket); - - if (res->_searchlist) { - for (i = 0; i < ldns_resolver_searchlist_count(res); i++) { - ldns_rdf_deep_free(res->_searchlist[i]); - } - LDNS_FREE(res->_searchlist); - } - if (res->_nameservers) { - for (i = 0; i < res->_nameserver_count; i++) { - ldns_rdf_deep_free(res->_nameservers[i]); - } - LDNS_FREE(res->_nameservers); - } - if (ldns_resolver_domain(res)) { - ldns_rdf_deep_free(ldns_resolver_domain(res)); - } - if (res->_tsig_keyname) { - LDNS_FREE(res->_tsig_keyname); - } - if (res->_tsig_keydata) { - LDNS_FREE(res->_tsig_keydata); - } - if (res->_tsig_algorithm) { - LDNS_FREE(res->_tsig_algorithm); - } - - if (res->_cur_axfr_pkt) { - ldns_pkt_free(res->_cur_axfr_pkt); - } - - if (res->_rtt) { - LDNS_FREE(res->_rtt); - } - if (res->_dnssec_anchors) { - ldns_rr_list_deep_free(res->_dnssec_anchors); - } - LDNS_FREE(res); - } -} - -ldns_status -ldns_resolver_search_status(ldns_pkt** pkt, - ldns_resolver *r, const ldns_rdf *name, - ldns_rr_type t, ldns_rr_class c, uint16_t flags) -{ - ldns_rdf *new_name; - ldns_rdf **search_list; - size_t i; - ldns_status s = LDNS_STATUS_OK; - ldns_rdf root_dname = { 1, LDNS_RDF_TYPE_DNAME, (void *)"" }; - - if (ldns_dname_absolute(name)) { - /* query as-is */ - return ldns_resolver_query_status(pkt, r, name, t, c, flags); - } else if (ldns_resolver_dnsrch(r)) { - search_list = ldns_resolver_searchlist(r); - for (i = 0; i <= ldns_resolver_searchlist_count(r); i++) { - if (i == ldns_resolver_searchlist_count(r)) { - new_name = ldns_dname_cat_clone(name, - &root_dname); - } else { - new_name = ldns_dname_cat_clone(name, - search_list[i]); - } - - s = ldns_resolver_query_status(pkt, r, - new_name, t, c, flags); - ldns_rdf_deep_free(new_name); - - if (pkt && *pkt) { - if (s == LDNS_STATUS_OK && - ldns_pkt_get_rcode(*pkt) == - LDNS_RCODE_NOERROR) { - - return LDNS_STATUS_OK; - } - ldns_pkt_free(*pkt); - *pkt = NULL; - } - } - } - return s; -} - -ldns_pkt * -ldns_resolver_search(const ldns_resolver *r,const ldns_rdf *name, - ldns_rr_type t, ldns_rr_class c, uint16_t flags) -{ - ldns_pkt* pkt = NULL; - if (ldns_resolver_search_status(&pkt, (ldns_resolver *)r, - name, t, c, flags) != LDNS_STATUS_OK) { - ldns_pkt_free(pkt); - return NULL; - } - return pkt; -} - -ldns_status -ldns_resolver_query_status(ldns_pkt** pkt, - ldns_resolver *r, const ldns_rdf *name, - ldns_rr_type t, ldns_rr_class c, uint16_t flags) -{ - ldns_rdf *newname; - ldns_status status; - - if (!ldns_resolver_defnames(r) || !ldns_resolver_domain(r)) { - return ldns_resolver_send(pkt, r, name, t, c, flags); - } - - newname = ldns_dname_cat_clone(name, ldns_resolver_domain(r)); - if (!newname) { - return LDNS_STATUS_MEM_ERR; - } - status = ldns_resolver_send(pkt, r, newname, t, c, flags); - ldns_rdf_free(newname); - return status; -} - -ldns_pkt * -ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, - ldns_rr_type t, ldns_rr_class c, uint16_t flags) -{ - ldns_pkt* pkt = NULL; - if (ldns_resolver_query_status(&pkt, (ldns_resolver *)r, - name, t, c, flags) != LDNS_STATUS_OK) { - ldns_pkt_free(pkt); - return NULL; - } - return pkt; -} - -static size_t * -ldns_resolver_backup_rtt(ldns_resolver *r) -{ - size_t *new_rtt; - size_t *old_rtt = ldns_resolver_rtt(r); - - if (old_rtt && ldns_resolver_nameserver_count(r)) { - new_rtt = LDNS_XMALLOC(size_t - , ldns_resolver_nameserver_count(r)); - if (!new_rtt) return NULL; - memcpy(new_rtt, old_rtt, sizeof(size_t) - * ldns_resolver_nameserver_count(r)); - ldns_resolver_set_rtt(r, new_rtt); - return old_rtt; - } - return NULL; -} - -static void -ldns_resolver_restore_rtt(ldns_resolver *r, size_t *old_rtt) -{ - size_t *cur_rtt = ldns_resolver_rtt(r); - - if (cur_rtt) { - LDNS_FREE(cur_rtt); - } - ldns_resolver_set_rtt(r, old_rtt); -} - -ldns_status -ldns_resolver_send_pkt(ldns_pkt **answer, ldns_resolver *r, - ldns_pkt *query_pkt) -{ - ldns_pkt *answer_pkt = NULL; - ldns_status stat = LDNS_STATUS_OK; - size_t *rtt; - - stat = ldns_send(&answer_pkt, (ldns_resolver *)r, query_pkt); - if (stat != LDNS_STATUS_OK) { - if(answer_pkt) { - ldns_pkt_free(answer_pkt); - answer_pkt = NULL; - } - } else { - /* if tc=1 fall back to EDNS and/or TCP */ - /* check for tcp first (otherwise we don't care about tc=1) */ - if (!ldns_resolver_usevc(r) && ldns_resolver_fallback(r)) { - if (ldns_pkt_tc(answer_pkt)) { - /* was EDNS0 set? */ - if (ldns_pkt_edns_udp_size(query_pkt) == 0) { - ldns_pkt_set_edns_udp_size(query_pkt - , 4096); - ldns_pkt_free(answer_pkt); - answer_pkt = NULL; - /* Nameservers should not become - * unreachable because fragments are - * dropped (network error). We might - * still have success with TCP. - * Therefore maintain reachability - * statuses of the nameservers by - * backup and restore the rtt list. - */ - rtt = ldns_resolver_backup_rtt(r); - stat = ldns_send(&answer_pkt, r - , query_pkt); - ldns_resolver_restore_rtt(r, rtt); - } - /* either way, if it is still truncated, use TCP */ - if (stat != LDNS_STATUS_OK || - ldns_pkt_tc(answer_pkt)) { - ldns_resolver_set_usevc(r, true); - ldns_pkt_free(answer_pkt); - answer_pkt = NULL; - stat = ldns_send(&answer_pkt, r, query_pkt); - ldns_resolver_set_usevc(r, false); - } - } - } - } - - if (answer && answer_pkt) { - *answer = answer_pkt; - } - - return stat; -} - -ldns_status -ldns_resolver_prepare_query_pkt(ldns_pkt **query_pkt, ldns_resolver *r, - const ldns_rdf *name, ldns_rr_type t, - ldns_rr_class c, uint16_t flags) -{ - struct timeval now; - ldns_rr* soa = NULL; - - /* prepare a question pkt from the parameters - * and then send this */ - if (t == LDNS_RR_TYPE_IXFR) { - ldns_rdf *owner_rdf; - ldns_rdf *mname_rdf; - ldns_rdf *rname_rdf; - ldns_rdf *serial_rdf; - ldns_rdf *refresh_rdf; - ldns_rdf *retry_rdf; - ldns_rdf *expire_rdf; - ldns_rdf *minimum_rdf; - soa = ldns_rr_new(); - - if (!soa) { - return LDNS_STATUS_ERR; - } - owner_rdf = ldns_rdf_clone(name); - if (!owner_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } - ldns_rr_set_owner(soa, owner_rdf); - ldns_rr_set_type(soa, LDNS_RR_TYPE_SOA); - ldns_rr_set_class(soa, c); - ldns_rr_set_question(soa, false); - if (ldns_str2rdf_dname(&mname_rdf, ".") != LDNS_STATUS_OK) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, mname_rdf); - if (ldns_str2rdf_dname(&rname_rdf, ".") != LDNS_STATUS_OK) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, rname_rdf); - serial_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, ldns_resolver_get_ixfr_serial(r)); - if (!serial_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, serial_rdf); - refresh_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!refresh_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, refresh_rdf); - retry_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!retry_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, retry_rdf); - expire_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!expire_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, expire_rdf); - minimum_rdf = ldns_native2rdf_int32(LDNS_RDF_TYPE_INT32, 0); - if (!minimum_rdf) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } else ldns_rr_push_rdf(soa, minimum_rdf); - - *query_pkt = ldns_pkt_ixfr_request_new(ldns_rdf_clone(name), - c, flags, soa); - } else { - *query_pkt = ldns_pkt_query_new(ldns_rdf_clone(name), t, c, flags); - } - if (!*query_pkt) { - ldns_rr_free(soa); - return LDNS_STATUS_ERR; - } - - /* set DO bit if necessary */ - if (ldns_resolver_dnssec(r)) { - if (ldns_resolver_edns_udp_size(r) == 0) { - ldns_resolver_set_edns_udp_size(r, 4096); - } - ldns_pkt_set_edns_do(*query_pkt, true); - if (ldns_resolver_dnssec_cd(r) || (flags & LDNS_CD)) { - ldns_pkt_set_cd(*query_pkt, true); - } - } - - /* transfer the udp_edns_size from the resolver to the packet */ - if (ldns_resolver_edns_udp_size(r) != 0) { - ldns_pkt_set_edns_udp_size(*query_pkt, ldns_resolver_edns_udp_size(r)); - } - - /* set the timestamp */ - now.tv_sec = time(NULL); - now.tv_usec = 0; - ldns_pkt_set_timestamp(*query_pkt, now); - - - if (ldns_resolver_debug(r)) { - ldns_pkt_print(stdout, *query_pkt); - } - - /* only set the id if it is not set yet */ - if (ldns_pkt_id(*query_pkt) == 0) { - ldns_pkt_set_random_id(*query_pkt); - } - - return LDNS_STATUS_OK; -} - -ldns_status -ldns_resolver_send(ldns_pkt **answer, ldns_resolver *r, const ldns_rdf *name, - ldns_rr_type t, ldns_rr_class c, uint16_t flags) -{ - ldns_pkt *query_pkt; - ldns_pkt *answer_pkt; - ldns_status status; - - assert(r != NULL); - assert(name != NULL); - - answer_pkt = NULL; - - /* do all the preprocessing here, then fire of an query to - * the network */ - - if (0 == t) { - t= LDNS_RR_TYPE_A; - } - if (0 == c) { - c= LDNS_RR_CLASS_IN; - } - if (0 == ldns_resolver_nameserver_count(r)) { - return LDNS_STATUS_RES_NO_NS; - } - if (ldns_rdf_get_type(name) != LDNS_RDF_TYPE_DNAME) { - return LDNS_STATUS_RES_QUERY; - } - - status = ldns_resolver_prepare_query_pkt(&query_pkt, r, name, - t, c, flags); - if (status != LDNS_STATUS_OK) { - return status; - } - - /* if tsig values are set, tsign it */ - /* TODO: make last 3 arguments optional too? maybe make complete - rr instead of separate values in resolver (and packet) - Jelte - should this go in pkt_prepare? - */ - if (ldns_resolver_tsig_keyname(r) && ldns_resolver_tsig_keydata(r)) { -#ifdef HAVE_SSL - status = ldns_pkt_tsig_sign(query_pkt, - ldns_resolver_tsig_keyname(r), - ldns_resolver_tsig_keydata(r), - 300, ldns_resolver_tsig_algorithm(r), NULL); - if (status != LDNS_STATUS_OK) { - ldns_pkt_free(query_pkt); - return LDNS_STATUS_CRYPTO_TSIG_ERR; - } -#else - ldns_pkt_free(query_pkt); - return LDNS_STATUS_CRYPTO_TSIG_ERR; -#endif /* HAVE_SSL */ - } - - status = ldns_resolver_send_pkt(&answer_pkt, r, query_pkt); - ldns_pkt_free(query_pkt); - - /* allows answer to be NULL when not interested in return value */ - if (answer) { - *answer = answer_pkt; - } - return status; -} - -ldns_rr * -ldns_axfr_next(ldns_resolver *resolver) -{ - ldns_rr *cur_rr; - uint8_t *packet_wire; - size_t packet_wire_size; - ldns_status status; - - /* check if start() has been called */ - if (!resolver || resolver->_socket == -1) { - return NULL; - } - - if (resolver->_cur_axfr_pkt) { - if (resolver->_axfr_i == ldns_pkt_ancount(resolver->_cur_axfr_pkt)) { - ldns_pkt_free(resolver->_cur_axfr_pkt); - resolver->_cur_axfr_pkt = NULL; - return ldns_axfr_next(resolver); - } - cur_rr = ldns_rr_clone(ldns_rr_list_rr( - ldns_pkt_answer(resolver->_cur_axfr_pkt), - resolver->_axfr_i)); - resolver->_axfr_i++; - if (ldns_rr_get_type(cur_rr) == LDNS_RR_TYPE_SOA) { - resolver->_axfr_soa_count++; - if (resolver->_axfr_soa_count >= 2) { - - close_socket(resolver->_socket); - - ldns_pkt_free(resolver->_cur_axfr_pkt); - resolver->_cur_axfr_pkt = NULL; - } - } - return cur_rr; - } else { - packet_wire = ldns_tcp_read_wire_timeout(resolver->_socket, &packet_wire_size, resolver->_timeout); - if(!packet_wire) - return NULL; - - status = ldns_wire2pkt(&resolver->_cur_axfr_pkt, packet_wire, - packet_wire_size); - LDNS_FREE(packet_wire); - - resolver->_axfr_i = 0; - if (status != LDNS_STATUS_OK) { - /* TODO: make status return type of this function (...api change) */ -#ifdef STDERR_MSGS - fprintf(stderr, "Error parsing rr during AXFR: %s\n", ldns_get_errorstr_by_id(status)); -#endif - - /* we must now also close the socket, otherwise subsequent uses of the - same resolver structure will fail because the link is still open or - in an undefined state */ - - close_socket(resolver->_socket); - - return NULL; - } else if (ldns_pkt_get_rcode(resolver->_cur_axfr_pkt) != 0) { -#ifdef STDERR_MSGS - ldns_lookup_table *rcode = ldns_lookup_by_id( - ldns_rcodes,(int) ldns_pkt_get_rcode( - resolver->_cur_axfr_pkt)); - if (rcode) { - fprintf(stderr, "Error in AXFR: %s\n", - rcode->name); - } else { - fprintf(stderr, "Error in AXFR: %d\n", - (int) ldns_pkt_get_rcode( - resolver->_cur_axfr_pkt)); - } -#endif - - /* we must now also close the socket, otherwise subsequent uses of the - same resolver structure will fail because the link is still open or - in an undefined state */ - - close_socket(resolver->_socket); - - return NULL; - } else { - return ldns_axfr_next(resolver); - } - - } - -} - -/* this function is needed to abort a transfer that is in progress; - * without it an aborted transfer will lead to the AXFR code in the - * library staying in an indetermined state because the socket for the - * AXFR is never closed - */ -void -ldns_axfr_abort(ldns_resolver *resolver) -{ - /* Only abort if an actual AXFR is in progress */ - if (resolver->_socket != -1) - { -#ifndef USE_WINSOCK - close(resolver->_socket); -#else - closesocket(resolver->_socket); -#endif - resolver->_socket = -1; - } -} - -bool -ldns_axfr_complete(const ldns_resolver *res) -{ - /* complete when soa count is 2? */ - return res->_axfr_soa_count == 2; -} - -ldns_pkt * -ldns_axfr_last_pkt(const ldns_resolver *res) -{ - return res->_cur_axfr_pkt; -} - -void -ldns_resolver_set_ixfr_serial(ldns_resolver *r, uint32_t serial) -{ - r->_serial = serial; -} - -uint32_t -ldns_resolver_get_ixfr_serial(const ldns_resolver *res) -{ - return res->_serial; -} - - -/* random isn't really that good */ -void -ldns_resolver_nameservers_randomize(ldns_resolver *r) -{ - uint16_t i, j; - ldns_rdf **ns, *tmpns; - size_t *rtt, tmprtt; - - /* should I check for ldns_resolver_random?? */ - assert(r != NULL); - - ns = ldns_resolver_nameservers(r); - rtt = ldns_resolver_rtt(r); - for (i = 0; i < ldns_resolver_nameserver_count(r); i++) { - j = ldns_get_random() % ldns_resolver_nameserver_count(r); - tmpns = ns[i]; - ns[i] = ns[j]; - ns[j] = tmpns; - tmprtt = rtt[i]; - rtt[i] = rtt[j]; - rtt[j] = tmprtt; - } - ldns_resolver_set_nameservers(r, ns); -} - diff --git a/ldns/rr.c b/ldns/rr.c deleted file mode 100644 index 6642aca..0000000 --- a/ldns/rr.c +++ /dev/null @@ -1,2760 +0,0 @@ -/* rr.c - * - * access functions for ldns_rr - - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * - * (c) NLnet Labs, 2004-2006 - * See the file LICENSE for the license - */ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> -#include <limits.h> - -#include <errno.h> - -#define LDNS_SYNTAX_DATALEN 16 -#define LDNS_TTL_DATALEN 21 -#define LDNS_RRLIST_INIT 8 - -ldns_rr * -ldns_rr_new(void) -{ - ldns_rr *rr; - rr = LDNS_MALLOC(ldns_rr); - if (!rr) { - return NULL; - } - - ldns_rr_set_owner(rr, NULL); - ldns_rr_set_question(rr, false); - ldns_rr_set_rd_count(rr, 0); - rr->_rdata_fields = NULL; - ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); - ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); - return rr; -} - -ldns_rr * -ldns_rr_new_frm_type(ldns_rr_type t) -{ - ldns_rr *rr; - const ldns_rr_descriptor *desc; - size_t i; - - rr = LDNS_MALLOC(ldns_rr); - if (!rr) { - return NULL; - } - - desc = ldns_rr_descript(t); - - rr->_rdata_fields = LDNS_XMALLOC(ldns_rdf *, ldns_rr_descriptor_minimum(desc)); - if(!rr->_rdata_fields) { - LDNS_FREE(rr); - return NULL; - } - for (i = 0; i < ldns_rr_descriptor_minimum(desc); i++) { - rr->_rdata_fields[i] = NULL; - } - - ldns_rr_set_owner(rr, NULL); - ldns_rr_set_question(rr, false); - /* set the count to minimum */ - ldns_rr_set_rd_count(rr, ldns_rr_descriptor_minimum(desc)); - ldns_rr_set_class(rr, LDNS_RR_CLASS_IN); - ldns_rr_set_ttl(rr, LDNS_DEFAULT_TTL); - ldns_rr_set_type(rr, t); - return rr; -} - -void -ldns_rr_free(ldns_rr *rr) -{ - size_t i; - if (rr) { - if (ldns_rr_owner(rr)) { - ldns_rdf_deep_free(ldns_rr_owner(rr)); - } - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - ldns_rdf_deep_free(ldns_rr_rdf(rr, i)); - } - LDNS_FREE(rr->_rdata_fields); - LDNS_FREE(rr); - } -} - -/* Syntactic sugar for ldns_rr_new_frm_str_internal */ -INLINE bool -ldns_rdf_type_maybe_quoted(ldns_rdf_type rdf_type) -{ - return rdf_type == LDNS_RDF_TYPE_STR || - rdf_type == LDNS_RDF_TYPE_LONG_STR; -} - -/* - * trailing spaces are allowed - * leading spaces are not allowed - * allow ttl to be optional - * class is optional too - * if ttl is missing, and default_ttl is 0, use DEF_TTL - * allow ttl to be written as 1d3h - * So the RR should look like. e.g. - * miek.nl. 3600 IN MX 10 elektron.atoom.net - * or - * miek.nl. 1h IN MX 10 elektron.atoom.net - * or - * miek.nl. IN MX 10 elektron.atoom.net - */ -static ldns_status -ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str, - uint32_t default_ttl, const ldns_rdf *origin, - ldns_rdf **prev, bool question) -{ - ldns_rr *new; - const ldns_rr_descriptor *desc; - ldns_rr_type rr_type; - ldns_buffer *rr_buf = NULL; - ldns_buffer *rd_buf = NULL; - uint32_t ttl_val; - char *owner = NULL; - char *ttl = NULL; - ldns_rr_class clas_val; - char *clas = NULL; - char *type = NULL; - size_t type_sz; - char *rdata = NULL; - char *rd = NULL; - char *xtok = NULL; /* For RDF types with spaces (i.e. extra tokens) */ - size_t rd_strlen; - const char *delimiters; - ssize_t c; - ldns_rdf *owner_dname; - const char* endptr; - int was_unknown_rr_format = 0; - ldns_status status = LDNS_STATUS_OK; - - /* used for types with unknown number of rdatas */ - bool done; - bool quoted; - - ldns_rdf *r = NULL; - uint16_t r_cnt; - uint16_t r_min; - uint16_t r_max; - size_t pre_data_pos; - - uint16_t hex_data_size; - char *hex_data_str = NULL; - uint16_t cur_hex_data_size; - size_t hex_pos = 0; - uint8_t *hex_data = NULL; - - new = ldns_rr_new(); - - owner = LDNS_XMALLOC(char, LDNS_MAX_DOMAINLEN + 1); - ttl = LDNS_XMALLOC(char, LDNS_TTL_DATALEN); - clas = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); - rdata = LDNS_XMALLOC(char, LDNS_MAX_PACKETLEN + 1); - rr_buf = LDNS_MALLOC(ldns_buffer); - rd_buf = LDNS_MALLOC(ldns_buffer); - rd = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); - xtok = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); - if (rr_buf) { - rr_buf->_data = NULL; - } - if (rd_buf) { - rd_buf->_data = NULL; - } - if (!new || !owner || !ttl || !clas || !rdata || - !rr_buf || !rd_buf || !rd || !xtok) { - - goto memerror; - } - - ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str)); - - /* split the rr in its parts -1 signals trouble */ - if (ldns_bget_token(rr_buf, owner, "\t\n ", LDNS_MAX_DOMAINLEN) == -1){ - - status = LDNS_STATUS_SYNTAX_ERR; - goto error; - } - - if (ldns_bget_token(rr_buf, ttl, "\t\n ", LDNS_TTL_DATALEN) == -1) { - - status = LDNS_STATUS_SYNTAX_TTL_ERR; - goto error; - } - ttl_val = (uint32_t) ldns_str2period(ttl, &endptr); - - if (strlen(ttl) > 0 && !isdigit((int) ttl[0])) { - /* ah, it's not there or something */ - if (default_ttl == 0) { - ttl_val = LDNS_DEFAULT_TTL; - } else { - ttl_val = default_ttl; - } - /* we not ASSUMING the TTL is missing and that - * the rest of the RR is still there. That is - * CLASS TYPE RDATA - * so ttl value we read is actually the class - */ - clas_val = ldns_get_rr_class_by_name(ttl); - /* class can be left out too, assume IN, current - * token must be type - */ - if (clas_val == 0) { - clas_val = LDNS_RR_CLASS_IN; - type_sz = strlen(ttl) + 1; - type = LDNS_XMALLOC(char, type_sz); - if (!type) { - goto memerror; - } - strlcpy(type, ttl, type_sz); - } - } else { - if (-1 == ldns_bget_token( - rr_buf, clas, "\t\n ", LDNS_SYNTAX_DATALEN)) { - - status = LDNS_STATUS_SYNTAX_CLASS_ERR; - goto error; - } - clas_val = ldns_get_rr_class_by_name(clas); - /* class can be left out too, assume IN, current - * token must be type - */ - if (clas_val == 0) { - clas_val = LDNS_RR_CLASS_IN; - type_sz = strlen(clas) + 1; - type = LDNS_XMALLOC(char, type_sz); - if (!type) { - goto memerror; - } - strlcpy(type, clas, type_sz); - } - } - /* the rest should still be waiting for us */ - - if (!type) { - type = LDNS_XMALLOC(char, LDNS_SYNTAX_DATALEN); - if (!type) { - goto memerror; - } - if (-1 == ldns_bget_token( - rr_buf, type, "\t\n ", LDNS_SYNTAX_DATALEN)) { - - status = LDNS_STATUS_SYNTAX_TYPE_ERR; - goto error; - } - } - - if (ldns_bget_token(rr_buf, rdata, "\0", LDNS_MAX_PACKETLEN) == -1) { - /* apparently we are done, and it's only a question RR - * so do not set status and go to ldnserror here - */ - } - ldns_buffer_new_frm_data(rd_buf, rdata, strlen(rdata)); - - if (strlen(owner) <= 1 && strncmp(owner, "@", 1) == 0) { - if (origin) { - ldns_rr_set_owner(new, ldns_rdf_clone(origin)); - } else if (prev && *prev) { - ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); - } else { - /* default to root */ - ldns_rr_set_owner(new, ldns_dname_new_frm_str(".")); - } - - /* @ also overrides prev */ - if (prev) { - ldns_rdf_deep_free(*prev); - *prev = ldns_rdf_clone(ldns_rr_owner(new)); - if (!*prev) { - goto memerror; - } - } - } else { - if (strlen(owner) == 0) { - /* no ownername was given, try prev, if that fails - * origin, else default to root */ - if (prev && *prev) { - ldns_rr_set_owner(new, ldns_rdf_clone(*prev)); - } else if (origin) { - ldns_rr_set_owner(new, ldns_rdf_clone(origin)); - } else { - ldns_rr_set_owner(new, - ldns_dname_new_frm_str(".")); - } - if(!ldns_rr_owner(new)) { - goto memerror; - } - } else { - owner_dname = ldns_dname_new_frm_str(owner); - if (!owner_dname) { - status = LDNS_STATUS_SYNTAX_ERR; - goto error; - } - - ldns_rr_set_owner(new, owner_dname); - if (!ldns_dname_str_absolute(owner) && origin) { - if(ldns_dname_cat(ldns_rr_owner(new), origin) - != LDNS_STATUS_OK) { - - status = LDNS_STATUS_SYNTAX_ERR; - goto error; - } - } - if (prev) { - ldns_rdf_deep_free(*prev); - *prev = ldns_rdf_clone(ldns_rr_owner(new)); - if (!*prev) { - goto error; - } - } - } - } - LDNS_FREE(owner); - - ldns_rr_set_question(new, question); - - ldns_rr_set_ttl(new, ttl_val); - LDNS_FREE(ttl); - - ldns_rr_set_class(new, clas_val); - LDNS_FREE(clas); - - rr_type = ldns_get_rr_type_by_name(type); - LDNS_FREE(type); - - desc = ldns_rr_descript((uint16_t)rr_type); - ldns_rr_set_type(new, rr_type); - if (desc) { - /* only the rdata remains */ - r_max = ldns_rr_descriptor_maximum(desc); - r_min = ldns_rr_descriptor_minimum(desc); - } else { - r_min = 0; - r_max = 1; - } - - for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) { - quoted = false; - - switch (ldns_rr_descriptor_field_type(desc, r_cnt)) { - case LDNS_RDF_TYPE_B64 : - case LDNS_RDF_TYPE_HEX : /* These rdf types may con- */ - case LDNS_RDF_TYPE_LOC : /* tain whitespace, only if */ - case LDNS_RDF_TYPE_WKS : /* it is the last rd field. */ - case LDNS_RDF_TYPE_IPSECKEY : - case LDNS_RDF_TYPE_AMTRELAY : - case LDNS_RDF_TYPE_NSEC : if (r_cnt == r_max - 1) { - delimiters = "\n"; - break; - } - /* fallthrough */ - default : delimiters = "\n\t "; - } - - if (ldns_rdf_type_maybe_quoted( - ldns_rr_descriptor_field_type( - desc, r_cnt)) && - ldns_buffer_remaining(rd_buf) > 0){ - - /* skip spaces */ - while (*(ldns_buffer_current(rd_buf)) == ' ') { - ldns_buffer_skip(rd_buf, 1); - } - - if (*(ldns_buffer_current(rd_buf)) == '\"') { - delimiters = "\"\0"; - ldns_buffer_skip(rd_buf, 1); - quoted = true; - } else if (ldns_rr_descriptor_field_type(desc, r_cnt) - == LDNS_RDF_TYPE_LONG_STR) { - - status = LDNS_STATUS_SYNTAX_RDATA_ERR; - goto error; - } - } - - /* because number of fields can be variable, we can't rely on - * _maximum() only - */ - - /* skip spaces */ - while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf) - && *(ldns_buffer_current(rd_buf)) == ' ' - && !quoted) { - - ldns_buffer_skip(rd_buf, 1); - } - - pre_data_pos = ldns_buffer_position(rd_buf); - if (-1 == (c = ldns_bget_token( - rd_buf, rd, delimiters, LDNS_MAX_RDFLEN))) { - - done = true; - (void)done; /* we're breaking, so done not read anymore */ - break; - } - /* hmmz, rfc3597 specifies that any type can be represented - * with \# method, which can contain spaces... - * it does specify size though... - */ - rd_strlen = strlen(rd); - - /* unknown RR data */ - if (strncmp(rd, "\\#", 2) == 0 && !quoted && - (rd_strlen == 2 || rd[2]==' ')) { - - was_unknown_rr_format = 1; - /* go back to before \# - * and skip it while setting delimiters better - */ - ldns_buffer_set_position(rd_buf, pre_data_pos); - delimiters = "\n\t "; - (void)ldns_bget_token(rd_buf, rd, - delimiters, LDNS_MAX_RDFLEN); - /* read rdata octet length */ - c = ldns_bget_token(rd_buf, rd, - delimiters, LDNS_MAX_RDFLEN); - if (c == -1) { - /* something goes very wrong here */ - status = LDNS_STATUS_SYNTAX_RDATA_ERR; - goto error; - } - hex_data_size = (uint16_t) atoi(rd); - /* copy hex chars into hex str (2 chars per byte) */ - hex_data_str = LDNS_XMALLOC(char, 2*hex_data_size + 1); - if (!hex_data_str) { - /* malloc error */ - goto memerror; - } - cur_hex_data_size = 0; - while(cur_hex_data_size < 2 * hex_data_size) { - c = ldns_bget_token(rd_buf, rd, - delimiters, LDNS_MAX_RDFLEN); - if (c == -1) { - status = LDNS_STATUS_SYNTAX_RDATA_ERR; - goto error; - } - rd_strlen = strlen(rd); - if ((size_t)cur_hex_data_size + rd_strlen > - 2 * (size_t)hex_data_size) { - status = LDNS_STATUS_SYNTAX_RDATA_ERR; - goto error; - } - strlcpy(hex_data_str + cur_hex_data_size, rd, - rd_strlen + 1); - - cur_hex_data_size += rd_strlen; - } - hex_data_str[cur_hex_data_size] = '\0'; - - /* correct the rdf type */ - /* if *we* know the type, interpret it as wireformat */ - if (desc) { - hex_pos = 0; - hex_data = - LDNS_XMALLOC(uint8_t, hex_data_size+2); - - if (!hex_data) { - goto memerror; - } - ldns_write_uint16(hex_data, hex_data_size); - ldns_hexstring_to_data( - hex_data + 2, hex_data_str); - status = ldns_wire2rdf(new, hex_data, - hex_data_size + 2, &hex_pos); - if (status != LDNS_STATUS_OK) { - goto error; - } - LDNS_FREE(hex_data); - } else { - r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX, - hex_data_str); - if (!r) { - goto memerror; - } - ldns_rdf_set_type(r, LDNS_RDF_TYPE_UNKNOWN); - if (!ldns_rr_push_rdf(new, r)) { - goto memerror; - } - } - LDNS_FREE(hex_data_str); - - } else if(rd_strlen > 0 || quoted) { - /* Normal RR */ - switch(ldns_rr_descriptor_field_type(desc, r_cnt)) { - - case LDNS_RDF_TYPE_HEX: - case LDNS_RDF_TYPE_B64: - /* When this is the last rdata field, then the - * rest should be read in (cause then these - * rdf types may contain spaces). - */ - if (r_cnt == r_max - 1) { - c = ldns_bget_token(rd_buf, xtok, - "\n", LDNS_MAX_RDFLEN); - if (c != -1) { - (void) strncat(rd, xtok, - LDNS_MAX_RDFLEN - - strlen(rd) - 1); - } - } - r = ldns_rdf_new_frm_str( - ldns_rr_descriptor_field_type( - desc, r_cnt), rd); - break; - - case LDNS_RDF_TYPE_HIP: - /* - * In presentation format this RDATA type has - * three tokens: An algorithm byte, then a - * variable length HIT (in hexbytes) and then - * a variable length Public Key (in base64). - * - * We have just read the algorithm, so we need - * two more tokens: HIT and Public Key. - */ - do { - /* Read and append HIT */ - if (ldns_bget_token(rd_buf, - xtok, delimiters, - LDNS_MAX_RDFLEN) == -1) - break; - - (void) strncat(rd, " ", - LDNS_MAX_RDFLEN - - strlen(rd) - 1); - (void) strncat(rd, xtok, - LDNS_MAX_RDFLEN - - strlen(rd) - 1); - - /* Read and append Public Key*/ - if (ldns_bget_token(rd_buf, - xtok, delimiters, - LDNS_MAX_RDFLEN) == -1) - break; - - (void) strncat(rd, " ", - LDNS_MAX_RDFLEN - - strlen(rd) - 1); - (void) strncat(rd, xtok, - LDNS_MAX_RDFLEN - - strlen(rd) - 1); - } while (false); - - r = ldns_rdf_new_frm_str( - ldns_rr_descriptor_field_type( - desc, r_cnt), rd); - break; - - case LDNS_RDF_TYPE_DNAME: - r = ldns_rdf_new_frm_str( - ldns_rr_descriptor_field_type( - desc, r_cnt), rd); - - /* check if the origin should be used - * or concatenated - */ - if (r && ldns_rdf_size(r) > 1 && - ldns_rdf_data(r)[0] == 1 && - ldns_rdf_data(r)[1] == '@') { - - ldns_rdf_deep_free(r); - - r = origin ? ldns_rdf_clone(origin) - - : ( rr_type == LDNS_RR_TYPE_SOA ? - - ldns_rdf_clone( - ldns_rr_owner(new)) - - : ldns_rdf_new_frm_str( - LDNS_RDF_TYPE_DNAME, ".") - ); - - } else if (r && rd_strlen >= 1 && origin && - !ldns_dname_str_absolute(rd)) { - - status = ldns_dname_cat(r, origin); - if (status != LDNS_STATUS_OK) { - goto error; - } - } - break; - default: - r = ldns_rdf_new_frm_str( - ldns_rr_descriptor_field_type( - desc, r_cnt), rd); - break; - } - if (!r) { - status = LDNS_STATUS_SYNTAX_RDATA_ERR; - goto error; - } - ldns_rr_push_rdf(new, r); - } - if (quoted) { - if (ldns_buffer_available(rd_buf, 1)) { - ldns_buffer_skip(rd_buf, 1); - } else { - done = true; - } - } - - } /* for (done = false, r_cnt = 0; !done && r_cnt < r_max; r_cnt++) */ - LDNS_FREE(rd); - LDNS_FREE(xtok); - ldns_buffer_free(rr_buf); - LDNS_FREE(rdata); - if (ldns_buffer_remaining(rd_buf) > 0) { - ldns_buffer_free(rd_buf); - ldns_rr_free(new); - return LDNS_STATUS_SYNTAX_SUPERFLUOUS_TEXT_ERR; - } - ldns_buffer_free(rd_buf); - - if (!question && desc && !was_unknown_rr_format && - ldns_rr_rd_count(new) < r_min) { - - ldns_rr_free(new); - return LDNS_STATUS_SYNTAX_MISSING_VALUE_ERR; - } - - if (newrr) { - *newrr = new; - } else { - /* Maybe the caller just wanted to see if it would parse? */ - ldns_rr_free(new); - } - return LDNS_STATUS_OK; - -memerror: - status = LDNS_STATUS_MEM_ERR; -error: - if (rd_buf && rd_buf->_data) { - ldns_buffer_free(rd_buf); - } else { - LDNS_FREE(rd_buf); - } - if (rr_buf && rr_buf->_data) { - ldns_buffer_free(rr_buf); - } else { - LDNS_FREE(rr_buf); - } - LDNS_FREE(type); - LDNS_FREE(owner); - LDNS_FREE(ttl); - LDNS_FREE(clas); - LDNS_FREE(hex_data); - LDNS_FREE(hex_data_str); - LDNS_FREE(xtok); - LDNS_FREE(rd); - LDNS_FREE(rdata); - ldns_rr_free(new); - return status; -} - -ldns_status -ldns_rr_new_frm_str(ldns_rr **newrr, const char *str, - uint32_t default_ttl, const ldns_rdf *origin, - ldns_rdf **prev) -{ - return ldns_rr_new_frm_str_internal(newrr, - str, - default_ttl, - origin, - prev, - false); -} - -ldns_status -ldns_rr_new_question_frm_str(ldns_rr **newrr, const char *str, - const ldns_rdf *origin, ldns_rdf **prev) -{ - return ldns_rr_new_frm_str_internal(newrr, - str, - 0, - origin, - prev, - true); -} - -/* Strip whitespace from the start and the end of <line>. */ -static char * -ldns_strip_ws(char *line) -{ - char *s = line, *e; - - for (s = line; *s && isspace((unsigned char)*s); s++) - ; - - for (e = strchr(s, 0); e > s+2 && isspace((unsigned char)e[-1]) && e[-2] != '\\'; e--) - ; - *e = 0; - - return s; -} - -ldns_status -ldns_rr_new_frm_fp(ldns_rr **newrr, FILE *fp, uint32_t *ttl, ldns_rdf **origin, ldns_rdf **prev) -{ - return ldns_rr_new_frm_fp_l(newrr, fp, ttl, origin, prev, NULL); -} - -ldns_status -ldns_rr_new_frm_fp_l(ldns_rr **newrr, FILE *fp, uint32_t *default_ttl, ldns_rdf **origin, ldns_rdf **prev, int *line_nr) -{ - char *line; - const char *endptr; /* unused */ - ldns_rr *rr; - uint32_t ttl; - ldns_rdf *tmp; - ldns_status s; - ssize_t size; - - if (default_ttl) { - ttl = *default_ttl; - } else { - ttl = 0; - } - - line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); - if (!line) { - return LDNS_STATUS_MEM_ERR; - } - - /* read an entire line in from the file */ - if ((size = ldns_fget_token_l(fp, line, LDNS_PARSE_SKIP_SPACE, LDNS_MAX_LINELEN, line_nr)) == -1) { - LDNS_FREE(line); - /* if last line was empty, we are now at feof, which is not - * always a parse error (happens when for instance last line - * was a comment) - */ - return LDNS_STATUS_SYNTAX_ERR; - } - - /* we can have the situation, where we've read ok, but still got - * no bytes to play with, in this case size is 0 - */ - if (size == 0) { - LDNS_FREE(line); - return LDNS_STATUS_SYNTAX_EMPTY; - } - - if (strncmp(line, "$ORIGIN", 7) == 0 && isspace((unsigned char)line[7])) { - if (*origin) { - ldns_rdf_deep_free(*origin); - *origin = NULL; - } - tmp = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, - ldns_strip_ws(line + 8)); - if (!tmp) { - /* could not parse what next to $ORIGIN */ - LDNS_FREE(line); - return LDNS_STATUS_SYNTAX_DNAME_ERR; - } - *origin = tmp; - s = LDNS_STATUS_SYNTAX_ORIGIN; - } else if (strncmp(line, "$TTL", 4) == 0 && isspace((unsigned char)line[4])) { - if (default_ttl) { - *default_ttl = ldns_str2period( - ldns_strip_ws(line + 5), &endptr); - } - s = LDNS_STATUS_SYNTAX_TTL; - } else if (strncmp(line, "$INCLUDE", 8) == 0) { - s = LDNS_STATUS_SYNTAX_INCLUDE; - } else if (!*ldns_strip_ws(line)) { - LDNS_FREE(line); - return LDNS_STATUS_SYNTAX_EMPTY; - } else { - if (origin && *origin) { - s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, *origin, prev); - } else { - s = ldns_rr_new_frm_str(&rr, (const char*) line, ttl, NULL, prev); - } - } - LDNS_FREE(line); - if (s == LDNS_STATUS_OK) { - if (newrr) { - *newrr = rr; - } else { - /* Just testing if it would parse? */ - ldns_rr_free(rr); - } - } - return s; -} - -void -ldns_rr_set_owner(ldns_rr *rr, ldns_rdf *owner) -{ - rr->_owner = owner; -} - -void -ldns_rr_set_question(ldns_rr *rr, bool question) -{ - rr->_rr_question = question; -} - -void -ldns_rr_set_ttl(ldns_rr *rr, uint32_t ttl) -{ - rr->_ttl = ttl; -} - -void -ldns_rr_set_rd_count(ldns_rr *rr, size_t count) -{ - rr->_rd_count = count; -} - -void -ldns_rr_set_type(ldns_rr *rr, ldns_rr_type rr_type) -{ - rr->_rr_type = rr_type; -} - -void -ldns_rr_set_class(ldns_rr *rr, ldns_rr_class rr_class) -{ - rr->_rr_class = rr_class; -} - -ldns_rdf * -ldns_rr_set_rdf(ldns_rr *rr, const ldns_rdf *f, size_t position) -{ - size_t rd_count; - ldns_rdf *pop; - - rd_count = ldns_rr_rd_count(rr); - if (position < rd_count) { - /* dicard the old one */ - pop = rr->_rdata_fields[position]; - rr->_rdata_fields[position] = (ldns_rdf*)f; - return pop; - } else { - return NULL; - } -} - -bool -ldns_rr_push_rdf(ldns_rr *rr, const ldns_rdf *f) -{ - size_t rd_count; - ldns_rdf **rdata_fields; - - rd_count = ldns_rr_rd_count(rr); - - /* grow the array */ - rdata_fields = LDNS_XREALLOC( - rr->_rdata_fields, ldns_rdf *, rd_count + 1); - if (!rdata_fields) { - return false; - } - - /* add the new member */ - rr->_rdata_fields = rdata_fields; - rr->_rdata_fields[rd_count] = (ldns_rdf*)f; - - ldns_rr_set_rd_count(rr, rd_count + 1); - return true; -} - -ldns_rdf * -ldns_rr_pop_rdf(ldns_rr *rr) -{ - size_t rd_count; - ldns_rdf *pop; - ldns_rdf** newrd; - - rd_count = ldns_rr_rd_count(rr); - - if (rd_count == 0) { - return NULL; - } - - pop = rr->_rdata_fields[rd_count - 1]; - - /* try to shrink the array */ - if(rd_count > 1) { - newrd = LDNS_XREALLOC( - rr->_rdata_fields, ldns_rdf *, rd_count - 1); - if(newrd) - rr->_rdata_fields = newrd; - } else { - LDNS_FREE(rr->_rdata_fields); - } - - ldns_rr_set_rd_count(rr, rd_count - 1); - return pop; -} - -ldns_rdf * -ldns_rr_rdf(const ldns_rr *rr, size_t nr) -{ - if (rr && nr < ldns_rr_rd_count(rr)) { - return rr->_rdata_fields[nr]; - } else { - return NULL; - } -} - -ldns_rdf * -ldns_rr_owner(const ldns_rr *rr) -{ - return rr->_owner; -} - -bool -ldns_rr_is_question(const ldns_rr *rr) -{ - return rr->_rr_question; -} - -uint32_t -ldns_rr_ttl(const ldns_rr *rr) -{ - return rr->_ttl; -} - -size_t -ldns_rr_rd_count(const ldns_rr *rr) -{ - return rr->_rd_count; -} - -ldns_rr_type -ldns_rr_get_type(const ldns_rr *rr) -{ - return rr->_rr_type; -} - -ldns_rr_class -ldns_rr_get_class(const ldns_rr *rr) -{ - return rr->_rr_class; -} - -/* rr_lists */ - -size_t -ldns_rr_list_rr_count(const ldns_rr_list *rr_list) -{ - if (rr_list) { - return rr_list->_rr_count; - } else { - return 0; - } -} - -ldns_rr * -ldns_rr_list_set_rr(ldns_rr_list *rr_list, const ldns_rr *r, size_t count) -{ - ldns_rr *old; - - if (count > ldns_rr_list_rr_count(rr_list)) { - return NULL; - } - - old = ldns_rr_list_rr(rr_list, count); - - /* overwrite old's pointer */ - rr_list->_rrs[count] = (ldns_rr*)r; - return old; -} - -void -ldns_rr_list_set_rr_count(ldns_rr_list *rr_list, size_t count) -{ - assert(count <= rr_list->_rr_capacity); - rr_list->_rr_count = count; -} - -ldns_rr * -ldns_rr_list_rr(const ldns_rr_list *rr_list, size_t nr) -{ - if (nr < ldns_rr_list_rr_count(rr_list)) { - return rr_list->_rrs[nr]; - } else { - return NULL; - } -} - -ldns_rr_list * -ldns_rr_list_new(void) -{ - ldns_rr_list *rr_list = LDNS_MALLOC(ldns_rr_list); - if(!rr_list) return NULL; - rr_list->_rr_count = 0; - rr_list->_rr_capacity = 0; - rr_list->_rrs = NULL; - return rr_list; -} - -void -ldns_rr_list_free(ldns_rr_list *rr_list) -{ - if (rr_list) { - LDNS_FREE(rr_list->_rrs); - LDNS_FREE(rr_list); - } -} - -void -ldns_rr_list_deep_free(ldns_rr_list *rr_list) -{ - size_t i; - - if (rr_list) { - for (i=0; i < ldns_rr_list_rr_count(rr_list); i++) { - ldns_rr_free(ldns_rr_list_rr(rr_list, i)); - } - LDNS_FREE(rr_list->_rrs); - LDNS_FREE(rr_list); - } -} - - -/* add right to left. So we modify *left! */ -bool -ldns_rr_list_cat(ldns_rr_list *left, const ldns_rr_list *right) -{ - size_t r_rr_count; - size_t i; - - if (!left) { - return false; - } - - if (right) { - r_rr_count = ldns_rr_list_rr_count(right); - } else { - r_rr_count = 0; - } - - /* push right to left */ - for(i = 0; i < r_rr_count; i++) { - ldns_rr_list_push_rr(left, ldns_rr_list_rr(right, i)); - } - return true; -} - -ldns_rr_list * -ldns_rr_list_cat_clone(const ldns_rr_list *left, const ldns_rr_list *right) -{ - size_t l_rr_count; - size_t r_rr_count; - size_t i; - ldns_rr_list *cat; - - if (left) { - l_rr_count = ldns_rr_list_rr_count(left); - } else { - return ldns_rr_list_clone(right); - } - - if (right) { - r_rr_count = ldns_rr_list_rr_count(right); - } else { - r_rr_count = 0; - } - - cat = ldns_rr_list_new(); - - if (!cat) { - return NULL; - } - - /* left */ - for(i = 0; i < l_rr_count; i++) { - ldns_rr_list_push_rr(cat, - ldns_rr_clone(ldns_rr_list_rr(left, i))); - } - /* right */ - for(i = 0; i < r_rr_count; i++) { - ldns_rr_list_push_rr(cat, - ldns_rr_clone(ldns_rr_list_rr(right, i))); - } - return cat; -} - -ldns_rr_list * -ldns_rr_list_subtype_by_rdf(const ldns_rr_list *l, const ldns_rdf *r, size_t pos) -{ - size_t i; - ldns_rr_list *subtyped; - ldns_rdf *list_rdf; - - subtyped = ldns_rr_list_new(); - - for(i = 0; i < ldns_rr_list_rr_count(l); i++) { - list_rdf = ldns_rr_rdf( - ldns_rr_list_rr(l, i), - pos); - if (!list_rdf) { - /* pos is too large or any other error */ - ldns_rr_list_deep_free(subtyped); - return NULL; - } - - if (ldns_rdf_compare(list_rdf, r) == 0) { - /* a match */ - ldns_rr_list_push_rr(subtyped, - ldns_rr_clone(ldns_rr_list_rr(l, i))); - } - } - - if (ldns_rr_list_rr_count(subtyped) > 0) { - return subtyped; - } else { - ldns_rr_list_free(subtyped); - return NULL; - } -} - -bool -ldns_rr_list_push_rr(ldns_rr_list *rr_list, const ldns_rr *rr) -{ - size_t rr_count; - size_t cap; - - rr_count = ldns_rr_list_rr_count(rr_list); - cap = rr_list->_rr_capacity; - - /* grow the array */ - if(rr_count+1 > cap) { - ldns_rr **rrs; - - if(cap == 0) - cap = LDNS_RRLIST_INIT; /* initial list size */ - else cap *= 2; - rrs = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); - if (!rrs) { - return false; - } - rr_list->_rrs = rrs; - rr_list->_rr_capacity = cap; - } - - /* add the new member */ - rr_list->_rrs[rr_count] = (ldns_rr*)rr; - - ldns_rr_list_set_rr_count(rr_list, rr_count + 1); - return true; -} - -bool -ldns_rr_list_push_rr_list(ldns_rr_list *rr_list, const ldns_rr_list *push_list) -{ - size_t i; - - for(i = 0; i < ldns_rr_list_rr_count(push_list); i++) { - if (!ldns_rr_list_push_rr(rr_list, - ldns_rr_list_rr(push_list, i))) { - return false; - } - } - return true; -} - -ldns_rr * -ldns_rr_list_pop_rr(ldns_rr_list *rr_list) -{ - size_t rr_count; - size_t cap; - ldns_rr *pop; - - rr_count = ldns_rr_list_rr_count(rr_list); - - if (rr_count == 0) { - return NULL; - } - - cap = rr_list->_rr_capacity; - pop = ldns_rr_list_rr(rr_list, rr_count - 1); - - /* shrink the array */ - if(cap > LDNS_RRLIST_INIT && rr_count-1 <= cap/2) { - ldns_rr** a; - cap /= 2; - a = LDNS_XREALLOC(rr_list->_rrs, ldns_rr *, cap); - if(a) { - rr_list->_rrs = a; - rr_list->_rr_capacity = cap; - } - } - - ldns_rr_list_set_rr_count(rr_list, rr_count - 1); - - return pop; -} - -ldns_rr_list * -ldns_rr_list_pop_rr_list(ldns_rr_list *rr_list, size_t howmany) -{ - /* pop a number of rr's and put them in a rr_list */ - ldns_rr_list *popped; - ldns_rr *p; - size_t i = howmany; - - popped = ldns_rr_list_new(); - - if (!popped) { - return NULL; - } - - - while(i > 0 && - (p = ldns_rr_list_pop_rr(rr_list)) != NULL) { - ldns_rr_list_push_rr(popped, p); - i--; - } - - if (i == howmany) { /* so i <= 0 */ - ldns_rr_list_free(popped); - return NULL; - } else { - return popped; - } -} - - -bool -ldns_rr_list_contains_rr(const ldns_rr_list *rr_list, const ldns_rr *rr) -{ - size_t i; - - if (!rr_list || !rr || ldns_rr_list_rr_count(rr_list) == 0) { - return false; - } - - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - if (rr == ldns_rr_list_rr(rr_list, i)) { - return true; - } else if (ldns_rr_compare(rr, ldns_rr_list_rr(rr_list, i)) == 0) { - return true; - } - } - return false; -} - -bool -ldns_is_rrset(const ldns_rr_list *rr_list) -{ - ldns_rr_type t; - ldns_rr_class c; - ldns_rdf *o; - ldns_rr *tmp; - size_t i; - - if (!rr_list || ldns_rr_list_rr_count(rr_list) == 0) { - return false; - } - - tmp = ldns_rr_list_rr(rr_list, 0); - - t = ldns_rr_get_type(tmp); - c = ldns_rr_get_class(tmp); - o = ldns_rr_owner(tmp); - - /* compare these with the rest of the rr_list, start with 1 */ - for (i = 1; i < ldns_rr_list_rr_count(rr_list); i++) { - tmp = ldns_rr_list_rr(rr_list, i); - if (t != ldns_rr_get_type(tmp)) { - return false; - } - if (c != ldns_rr_get_class(tmp)) { - return false; - } - if (ldns_rdf_compare(o, ldns_rr_owner(tmp)) != 0) { - return false; - } - } - return true; -} - -bool -ldns_rr_set_push_rr(ldns_rr_list *rr_list, ldns_rr *rr) -{ - size_t rr_count; - size_t i; - ldns_rr *last; - - assert(rr != NULL); - - rr_count = ldns_rr_list_rr_count(rr_list); - - if (rr_count == 0) { - /* nothing there, so checking it is - * not needed */ - return ldns_rr_list_push_rr(rr_list, rr); - } else { - /* check with the final rr in the rr_list */ - last = ldns_rr_list_rr(rr_list, rr_count - 1); - - if (ldns_rr_get_class(last) != ldns_rr_get_class(rr)) { - return false; - } - if (ldns_rr_get_type(last) != ldns_rr_get_type(rr)) { - return false; - } - /* only check if not equal to RRSIG */ - if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_RRSIG) { - if (ldns_rr_ttl(last) != ldns_rr_ttl(rr)) { - return false; - } - } - if (ldns_rdf_compare(ldns_rr_owner(last), - ldns_rr_owner(rr)) != 0) { - return false; - } - /* ok, still alive - check if the rr already - * exists - if so, dont' add it */ - for(i = 0; i < rr_count; i++) { - if(ldns_rr_compare( - ldns_rr_list_rr(rr_list, i), rr) == 0) { - return false; - } - } - /* it's safe, push it */ - return ldns_rr_list_push_rr(rr_list, rr); - } -} - -ldns_rr * -ldns_rr_set_pop_rr(ldns_rr_list *rr_list) -{ - return ldns_rr_list_pop_rr(rr_list); -} - -ldns_rr_list * -ldns_rr_list_pop_rrset(ldns_rr_list *rr_list) -{ - ldns_rr_list *rrset; - ldns_rr *last_rr = NULL; - ldns_rr *next_rr; - - if (!rr_list) { - return NULL; - } - - rrset = ldns_rr_list_new(); - if (!last_rr) { - last_rr = ldns_rr_list_pop_rr(rr_list); - if (!last_rr) { - ldns_rr_list_free(rrset); - return NULL; - } else { - ldns_rr_list_push_rr(rrset, last_rr); - } - } - - if (ldns_rr_list_rr_count(rr_list) > 0) { - next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); - } else { - next_rr = NULL; - } - - while (next_rr) { - if ( - ldns_rdf_compare(ldns_rr_owner(next_rr), - ldns_rr_owner(last_rr)) == 0 - && - ldns_rr_get_type(next_rr) == ldns_rr_get_type(last_rr) - && - ldns_rr_get_class(next_rr) == ldns_rr_get_class(last_rr) - ) { - ldns_rr_list_push_rr(rrset, ldns_rr_list_pop_rr(rr_list)); - if (ldns_rr_list_rr_count(rr_list) > 0) { - last_rr = next_rr; - next_rr = ldns_rr_list_rr(rr_list, ldns_rr_list_rr_count(rr_list) - 1); - } else { - next_rr = NULL; - } - } else { - next_rr = NULL; - } - } - - return rrset; -} - -ldns_rr * -ldns_rr_clone(const ldns_rr *rr) -{ - size_t i; - ldns_rr *new_rr; - - if (!rr) { - return NULL; - } - - new_rr = ldns_rr_new(); - if (!new_rr) { - return NULL; - } - if (ldns_rr_owner(rr)) { - ldns_rr_set_owner(new_rr, ldns_rdf_clone(ldns_rr_owner(rr))); - } - ldns_rr_set_ttl(new_rr, ldns_rr_ttl(rr)); - ldns_rr_set_type(new_rr, ldns_rr_get_type(rr)); - ldns_rr_set_class(new_rr, ldns_rr_get_class(rr)); - ldns_rr_set_question(new_rr, ldns_rr_is_question(rr)); - - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - if (ldns_rr_rdf(rr,i)) { - ldns_rr_push_rdf(new_rr, ldns_rdf_clone(ldns_rr_rdf(rr, i))); - } - } - - return new_rr; -} - -ldns_rr_list * -ldns_rr_list_clone(const ldns_rr_list *rrlist) -{ - size_t i; - ldns_rr_list *new_list; - ldns_rr *r; - - if (!rrlist) { - return NULL; - } - - new_list = ldns_rr_list_new(); - if (!new_list) { - return NULL; - } - for (i = 0; i < ldns_rr_list_rr_count(rrlist); i++) { - r = ldns_rr_clone( - ldns_rr_list_rr(rrlist, i) - ); - if (!r) { - /* huh, failure in cloning */ - ldns_rr_list_deep_free(new_list); - return NULL; - } - ldns_rr_list_push_rr(new_list, r); - } - return new_list; -} - - -static int -qsort_schwartz_rr_compare(const void *a, const void *b) -{ - int result = 0; - ldns_rr *rr1, *rr2; - ldns_buffer *rr1_buf, *rr2_buf; - struct ldns_schwartzian_compare_struct *sa = *(struct ldns_schwartzian_compare_struct **) a; - struct ldns_schwartzian_compare_struct *sb = *(struct ldns_schwartzian_compare_struct **) b; - /* if we are doing 2wire, we need to do lowercasing on the dname (and maybe on the rdata) - * this must be done for comparison only, so we need to have a temp var for both buffers, - * which is only used when the transformed object value isn't there yet - */ - ldns_rr *canonical_a, *canonical_b; - - rr1 = (ldns_rr *) sa->original_object; - rr2 = (ldns_rr *) sb->original_object; - - result = ldns_rr_compare_no_rdata(rr1, rr2); - - if (result == 0) { - if (!sa->transformed_object) { - canonical_a = ldns_rr_clone(sa->original_object); - ldns_rr2canonical(canonical_a); - sa->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_a)); - if (ldns_rr2buffer_wire(sa->transformed_object, canonical_a, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { - ldns_buffer_free((ldns_buffer *)sa->transformed_object); - sa->transformed_object = NULL; - ldns_rr_free(canonical_a); - return 0; - } - ldns_rr_free(canonical_a); - } - if (!sb->transformed_object) { - canonical_b = ldns_rr_clone(sb->original_object); - ldns_rr2canonical(canonical_b); - sb->transformed_object = ldns_buffer_new(ldns_rr_uncompressed_size(canonical_b)); - if (ldns_rr2buffer_wire(sb->transformed_object, canonical_b, LDNS_SECTION_ANY) != LDNS_STATUS_OK) { - ldns_buffer_free((ldns_buffer *)sa->transformed_object); - ldns_buffer_free((ldns_buffer *)sb->transformed_object); - sa->transformed_object = NULL; - sb->transformed_object = NULL; - ldns_rr_free(canonical_b); - return 0; - } - ldns_rr_free(canonical_b); - } - rr1_buf = (ldns_buffer *) sa->transformed_object; - rr2_buf = (ldns_buffer *) sb->transformed_object; - - result = ldns_rr_compare_wire(rr1_buf, rr2_buf); - } - - return result; -} - -void -ldns_rr_list_sort(ldns_rr_list *unsorted) -{ - struct ldns_schwartzian_compare_struct **sortables; - size_t item_count; - size_t i; - - if (unsorted) { - item_count = ldns_rr_list_rr_count(unsorted); - - sortables = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct *, - item_count); - if(!sortables) return; /* no way to return error */ - for (i = 0; i < item_count; i++) { - sortables[i] = LDNS_XMALLOC(struct ldns_schwartzian_compare_struct, 1); - if(!sortables[i]) { - /* free the allocated parts */ - while(i>0) { - i--; - LDNS_FREE(sortables[i]); - } - /* no way to return error */ - LDNS_FREE(sortables); - return; - } - sortables[i]->original_object = ldns_rr_list_rr(unsorted, i); - sortables[i]->transformed_object = NULL; - } - qsort(sortables, - item_count, - sizeof(struct ldns_schwartzian_compare_struct *), - qsort_schwartz_rr_compare); - for (i = 0; i < item_count; i++) { - unsorted->_rrs[i] = sortables[i]->original_object; - if (sortables[i]->transformed_object) { - ldns_buffer_free(sortables[i]->transformed_object); - } - LDNS_FREE(sortables[i]); - } - LDNS_FREE(sortables); - } -} - -int -ldns_rr_compare_no_rdata(const ldns_rr *rr1, const ldns_rr *rr2) -{ - size_t rr1_len; - size_t rr2_len; - size_t offset; - - assert(rr1 != NULL); - assert(rr2 != NULL); - - rr1_len = ldns_rr_uncompressed_size(rr1); - rr2_len = ldns_rr_uncompressed_size(rr2); - - if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) { - return -1; - } else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) { - return 1; - } - - /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ - if (ldns_rr_get_class(rr1) != ldns_rr_get_class(rr2)) { - return ldns_rr_get_class(rr1) - ldns_rr_get_class(rr2); - } - - /* should return -1 if rr1 comes before rr2, so need to do rr1 - rr2, not rr2 - rr1 */ - if (ldns_rr_get_type(rr1) != ldns_rr_get_type(rr2)) { - return ldns_rr_get_type(rr1) - ldns_rr_get_type(rr2); - } - - /* offset is the owername length + ttl + type + class + rdlen == start of wire format rdata */ - offset = ldns_rdf_size(ldns_rr_owner(rr1)) + 4 + 2 + 2 + 2; - /* if either record doesn't have any RDATA... */ - if (offset > rr1_len || offset > rr2_len) { - if (rr1_len == rr2_len) { - return 0; - } - return ((int) rr2_len - (int) rr1_len); - } - - return 0; -} - -int ldns_rr_compare_wire(const ldns_buffer *rr1_buf, const ldns_buffer *rr2_buf) -{ - size_t rr1_len, rr2_len, min_len, i, offset; - - rr1_len = ldns_buffer_capacity(rr1_buf); - rr2_len = ldns_buffer_capacity(rr2_buf); - - /* jump past dname (checked in earlier part) - * and especially past TTL */ - offset = 0; - while (offset < rr1_len && *ldns_buffer_at(rr1_buf, offset) != 0) { - offset += *ldns_buffer_at(rr1_buf, offset) + 1; - } - /* jump to rdata section (PAST the rdata length field, otherwise - rrs with different lengths might be sorted erroneously */ - offset += 11; - min_len = (rr1_len < rr2_len) ? rr1_len : rr2_len; - /* Compare RRs RDATA byte for byte. */ - for(i = offset; i < min_len; i++) { - if (*ldns_buffer_at(rr1_buf,i) < *ldns_buffer_at(rr2_buf,i)) { - return -1; - } else if (*ldns_buffer_at(rr1_buf,i) > *ldns_buffer_at(rr2_buf,i)) { - return +1; - } - } - - /* If both RDATAs are the same up to min_len, then the shorter one sorts first. */ - if (rr1_len < rr2_len) { - return -1; - } else if (rr1_len > rr2_len) { - return +1; - } - /* The RDATAs are equal. */ - return 0; - -} - -int -ldns_rr_compare(const ldns_rr *rr1, const ldns_rr *rr2) -{ - int result; - size_t rr1_len, rr2_len; - - ldns_buffer *rr1_buf; - ldns_buffer *rr2_buf; - - result = ldns_rr_compare_no_rdata(rr1, rr2); - if (result == 0) { - rr1_len = ldns_rr_uncompressed_size(rr1); - rr2_len = ldns_rr_uncompressed_size(rr2); - - rr1_buf = ldns_buffer_new(rr1_len); - rr2_buf = ldns_buffer_new(rr2_len); - - if (ldns_rr2buffer_wire_canonical(rr1_buf, - rr1, - LDNS_SECTION_ANY) - != LDNS_STATUS_OK) { - ldns_buffer_free(rr1_buf); - ldns_buffer_free(rr2_buf); - return 0; - } - if (ldns_rr2buffer_wire_canonical(rr2_buf, - rr2, - LDNS_SECTION_ANY) - != LDNS_STATUS_OK) { - ldns_buffer_free(rr1_buf); - ldns_buffer_free(rr2_buf); - return 0; - } - - result = ldns_rr_compare_wire(rr1_buf, rr2_buf); - - ldns_buffer_free(rr1_buf); - ldns_buffer_free(rr2_buf); - } - - return result; -} - -/* convert dnskey to a ds with the given algorithm, - * then compare the result with the given ds */ -static int -ldns_rr_compare_ds_dnskey(ldns_rr *ds, - ldns_rr *dnskey) -{ - ldns_rr *ds_gen; - bool result = false; - ldns_hash algo; - - if (!dnskey || !ds || - ldns_rr_get_type(ds) != LDNS_RR_TYPE_DS || - ldns_rr_get_type(dnskey) != LDNS_RR_TYPE_DNSKEY) { - return false; - } - - if (ldns_rr_rdf(ds, 2) == NULL) { - return false; - } - algo = ldns_rdf2native_int8(ldns_rr_rdf(ds, 2)); - - ds_gen = ldns_key_rr2ds(dnskey, algo); - if (ds_gen) { - result = ldns_rr_compare(ds, ds_gen) == 0; - ldns_rr_free(ds_gen); - } - return result; -} - -bool -ldns_rr_compare_ds(const ldns_rr *orr1, const ldns_rr *orr2) -{ - bool result; - ldns_rr *rr1 = ldns_rr_clone(orr1); - ldns_rr *rr2 = ldns_rr_clone(orr2); - - /* set ttls to zero */ - ldns_rr_set_ttl(rr1, 0); - ldns_rr_set_ttl(rr2, 0); - - if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DS && - ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DNSKEY) { - result = ldns_rr_compare_ds_dnskey(rr1, rr2); - } else if (ldns_rr_get_type(rr1) == LDNS_RR_TYPE_DNSKEY && - ldns_rr_get_type(rr2) == LDNS_RR_TYPE_DS) { - result = ldns_rr_compare_ds_dnskey(rr2, rr1); - } else { - result = (ldns_rr_compare(rr1, rr2) == 0); - } - - ldns_rr_free(rr1); - ldns_rr_free(rr2); - - return result; -} - -int -ldns_rr_list_compare(const ldns_rr_list *rrl1, const ldns_rr_list *rrl2) -{ - size_t i = 0; - int rr_cmp; - - assert(rrl1 != NULL); - assert(rrl2 != NULL); - - for (i = 0; i < ldns_rr_list_rr_count(rrl1) && i < ldns_rr_list_rr_count(rrl2); i++) { - rr_cmp = ldns_rr_compare(ldns_rr_list_rr(rrl1, i), ldns_rr_list_rr(rrl2, i)); - if (rr_cmp != 0) { - return rr_cmp; - } - } - - if (i == ldns_rr_list_rr_count(rrl1) && - i != ldns_rr_list_rr_count(rrl2)) { - return 1; - } else if (i == ldns_rr_list_rr_count(rrl2) && - i != ldns_rr_list_rr_count(rrl1)) { - return -1; - } else { - return 0; - } -} - -size_t -ldns_rr_uncompressed_size(const ldns_rr *r) -{ - size_t rrsize; - size_t i; - - rrsize = 0; - /* add all the rdf sizes */ - for(i = 0; i < ldns_rr_rd_count(r); i++) { - rrsize += ldns_rdf_size(ldns_rr_rdf(r, i)); - } - /* ownername */ - rrsize += ldns_rdf_size(ldns_rr_owner(r)); - rrsize += LDNS_RR_OVERHEAD; - return rrsize; -} - -void -ldns_rr2canonical(ldns_rr *rr) -{ - uint16_t i; - - if (!rr) { - return; - } - - ldns_dname2canonical(ldns_rr_owner(rr)); - - /* - * lowercase the rdata dnames if the rr type is one - * of the list in chapter 7 of RFC3597 - * Also added RRSIG, because a "Signer's Name" should be canonicalized - * too. See dnssec-bis-updates-16. We can add it to this list because - * the "Signer's Name" is the only dname type rdata field in a RRSIG. - */ - switch(ldns_rr_get_type(rr)) { - case LDNS_RR_TYPE_NS: - case LDNS_RR_TYPE_MD: - case LDNS_RR_TYPE_MF: - case LDNS_RR_TYPE_CNAME: - case LDNS_RR_TYPE_SOA: - case LDNS_RR_TYPE_MB: - case LDNS_RR_TYPE_MG: - case LDNS_RR_TYPE_MR: - case LDNS_RR_TYPE_PTR: - case LDNS_RR_TYPE_MINFO: - case LDNS_RR_TYPE_MX: - case LDNS_RR_TYPE_RP: - case LDNS_RR_TYPE_AFSDB: - case LDNS_RR_TYPE_RT: - case LDNS_RR_TYPE_SIG: - case LDNS_RR_TYPE_PX: - case LDNS_RR_TYPE_NXT: - case LDNS_RR_TYPE_NAPTR: - case LDNS_RR_TYPE_KX: - case LDNS_RR_TYPE_SRV: - case LDNS_RR_TYPE_DNAME: - case LDNS_RR_TYPE_A6: - case LDNS_RR_TYPE_RRSIG: - for (i = 0; i < ldns_rr_rd_count(rr); i++) { - ldns_dname2canonical(ldns_rr_rdf(rr, i)); - } - return; - default: - /* do nothing */ - return; - } -} - -void -ldns_rr_list2canonical(const ldns_rr_list *rr_list) -{ - size_t i; - for (i = 0; i < ldns_rr_list_rr_count(rr_list); i++) { - ldns_rr2canonical(ldns_rr_list_rr(rr_list, i)); - } -} - -uint8_t -ldns_rr_label_count(const ldns_rr *rr) -{ - if (!rr) { - return 0; - } - return ldns_dname_label_count( - ldns_rr_owner(rr)); -} - -/** \cond */ -static const ldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; -static const ldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A }; -static const ldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_soa_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, - LDNS_RDF_TYPE_PERIOD -}; -static const ldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_wks_wireformat[] = { - LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS -}; -static const ldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_hinfo_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const ldns_rdf_type type_minfo_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_mx_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_rp_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_afsdb_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR }; -static const ldns_rdf_type type_isdn_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const ldns_rdf_type type_rt_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_nsap_wireformat[] = { - LDNS_RDF_TYPE_NSAP -}; -static const ldns_rdf_type type_nsap_ptr_wireformat[] = { - LDNS_RDF_TYPE_STR -}; -static const ldns_rdf_type type_sig_wireformat[] = { - LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_key_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_px_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_gpos_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const ldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA }; -static const ldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC }; -static const ldns_rdf_type type_nxt_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN -}; -static const ldns_rdf_type type_eid_wireformat[] = { - LDNS_RDF_TYPE_HEX -}; -static const ldns_rdf_type type_nimloc_wireformat[] = { - LDNS_RDF_TYPE_HEX -}; -static const ldns_rdf_type type_srv_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_atma_wireformat[] = { - LDNS_RDF_TYPE_ATMA -}; -static const ldns_rdf_type type_naptr_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_kx_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_cert_wireformat[] = { - LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; -static const ldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const ldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_apl_wireformat[] = { - LDNS_RDF_TYPE_APL -}; -static const ldns_rdf_type type_ds_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX -}; -static const ldns_rdf_type type_sshfp_wireformat[] = { - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX -}; -static const ldns_rdf_type type_ipseckey_wireformat[] = { - LDNS_RDF_TYPE_IPSECKEY -}; -static const ldns_rdf_type type_rrsig_wireformat[] = { - LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_nsec_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC -}; -static const ldns_rdf_type type_dhcid_wireformat[] = { - LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_talink_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -#ifdef RRTYPE_OPENPGPKEY -static const ldns_rdf_type type_openpgpkey_wireformat[] = { - LDNS_RDF_TYPE_B64 -}; -#endif -static const ldns_rdf_type type_csync_wireformat[] = { - LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC -}; -static const ldns_rdf_type type_zonemd_wireformat[] = { - LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX -}; - -/* nsec3 is some vars, followed by same type of data of nsec */ -static const ldns_rdf_type type_nsec3_wireformat[] = { -/* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC3_SALT, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC -}; - -static const ldns_rdf_type type_nsec3param_wireformat[] = { -/* LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/ - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_NSEC3_SALT -}; - -static const ldns_rdf_type type_dnskey_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_ALG, - LDNS_RDF_TYPE_B64 -}; -static const ldns_rdf_type type_tkey_wireformat[] = { - LDNS_RDF_TYPE_DNAME, - LDNS_RDF_TYPE_TIME, - LDNS_RDF_TYPE_TIME, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA, - LDNS_RDF_TYPE_INT16_DATA, -}; -static const ldns_rdf_type type_tsig_wireformat[] = { - LDNS_RDF_TYPE_DNAME, - LDNS_RDF_TYPE_TSIGTIME, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA -}; -static const ldns_rdf_type type_tlsa_wireformat[] = { - LDNS_RDF_TYPE_CERTIFICATE_USAGE, - LDNS_RDF_TYPE_SELECTOR, - LDNS_RDF_TYPE_MATCHING_TYPE, - LDNS_RDF_TYPE_HEX -}; -static const ldns_rdf_type type_hip_wireformat[] = { - LDNS_RDF_TYPE_HIP -}; -static const ldns_rdf_type type_nid_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_ILNP64 -}; -static const ldns_rdf_type type_l32_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_A -}; -static const ldns_rdf_type type_l64_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_ILNP64 -}; -static const ldns_rdf_type type_lp_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_DNAME -}; -static const ldns_rdf_type type_eui48_wireformat[] = { - LDNS_RDF_TYPE_EUI48 -}; -static const ldns_rdf_type type_eui64_wireformat[] = { - LDNS_RDF_TYPE_EUI64 -}; -static const ldns_rdf_type type_uri_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_LONG_STR -}; -static const ldns_rdf_type type_caa_wireformat[] = { - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_TAG, - LDNS_RDF_TYPE_LONG_STR -}; -#ifdef RRTYPE_DOA -static const ldns_rdf_type type_doa_wireformat[] = { - LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_STR, - LDNS_RDF_TYPE_B64 -}; -#endif -#ifdef RRTYPE_AMTRELAY -static const ldns_rdf_type type_amtrelay_wireformat[] = { - LDNS_RDF_TYPE_AMTRELAY -}; -#endif - - -/** \endcond */ - -/** \cond */ -/* All RR's defined in 1035 are well known and can thus - * be compressed. See RFC3597. These RR's are: - * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT - */ -static ldns_rr_descriptor rdata_field_descriptors[] = { - /* 0 */ - { 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 1 */ - {LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 2 */ - {LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 3 */ - {LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 4 */ - {LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 5 */ - {LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 6 */ - {LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, - /* 7 */ - {LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 8 */ - {LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 9 */ - {LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 10 */ - {LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 11 */ - {LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 12 */ - {LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 13 */ - {LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 14 */ - {LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, - /* 15 */ - {LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 16 */ - {LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, - /* 17 */ - {LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - /* 18 */ - {LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 19 */ - {LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 20 */ - {LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 21 */ - {LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 22 */ - {LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 23 */ - {LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 24 */ - {LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 25 */ - {LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 26 */ - {LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - /* 27 */ - {LDNS_RR_TYPE_GPOS, "GPOS", 3, 3, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 28 */ - {LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 29 */ - {LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 30 */ - {LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 31 */ - {LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 32 */ - {LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 33 */ - {LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 34 */ - {LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 35 */ - {LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 36 */ - {LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 37 */ - {LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 38 */ - {LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 39 */ - {LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 40 */ - {LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 41 */ - {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 42 */ - {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 }, - /* 43 */ - {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 44 */ - {LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 45 */ - {LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 46 */ - {LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 47 */ - {LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 48 */ - {LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 49 */ - {LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 50 */ - {LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 51 */ - {LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 52 */ - {LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - {LDNS_RR_TYPE_SMIMEA, "SMIMEA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 55 - * Hip ends with 0 or more Rendezvous Servers represented as dname's. - * Hence the LDNS_RDF_TYPE_DNAME _variable field and the _maximum field - * set to 0. - */ - {LDNS_RR_TYPE_HIP, "HIP", 1, 1, type_hip_wireformat, LDNS_RDF_TYPE_DNAME, LDNS_RR_NO_COMPRESS, 0 }, - -#ifdef RRTYPE_NINFO - /* 56 */ - {LDNS_RR_TYPE_NINFO, "NINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif -#ifdef RRTYPE_RKEY - /* 57 */ - {LDNS_RR_TYPE_RKEY, "RKEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - /* 58 */ - {LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - - /* 59 */ - {LDNS_RR_TYPE_CDS, "CDS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 60 */ - {LDNS_RR_TYPE_CDNSKEY, "CDNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -#ifdef RRTYPE_OPENPGPKEY - /* 61 */ - {LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE61", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - -{LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_ZONEMD, "ZONEMD", 4, 4, type_zonemd_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 99 */ - {LDNS_RR_TYPE_SPF, "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, - - /* UINFO [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* UID [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* GID [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* UNSPEC [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 104 */ - {LDNS_RR_TYPE_NID, "NID", 2, 2, type_nid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 105 */ - {LDNS_RR_TYPE_L32, "L32", 2, 2, type_l32_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 106 */ - {LDNS_RR_TYPE_L64, "L64", 2, 2, type_l64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 107 */ - {LDNS_RR_TYPE_LP, "LP", 2, 2, type_lp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 108 */ - {LDNS_RR_TYPE_EUI48, "EUI48", 1, 1, type_eui48_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 109 */ - {LDNS_RR_TYPE_EUI64, "EUI64", 1, 1, type_eui64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -{LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one. - * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9. - */ - /* 249 */ - {LDNS_RR_TYPE_TKEY, "TKEY", 7, 7, type_tkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one. - * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9. - */ - /* 250 */ - {LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - - /* IXFR: A request for a transfer of an incremental zone transfer */ -{LDNS_RR_TYPE_NULL, "TYPE251", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* AXFR: A request for a transfer of an entire zone */ -{LDNS_RR_TYPE_NULL, "TYPE252", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* MAILB: A request for mailbox-related records (MB, MG or MR) */ -{LDNS_RR_TYPE_NULL, "TYPE253", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* MAILA: A request for mail agent RRs (Obsolete - see MX) */ -{LDNS_RR_TYPE_NULL, "TYPE254", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* ANY: A request for all (available) records */ -{LDNS_RR_TYPE_NULL, "TYPE255", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 256 */ - {LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 257 */ - {LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -#ifdef RRTYPE_AVC - /* 258 */ - {LDNS_RR_TYPE_AVC, "AVC", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE258", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif -#ifdef RRTYPE_DOA - /* 259 */ - {LDNS_RR_TYPE_DOA, "DOA", 5, 5, type_doa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE259", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif -#ifdef RRTYPE_AMTRELAY - /* 260 */ - {LDNS_RR_TYPE_AMTRELAY, "AMTRELAY", 1, 1, type_amtrelay_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE260", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - -/* split in array, no longer contiguous */ - -#ifdef RRTYPE_TA - /* 32768 */ - {LDNS_RR_TYPE_TA, "TA", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE32768", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - /* 32769 */ - {LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 } -}; -/** \endcond */ - -/** - * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT - * computes the number of rdata fields - */ -#define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \ - (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0])) - - -/*---------------------------------------------------------------------------* - * The functions below return an bitmap RDF with the space required to set - * or unset all known RR types. Arguably these functions are better situated - * in rdata.c, however for the space calculation it is necesarry to walk - * through rdata_field_descriptors which is not easily possible from anywhere - * other than rr.c where it is declared static. - * - * Alternatively rr.c could have provided an iterator for rr_type or - * rdf_descriptors, but this seemed overkill for internal use only. - */ -static ldns_rr_descriptor* rdata_field_descriptors_end = - &rdata_field_descriptors[LDNS_RDATA_FIELD_DESCRIPTORS_COUNT]; - -/* From RFC3845: - * - * 2.1.2. The List of Type Bit Map(s) Field - * - * The RR type space is split into 256 window blocks, each representing - * the low-order 8 bits of the 16-bit RR type space. Each block that - * has at least one active RR type is encoded using a single octet - * window number (from 0 to 255), a single octet bitmap length (from 1 - * to 32) indicating the number of octets used for the window block's - * bitmap, and up to 32 octets (256 bits) of bitmap. - * - * Window blocks are present in the NSEC RR RDATA in increasing - * numerical order. - * - * "|" denotes concatenation - * - * Type Bit Map(s) Field = ( Window Block # | Bitmap Length | Bitmap ) + - * - * <cut> - * - * Blocks with no types present MUST NOT be included. Trailing zero - * octets in the bitmap MUST be omitted. The length of each block's - * bitmap is determined by the type code with the largest numerical - * value within that block, among the set of RR types present at the - * NSEC RR's owner name. Trailing zero octets not specified MUST be - * interpreted as zero octets. - */ -static ldns_status -ldns_rdf_bitmap_known_rr_types_set(ldns_rdf** rdf, int value) -{ - uint8_t window; /* most significant octet of type */ - uint8_t subtype; /* least significant octet of type */ - uint16_t windows[256] /* Max subtype per window */ -#ifndef S_SPLINT_S - = { 0 } -#endif - ; - ldns_rr_descriptor* d; /* used to traverse rdata_field_descriptors */ - size_t i; /* used to traverse windows array */ - - size_t sz; /* size needed for type bitmap rdf */ - uint8_t* data = NULL; /* rdf data */ - uint8_t* dptr; /* used to itraverse rdf data */ - - assert(rdf != NULL); - - /* Which windows need to be in the bitmap rdf? - */ - for (d=rdata_field_descriptors; d < rdata_field_descriptors_end; d++) { - window = d->_type >> 8; - subtype = d->_type & 0xff; - if (windows[window] < subtype) { - windows[window] = subtype; - } - } - - /* How much space do we need in the rdf for those windows? - */ - sz = 0; - for (i = 0; i < 256; i++) { - if (windows[i]) { - sz += windows[i] / 8 + 3; - } - } - if (sz > 0) { - /* Format rdf data according RFC3845 Section 2.1.2 (see above) - */ - dptr = data = LDNS_XMALLOC(uint8_t, sz); - if (!data) { - return LDNS_STATUS_MEM_ERR; - } - memset(data, value, sz); - for (i = 0; i < 256; i++) { - if (windows[i]) { - *dptr++ = (uint8_t)i; - *dptr++ = (uint8_t)(windows[i] / 8 + 1); - dptr += dptr[-1]; - } - } - } - /* Allocate and return rdf structure for the data - */ - *rdf = ldns_rdf_new(LDNS_RDF_TYPE_BITMAP, sz, data); - if (!*rdf) { - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_rdf_bitmap_known_rr_types_space(ldns_rdf** rdf) -{ - return ldns_rdf_bitmap_known_rr_types_set(rdf, 0); -} - -ldns_status -ldns_rdf_bitmap_known_rr_types(ldns_rdf** rdf) -{ - return ldns_rdf_bitmap_known_rr_types_set(rdf, 255); -} -/* End of RDF bitmap functions - *---------------------------------------------------------------------------*/ - - -const ldns_rr_descriptor * -ldns_rr_descript(uint16_t type) -{ - size_t i; - if (type < LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) { - return &rdata_field_descriptors[type]; - } else { - /* because not all array index equals type code */ - for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON; - i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; - i++) { - if (rdata_field_descriptors[i]._type == type) { - return &rdata_field_descriptors[i]; - } - } - return &rdata_field_descriptors[0]; - } -} - -size_t -ldns_rr_descriptor_minimum(const ldns_rr_descriptor *descriptor) -{ - if (descriptor) { - return descriptor->_minimum; - } else { - return 0; - } -} - -size_t -ldns_rr_descriptor_maximum(const ldns_rr_descriptor *descriptor) -{ - if (descriptor) { - if (descriptor->_variable != LDNS_RDF_TYPE_NONE) { - /* Should really be SIZE_MAX... bad FreeBSD. */ - return UINT_MAX; - } else { - return descriptor->_maximum; - } - } else { - return 0; - } -} - -ldns_rdf_type -ldns_rr_descriptor_field_type(const ldns_rr_descriptor *descriptor, - size_t index) -{ - assert(descriptor != NULL); - assert(index < descriptor->_maximum - || descriptor->_variable != LDNS_RDF_TYPE_NONE); - if (index < descriptor->_maximum) { - return descriptor->_wireformat[index]; - } else { - return descriptor->_variable; - } -} - -ldns_rr_type -ldns_get_rr_type_by_name(const char *name) -{ - unsigned int i; - const char *desc_name; - const ldns_rr_descriptor *desc; - - /* TYPEXX representation */ - if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) { - return atoi(name + 4); - } - - /* Normal types */ - for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) { - desc = &rdata_field_descriptors[i]; - desc_name = desc->_name; - if(desc_name && - strlen(name) == strlen(desc_name) && - strncasecmp(name, desc_name, strlen(desc_name)) == 0) { - /* because not all array index equals type code */ - return desc->_type; - } - } - - /* special cases for query types */ - if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) { - return 251; - } else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) { - return 252; - } else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) { - return 253; - } else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) { - return 254; - } else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) { - return 255; - } - - return 0; -} - -ldns_rr_class -ldns_get_rr_class_by_name(const char *name) -{ - ldns_lookup_table *lt; - - /* CLASSXX representation */ - if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) { - return atoi(name + 5); - } - - /* Normal types */ - lt = ldns_lookup_by_name(ldns_rr_classes, name); - - if (lt) { - return lt->id; - } - return 0; -} - - -ldns_rr_type -ldns_rdf2rr_type(const ldns_rdf *rd) -{ - ldns_rr_type r; - - if (!rd) { - return 0; - } - - if (ldns_rdf_get_type(rd) != LDNS_RDF_TYPE_TYPE) { - return 0; - } - - r = (ldns_rr_type) ldns_rdf2native_int16(rd); - return r; -} - -ldns_rr_type -ldns_rr_list_type(const ldns_rr_list *rr_list) -{ - if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { - return ldns_rr_get_type(ldns_rr_list_rr(rr_list, 0)); - } else { - return 0; - } -} - -ldns_rdf * -ldns_rr_list_owner(const ldns_rr_list *rr_list) -{ - if (rr_list && ldns_rr_list_rr_count(rr_list) > 0) { - return ldns_rr_owner(ldns_rr_list_rr(rr_list, 0)); - } else { - return NULL; - } -} diff --git a/ldns/rr_functions.c b/ldns/rr_functions.c deleted file mode 100644 index 20a0bfa..0000000 --- a/ldns/rr_functions.c +++ /dev/null @@ -1,427 +0,0 @@ -/* - * rr_function.c - * - * function that operate on specific rr types - * - * (c) NLnet Labs, 2004-2006 - * See the file LICENSE for the license - */ - -/* - * These come strait from perldoc Net::DNS::RR::xxx - * first the read variant, then the write. This is - * not complete. - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <limits.h> -#include <strings.h> - -/** - * return a specific rdf - * \param[in] type type of RR - * \param[in] rr the rr itself - * \param[in] pos at which postion to get it - * \return the rdf sought - */ -static ldns_rdf * -ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos) -{ - if (!rr || ldns_rr_get_type(rr) != type) { - return NULL; - } - return ldns_rr_rdf(rr, pos); -} - -/** - * set a specific rdf - * \param[in] type type of RR - * \param[in] rr the rr itself - * \param[in] rdf the rdf to set - * \param[in] pos at which postion to set it - * \return true or false - */ -static bool -ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos) -{ - ldns_rdf *pop; - if (!rr || ldns_rr_get_type(rr) != type) { - return false; - } - pop = ldns_rr_set_rdf(rr, rdf, pos); - ldns_rdf_deep_free(pop); - return true; -} - -/* A/AAAA records */ -ldns_rdf * -ldns_rr_a_address(const ldns_rr *r) -{ - /* 2 types to check, cannot use the macro */ - if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A && - ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) { - return NULL; - } - return ldns_rr_rdf(r, 0); -} - -bool -ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f) -{ - /* 2 types to check, cannot use the macro... */ - ldns_rdf *pop; - if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A && - ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) { - return false; - } - pop = ldns_rr_set_rdf(r, f, 0); - if (pop) { - LDNS_FREE(pop); - return true; - } else { - return false; - } -} - -/* NS record */ -ldns_rdf * -ldns_rr_ns_nsdname(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0); -} - -/* MX record */ -ldns_rdf * -ldns_rr_mx_preference(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0); -} - -ldns_rdf * -ldns_rr_mx_exchange(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1); -} - -/* RRSIG record */ -ldns_rdf * -ldns_rr_rrsig_typecovered(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0); -} - -bool -ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0); -} - -ldns_rdf * -ldns_rr_rrsig_algorithm(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1); -} - -bool -ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1); -} - -ldns_rdf * -ldns_rr_rrsig_labels(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2); -} - -bool -ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2); -} - -ldns_rdf * -ldns_rr_rrsig_origttl(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3); -} - -bool -ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3); -} - -ldns_rdf * -ldns_rr_rrsig_expiration(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4); -} - -bool -ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4); -} - -ldns_rdf * -ldns_rr_rrsig_inception(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5); -} - -bool -ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5); -} - -ldns_rdf * -ldns_rr_rrsig_keytag(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6); -} - -bool -ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6); -} - -ldns_rdf * -ldns_rr_rrsig_signame(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7); -} - -bool -ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7); -} - -ldns_rdf * -ldns_rr_rrsig_sig(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8); -} - -bool -ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8); -} - -/* DNSKEY record */ -ldns_rdf * -ldns_rr_dnskey_flags(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0); -} - -bool -ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0); -} - -ldns_rdf * -ldns_rr_dnskey_protocol(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1); -} - -bool -ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1); -} - -ldns_rdf * -ldns_rr_dnskey_algorithm(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2); -} - -bool -ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2); -} - -ldns_rdf * -ldns_rr_dnskey_key(const ldns_rr *r) -{ - return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3); -} - -bool -ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f) -{ - return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3); -} - -size_t -ldns_rr_dnskey_key_size_raw(const unsigned char* keydata, - const size_t len, - const ldns_algorithm alg) -{ - /* for DSA keys */ - uint8_t t; - - /* for RSA keys */ - uint16_t exp; - uint16_t int16; - - switch ((ldns_signing_algorithm)alg) { - case LDNS_SIGN_DSA: - case LDNS_SIGN_DSA_NSEC3: - if (len > 0) { - t = keydata[0]; - return (64 + t*8)*8; - } else { - return 0; - } - break; - case LDNS_SIGN_RSAMD5: - case LDNS_SIGN_RSASHA1: - case LDNS_SIGN_RSASHA1_NSEC3: -#ifdef USE_SHA2 - case LDNS_SIGN_RSASHA256: - case LDNS_SIGN_RSASHA512: -#endif - if (len > 0) { - if (keydata[0] == 0) { - /* big exponent */ - if (len > 3) { - memmove(&int16, keydata + 1, 2); - exp = ntohs(int16); - return (len - exp - 3)*8; - } else { - return 0; - } - } else { - exp = keydata[0]; - return (len-exp-1)*8; - } - } else { - return 0; - } - break; -#ifdef USE_GOST - case LDNS_SIGN_ECC_GOST: - return 512; -#endif -#ifdef USE_ECDSA - case LDNS_SIGN_ECDSAP256SHA256: - return 256; - case LDNS_SIGN_ECDSAP384SHA384: - return 384; -#endif -#ifdef USE_ED25519 - case LDNS_SIGN_ED25519: - return 256; -#endif -#ifdef USE_ED448 - case LDNS_SIGN_ED448: - return 456; -#endif - case LDNS_SIGN_HMACMD5: - return len; - default: - return 0; - } -} - -size_t -ldns_rr_dnskey_key_size(const ldns_rr *key) -{ - if (!key || !ldns_rr_dnskey_key(key) - || !ldns_rr_dnskey_algorithm(key)) { - return 0; - } - return ldns_rr_dnskey_key_size_raw((unsigned char*)ldns_rdf_data(ldns_rr_dnskey_key(key)), - ldns_rdf_size(ldns_rr_dnskey_key(key)), - ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key)) - ); -} - -uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(unused), void *data) -{ - return (uint32_t) (intptr_t) data; -} - -uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(unused)) -{ - return ldns_soa_serial_increment_by(s, (void *)1); -} - -uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data) -{ - return s + (intptr_t) data; -} - -uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data) -{ - struct tm tm; - char s_str[11]; - int32_t new_s; - time_t t = data ? (time_t) (intptr_t) data : ldns_time(NULL); - - (void) strftime(s_str, 11, "%Y%m%d00", localtime_r(&t, &tm)); - new_s = (int32_t) atoi(s_str); - return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s); -} - -uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data) -{ - int32_t new_s = data ? (int32_t) (intptr_t) data - : (int32_t) ldns_time(NULL); - return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s); -} - -void -ldns_rr_soa_increment(ldns_rr *soa) -{ - ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL); -} - -void -ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f) -{ - ldns_rr_soa_increment_func_data(soa, f, NULL); -} - -void -ldns_rr_soa_increment_func_data(ldns_rr *soa, - ldns_soa_serial_increment_func_t f, void *data) -{ - ldns_rdf *prev_soa_serial_rdf; - if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA - || !ldns_rr_rdf(soa, 2)) { - return; - } - prev_soa_serial_rdf = ldns_rr_set_rdf( - soa - , ldns_native2rdf_int32( - LDNS_RDF_TYPE_INT32 - , (*f)( ldns_rdf2native_int32( - ldns_rr_rdf(soa, 2)) - , data - ) - ) - , 2 - ); - LDNS_FREE(prev_soa_serial_rdf); -} - -void -ldns_rr_soa_increment_func_int(ldns_rr *soa, - ldns_soa_serial_increment_func_t f, int data) -{ - ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data); -} - diff --git a/ldns/sha1.c b/ldns/sha1.c deleted file mode 100644 index 96e8f96..0000000 --- a/ldns/sha1.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * modified for ldns by Jelte Jansen, original taken from OpenBSD: - * - * SHA-1 in C - * By Steve Reid <steve@edmweb.com> - * 100% Public Domain - * - * Test Vectors (from FIPS PUB 180-1) - * "abc" - * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D - * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 - * A million repetitions of "a" - * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ - -#include <ldns/config.h> -#include <ldns/ldns.h> -#include <strings.h> - -#define SHA1HANDSOFF 1 /* Copies data before messing with it. */ -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#if BYTE_ORDER == LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#else -#define blk0(i) block->l[i] -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void -ldns_sha1_transform(uint32_t state[5], const unsigned char buffer[LDNS_SHA1_BLOCK_LENGTH]) -{ - uint32_t a, b, c, d, e; - typedef union { - unsigned char c[64]; - unsigned int l[16]; - } CHAR64LONG16; - CHAR64LONG16* block; -#ifdef SHA1HANDSOFF - unsigned char workspace[LDNS_SHA1_BLOCK_LENGTH]; - - block = (CHAR64LONG16 *)workspace; - memmove(block, buffer, LDNS_SHA1_BLOCK_LENGTH); -#else - block = (CHAR64LONG16 *)buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; - (void)a; -} - - -/* SHA1Init - Initialize new context */ - -void -ldns_sha1_init(ldns_sha1_ctx *context) -{ - /* SHA1 initialization constants */ - context->count = 0; - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; -} - - -/* Run your data through this. */ - -void -ldns_sha1_update(ldns_sha1_ctx *context, const unsigned char *data, unsigned int len) -{ - unsigned int i; - unsigned int j; - - j = (unsigned)(uint32_t)((context->count >> 3) & 63); - context->count += (len << 3); - if ((j + len) > 63) { - memmove(&context->buffer[j], data, (i = 64 - j)); - ldns_sha1_transform(context->state, context->buffer); - for ( ; i + 63 < len; i += 64) { - ldns_sha1_transform(context->state, &data[i]); - } - j = 0; - } - else i = 0; - memmove(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void -ldns_sha1_final(unsigned char digest[LDNS_SHA1_DIGEST_LENGTH], ldns_sha1_ctx *context) -{ - unsigned int i; - unsigned char finalcount[8]; - - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count >> - ((7 - (i & 7)) * 8)) & 255); /* Endian independent */ - } - ldns_sha1_update(context, (unsigned char *)"\200", 1); - while ((context->count & 504) != 448) { - ldns_sha1_update(context, (unsigned char *)"\0", 1); - } - ldns_sha1_update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - - if (digest != NULL) - for (i = 0; i < LDNS_SHA1_DIGEST_LENGTH; i++) { - digest[i] = (unsigned char)((context->state[i >> 2] >> - ((3 - (i & 3)) * 8)) & 255); - } -#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */ - ldns_sha1_transform(context->state, context->buffer); -#endif -} - -unsigned char * -ldns_sha1(unsigned char *data, unsigned int data_len, unsigned char *digest) -{ - ldns_sha1_ctx ctx; - ldns_sha1_init(&ctx); - ldns_sha1_update(&ctx, data, data_len); - ldns_sha1_final(digest, &ctx); - return digest; -} diff --git a/ldns/sha2.c b/ldns/sha2.c deleted file mode 100644 index e0b1f4b..0000000 --- a/ldns/sha2.c +++ /dev/null @@ -1,998 +0,0 @@ -/* - * FILE: sha2.c - * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/ - * - * Copyright (c) 2000-2001, Aaron D. Gifford - * All rights reserved. - * - * Modified by Jelte Jansen to fit in ldns, and not clash with any - * system-defined SHA code. - * Changes: - * - Renamed (external) functions and constants to fit ldns style - * - Removed _End and _Data functions - * - Added ldns_shaX(data, len, digest) convenience functions - * - Removed prototypes of _Transform functions and made those static - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holder nor the names of contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $Id: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $ - */ - -#include <ldns/config.h> -#include <string.h> /* memcpy()/memset() or bcopy()/bzero() */ -#include <assert.h> /* assert() */ -#include <ldns/sha2.h> - -/* - * ASSERT NOTE: - * Some sanity checking code is included using assert(). On my FreeBSD - * system, this additional code can be removed by compiling with NDEBUG - * defined. Check your own systems manpage on assert() to see how to - * compile WITHOUT the sanity checking code on your system. - * - * UNROLLED TRANSFORM LOOP NOTE: - * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform - * loop version for the hash transform rounds (defined using macros - * later in this file). Either define on the command line, for example: - * - * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c - * - * or define below: - * - * #define SHA2_UNROLL_TRANSFORM - * - */ - - -/*** SHA-256/384/512 Machine Architecture Definitions *****************/ -/* - * BYTE_ORDER NOTE: - * - * Please make sure that your system defines BYTE_ORDER. If your - * architecture is little-endian, make sure it also defines - * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are - * equivilent. - * - * If your system does not define the above, then you can do so by - * hand like this: - * - * #define LITTLE_ENDIAN 1234 - * #define BIG_ENDIAN 4321 - * - * And for little-endian machines, add: - * - * #define BYTE_ORDER LITTLE_ENDIAN - * - * Or for big-endian machines: - * - * #define BYTE_ORDER BIG_ENDIAN - * - * The FreeBSD machine this was written on defines BYTE_ORDER - * appropriately by including <sys/types.h> (which in turn includes - * <machine/endian.h> where the appropriate definitions are actually - * made). - */ -#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) -#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN -#endif - -typedef uint8_t sha2_byte; /* Exactly 1 byte */ -typedef uint32_t sha2_word32; /* Exactly 4 bytes */ -#ifdef S_SPLINT_S -typedef unsigned long long sha2_word64; /* lint 8 bytes */ -#else -typedef uint64_t sha2_word64; /* Exactly 8 bytes */ -#endif - -/*** SHA-256/384/512 Various Length Definitions ***********************/ -/* NOTE: Most of these are in sha2.h */ -#define ldns_sha256_SHORT_BLOCK_LENGTH (LDNS_SHA256_BLOCK_LENGTH - 8) -#define ldns_sha384_SHORT_BLOCK_LENGTH (LDNS_SHA384_BLOCK_LENGTH - 16) -#define ldns_sha512_SHORT_BLOCK_LENGTH (LDNS_SHA512_BLOCK_LENGTH - 16) - - -/*** ENDIAN REVERSAL MACROS *******************************************/ -#if BYTE_ORDER == LITTLE_ENDIAN -#define REVERSE32(w,x) { \ - sha2_word32 tmp = (w); \ - tmp = (tmp >> 16) | (tmp << 16); \ - (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \ -} -#ifndef S_SPLINT_S -#define REVERSE64(w,x) { \ - sha2_word64 tmp = (w); \ - tmp = (tmp >> 32) | (tmp << 32); \ - tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \ - ((tmp & 0x00ff00ff00ff00ffULL) << 8); \ - (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \ - ((tmp & 0x0000ffff0000ffffULL) << 16); \ -} -#else /* splint */ -#define REVERSE64(w,x) /* splint */ -#endif /* splint */ -#endif /* BYTE_ORDER == LITTLE_ENDIAN */ - -/* - * Macro for incrementally adding the unsigned 64-bit integer n to the - * unsigned 128-bit integer (represented using a two-element array of - * 64-bit words): - */ -#define ADDINC128(w,n) { \ - (w)[0] += (sha2_word64)(n); \ - if ((w)[0] < (n)) { \ - (w)[1]++; \ - } \ -} -#ifdef S_SPLINT_S -#undef ADDINC128 -#define ADDINC128(w,n) /* splint */ -#endif - -/* - * Macros for copying blocks of memory and for zeroing out ranges - * of memory. Using these macros makes it easy to switch from - * using memset()/memcpy() and using bzero()/bcopy(). - * - * Please define either SHA2_USE_MEMSET_MEMCPY or define - * SHA2_USE_BZERO_BCOPY depending on which function set you - * choose to use: - */ -#if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY) -/* Default to memset()/memcpy() if no option is specified */ -#define SHA2_USE_MEMSET_MEMCPY 1 -#endif -#if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY) -/* Abort with an error if BOTH options are defined */ -#error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both! -#endif - -#ifdef SHA2_USE_MEMSET_MEMCPY -#define MEMSET_BZERO(p,l) memset((p), 0, (l)) -#define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l)) -#endif -#ifdef SHA2_USE_BZERO_BCOPY -#define MEMSET_BZERO(p,l) bzero((p), (l)) -#define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l)) -#endif - - -/*** THE SIX LOGICAL FUNCTIONS ****************************************/ -/* - * Bit shifting and rotation (used by the six SHA-XYZ logical functions: - * - * NOTE: The naming of R and S appears backwards here (R is a SHIFT and - * S is a ROTATION) because the SHA-256/384/512 description document - * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this - * same "backwards" definition. - */ -/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */ -#define R(b,x) ((x) >> (b)) -/* 32-bit Rotate-right (used in SHA-256): */ -#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b)))) -/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */ -#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b)))) - -/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */ -#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z))) -#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) - -/* Four of six logical functions used in SHA-256: */ -#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x))) -#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x))) -#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x))) -#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x))) - -/* Four of six logical functions used in SHA-384 and SHA-512: */ -#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x))) -#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x))) -#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x))) -#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x))) - -/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/ -/* Hash constant words K for SHA-256: */ -static const sha2_word32 K256[64] = { - 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, - 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, - 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, - 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, - 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, - 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, - 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, - 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, - 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, - 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, - 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, - 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, - 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, - 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, - 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, - 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL -}; - -/* initial hash value H for SHA-256: */ -static const sha2_word32 ldns_sha256_initial_hash_value[8] = { - 0x6a09e667UL, - 0xbb67ae85UL, - 0x3c6ef372UL, - 0xa54ff53aUL, - 0x510e527fUL, - 0x9b05688cUL, - 0x1f83d9abUL, - 0x5be0cd19UL -}; - -/* Hash constant words K for SHA-384 and SHA-512: */ -static const sha2_word64 K512[80] = { - 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, - 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, - 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, - 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, - 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, - 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, - 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, - 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, - 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, - 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, - 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, - 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, - 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, - 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, - 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, - 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, - 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, - 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, - 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, - 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, - 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, - 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, - 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, - 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, - 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, - 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, - 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, - 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, - 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, - 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, - 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, - 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, - 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, - 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, - 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, - 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, - 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, - 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, - 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, - 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL -}; - -/* initial hash value H for SHA-384 */ -static const sha2_word64 sha384_initial_hash_value[8] = { - 0xcbbb9d5dc1059ed8ULL, - 0x629a292a367cd507ULL, - 0x9159015a3070dd17ULL, - 0x152fecd8f70e5939ULL, - 0x67332667ffc00b31ULL, - 0x8eb44a8768581511ULL, - 0xdb0c2e0d64f98fa7ULL, - 0x47b5481dbefa4fa4ULL -}; - -/* initial hash value H for SHA-512 */ -static const sha2_word64 sha512_initial_hash_value[8] = { - 0x6a09e667f3bcc908ULL, - 0xbb67ae8584caa73bULL, - 0x3c6ef372fe94f82bULL, - 0xa54ff53a5f1d36f1ULL, - 0x510e527fade682d1ULL, - 0x9b05688c2b3e6c1fULL, - 0x1f83d9abfb41bd6bULL, - 0x5be0cd19137e2179ULL -}; - -/*** SHA-256: *********************************************************/ -void ldns_sha256_init(ldns_sha256_CTX* context) { - if (context == (ldns_sha256_CTX*)0) { - return; - } - MEMCPY_BCOPY(context->state, ldns_sha256_initial_hash_value, LDNS_SHA256_DIGEST_LENGTH); - MEMSET_BZERO(context->buffer, LDNS_SHA256_BLOCK_LENGTH); - context->bitcount = 0; -} - -#ifdef SHA2_UNROLL_TRANSFORM - -/* Unrolled SHA-256 round macros: */ - -#if BYTE_ORDER == LITTLE_ENDIAN - -#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ - REVERSE32(*data++, W256[j]); \ - T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \ - K256[j] + W256[j]; \ - (d) += T1; \ - (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ - j++ - - -#else /* BYTE_ORDER == LITTLE_ENDIAN */ - -#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \ - T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \ - K256[j] + (W256[j] = *data++); \ - (d) += T1; \ - (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ - j++ - -#endif /* BYTE_ORDER == LITTLE_ENDIAN */ - -#define ROUND256(a,b,c,d,e,f,g,h) \ - s0 = W256[(j+1)&0x0f]; \ - s0 = sigma0_256(s0); \ - s1 = W256[(j+14)&0x0f]; \ - s1 = sigma1_256(s1); \ - T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \ - (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \ - (d) += T1; \ - (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \ - j++ - -static void ldns_sha256_Transform(ldns_sha256_CTX* context, - const sha2_word32* data) { - sha2_word32 a, b, c, d, e, f, g, h, s0, s1; - sha2_word32 T1, *W256; - int j; - - W256 = (sha2_word32*)context->buffer; - - /* initialize registers with the prev. intermediate value */ - a = context->state[0]; - b = context->state[1]; - c = context->state[2]; - d = context->state[3]; - e = context->state[4]; - f = context->state[5]; - g = context->state[6]; - h = context->state[7]; - - j = 0; - do { - /* Rounds 0 to 15 (unrolled): */ - ROUND256_0_TO_15(a,b,c,d,e,f,g,h); - ROUND256_0_TO_15(h,a,b,c,d,e,f,g); - ROUND256_0_TO_15(g,h,a,b,c,d,e,f); - ROUND256_0_TO_15(f,g,h,a,b,c,d,e); - ROUND256_0_TO_15(e,f,g,h,a,b,c,d); - ROUND256_0_TO_15(d,e,f,g,h,a,b,c); - ROUND256_0_TO_15(c,d,e,f,g,h,a,b); - ROUND256_0_TO_15(b,c,d,e,f,g,h,a); - } while (j < 16); - - /* Now for the remaining rounds to 64: */ - do { - ROUND256(a,b,c,d,e,f,g,h); - ROUND256(h,a,b,c,d,e,f,g); - ROUND256(g,h,a,b,c,d,e,f); - ROUND256(f,g,h,a,b,c,d,e); - ROUND256(e,f,g,h,a,b,c,d); - ROUND256(d,e,f,g,h,a,b,c); - ROUND256(c,d,e,f,g,h,a,b); - ROUND256(b,c,d,e,f,g,h,a); - } while (j < 64); - - /* Compute the current intermediate hash value */ - context->state[0] += a; - context->state[1] += b; - context->state[2] += c; - context->state[3] += d; - context->state[4] += e; - context->state[5] += f; - context->state[6] += g; - context->state[7] += h; - - /* Clean up */ - a = b = c = d = e = f = g = h = T1 = 0; -} - -#else /* SHA2_UNROLL_TRANSFORM */ - -static void ldns_sha256_Transform(ldns_sha256_CTX* context, - const sha2_word32* data) { - sha2_word32 a, b, c, d, e, f, g, h, s0, s1; - sha2_word32 T1, T2, *W256; - int j; - - W256 = (sha2_word32*)context->buffer; - - /* initialize registers with the prev. intermediate value */ - a = context->state[0]; - b = context->state[1]; - c = context->state[2]; - d = context->state[3]; - e = context->state[4]; - f = context->state[5]; - g = context->state[6]; - h = context->state[7]; - - j = 0; - do { -#if BYTE_ORDER == LITTLE_ENDIAN - /* Copy data while converting to host byte order */ - REVERSE32(*data++,W256[j]); - /* Apply the SHA-256 compression function to update a..h */ - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j]; -#else /* BYTE_ORDER == LITTLE_ENDIAN */ - /* Apply the SHA-256 compression function to update a..h with copy */ - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++); -#endif /* BYTE_ORDER == LITTLE_ENDIAN */ - T2 = Sigma0_256(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 16); - - do { - /* Part of the message block expansion: */ - s0 = W256[(j+1)&0x0f]; - s0 = sigma0_256(s0); - s1 = W256[(j+14)&0x0f]; - s1 = sigma1_256(s1); - - /* Apply the SHA-256 compression function to update a..h */ - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + - (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); - T2 = Sigma0_256(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 64); - - /* Compute the current intermediate hash value */ - context->state[0] += a; - context->state[1] += b; - context->state[2] += c; - context->state[3] += d; - context->state[4] += e; - context->state[5] += f; - context->state[6] += g; - context->state[7] += h; - - /* Clean up */ - a = b = c = d = e = f = g = h = T1 = T2 = 0; - (void)a; -} - -#endif /* SHA2_UNROLL_TRANSFORM */ - -void ldns_sha256_update(ldns_sha256_CTX* context, const sha2_byte *data, size_t len) { - size_t freespace, usedspace; - - if (len == 0) { - /* Calling with no data is valid - we do nothing */ - return; - } - - /* Sanity check: */ - assert(context != (ldns_sha256_CTX*)0 && data != (sha2_byte*)0); - - usedspace = (context->bitcount >> 3) % LDNS_SHA256_BLOCK_LENGTH; - if (usedspace > 0) { - /* Calculate how much free space is available in the buffer */ - freespace = LDNS_SHA256_BLOCK_LENGTH - usedspace; - - if (len >= freespace) { - /* Fill the buffer completely and process it */ - MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace); - context->bitcount += freespace << 3; - len -= freespace; - data += freespace; - ldns_sha256_Transform(context, (sha2_word32*)context->buffer); - } else { - /* The buffer is not yet full */ - MEMCPY_BCOPY(&context->buffer[usedspace], data, len); - context->bitcount += len << 3; - /* Clean up: */ - usedspace = freespace = 0; - (void)usedspace; - return; - } - } - while (len >= LDNS_SHA256_BLOCK_LENGTH) { - /* Process as many complete blocks as we can */ - ldns_sha256_Transform(context, (sha2_word32*)data); - context->bitcount += LDNS_SHA256_BLOCK_LENGTH << 3; - len -= LDNS_SHA256_BLOCK_LENGTH; - data += LDNS_SHA256_BLOCK_LENGTH; - } - if (len > 0) { - /* There's left-overs, so save 'em */ - MEMCPY_BCOPY(context->buffer, data, len); - context->bitcount += len << 3; - } - /* Clean up: */ - usedspace = freespace = 0; - (void)usedspace; -} - -typedef union _ldns_sha2_buffer_union { - uint8_t* theChars; - uint64_t* theLongs; -} ldns_sha2_buffer_union; - -void ldns_sha256_final(sha2_byte digest[], ldns_sha256_CTX* context) { - sha2_word32 *d = (sha2_word32*)digest; - size_t usedspace; - ldns_sha2_buffer_union cast_var; - - /* Sanity check: */ - assert(context != (ldns_sha256_CTX*)0); - - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { - usedspace = (context->bitcount >> 3) % LDNS_SHA256_BLOCK_LENGTH; -#if BYTE_ORDER == LITTLE_ENDIAN - /* Convert FROM host byte order */ - REVERSE64(context->bitcount,context->bitcount); -#endif - if (usedspace > 0) { - /* Begin padding with a 1 bit: */ - context->buffer[usedspace++] = 0x80; - - if (usedspace <= ldns_sha256_SHORT_BLOCK_LENGTH) { - /* Set-up for the last transform: */ - MEMSET_BZERO(&context->buffer[usedspace], ldns_sha256_SHORT_BLOCK_LENGTH - usedspace); - } else { - if (usedspace < LDNS_SHA256_BLOCK_LENGTH) { - MEMSET_BZERO(&context->buffer[usedspace], LDNS_SHA256_BLOCK_LENGTH - usedspace); - } - /* Do second-to-last transform: */ - ldns_sha256_Transform(context, (sha2_word32*)context->buffer); - - /* And set-up for the last transform: */ - MEMSET_BZERO(context->buffer, ldns_sha256_SHORT_BLOCK_LENGTH); - } - } else { - /* Set-up for the last transform: */ - MEMSET_BZERO(context->buffer, ldns_sha256_SHORT_BLOCK_LENGTH); - - /* Begin padding with a 1 bit: */ - *context->buffer = 0x80; - } - /* Set the bit count: */ - cast_var.theChars = context->buffer; - cast_var.theLongs[ldns_sha256_SHORT_BLOCK_LENGTH / 8] = context->bitcount; - - /* final transform: */ - ldns_sha256_Transform(context, (sha2_word32*)context->buffer); - -#if BYTE_ORDER == LITTLE_ENDIAN - { - /* Convert TO host byte order */ - int j; - for (j = 0; j < 8; j++) { - REVERSE32(context->state[j],context->state[j]); - *d++ = context->state[j]; - } - } -#else - MEMCPY_BCOPY(d, context->state, LDNS_SHA256_DIGEST_LENGTH); -#endif - } - - /* Clean up state data: */ - MEMSET_BZERO(context, sizeof(ldns_sha256_CTX)); - usedspace = 0; - (void)usedspace; -} - -unsigned char * -ldns_sha256(unsigned char *data, unsigned int data_len, unsigned char *digest) -{ - ldns_sha256_CTX ctx; - ldns_sha256_init(&ctx); - ldns_sha256_update(&ctx, data, data_len); - ldns_sha256_final(digest, &ctx); - return digest; -} - -/*** SHA-512: *********************************************************/ -void ldns_sha512_init(ldns_sha512_CTX* context) { - if (context == (ldns_sha512_CTX*)0) { - return; - } - MEMCPY_BCOPY(context->state, sha512_initial_hash_value, LDNS_SHA512_DIGEST_LENGTH); - MEMSET_BZERO(context->buffer, LDNS_SHA512_BLOCK_LENGTH); - context->bitcount[0] = context->bitcount[1] = 0; -} - -#ifdef SHA2_UNROLL_TRANSFORM - -/* Unrolled SHA-512 round macros: */ -#if BYTE_ORDER == LITTLE_ENDIAN - -#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ - REVERSE64(*data++, W512[j]); \ - T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \ - K512[j] + W512[j]; \ - (d) += T1, \ - (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \ - j++ - - -#else /* BYTE_ORDER == LITTLE_ENDIAN */ - -#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ - T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \ - K512[j] + (W512[j] = *data++); \ - (d) += T1; \ - (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ - j++ - -#endif /* BYTE_ORDER == LITTLE_ENDIAN */ - -#define ROUND512(a,b,c,d,e,f,g,h) \ - s0 = W512[(j+1)&0x0f]; \ - s0 = sigma0_512(s0); \ - s1 = W512[(j+14)&0x0f]; \ - s1 = sigma1_512(s1); \ - T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \ - (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \ - (d) += T1; \ - (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ - j++ - -static void ldns_sha512_Transform(ldns_sha512_CTX* context, - const sha2_word64* data) { - sha2_word64 a, b, c, d, e, f, g, h, s0, s1; - sha2_word64 T1, *W512 = (sha2_word64*)context->buffer; - int j; - - /* initialize registers with the prev. intermediate value */ - a = context->state[0]; - b = context->state[1]; - c = context->state[2]; - d = context->state[3]; - e = context->state[4]; - f = context->state[5]; - g = context->state[6]; - h = context->state[7]; - - j = 0; - do { - ROUND512_0_TO_15(a,b,c,d,e,f,g,h); - ROUND512_0_TO_15(h,a,b,c,d,e,f,g); - ROUND512_0_TO_15(g,h,a,b,c,d,e,f); - ROUND512_0_TO_15(f,g,h,a,b,c,d,e); - ROUND512_0_TO_15(e,f,g,h,a,b,c,d); - ROUND512_0_TO_15(d,e,f,g,h,a,b,c); - ROUND512_0_TO_15(c,d,e,f,g,h,a,b); - ROUND512_0_TO_15(b,c,d,e,f,g,h,a); - } while (j < 16); - - /* Now for the remaining rounds up to 79: */ - do { - ROUND512(a,b,c,d,e,f,g,h); - ROUND512(h,a,b,c,d,e,f,g); - ROUND512(g,h,a,b,c,d,e,f); - ROUND512(f,g,h,a,b,c,d,e); - ROUND512(e,f,g,h,a,b,c,d); - ROUND512(d,e,f,g,h,a,b,c); - ROUND512(c,d,e,f,g,h,a,b); - ROUND512(b,c,d,e,f,g,h,a); - } while (j < 80); - - /* Compute the current intermediate hash value */ - context->state[0] += a; - context->state[1] += b; - context->state[2] += c; - context->state[3] += d; - context->state[4] += e; - context->state[5] += f; - context->state[6] += g; - context->state[7] += h; - - /* Clean up */ - a = b = c = d = e = f = g = h = T1 = 0; -} - -#else /* SHA2_UNROLL_TRANSFORM */ - -static void ldns_sha512_Transform(ldns_sha512_CTX* context, - const sha2_word64* data) { - sha2_word64 a, b, c, d, e, f, g, h, s0, s1; - sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer; - int j; - - /* initialize registers with the prev. intermediate value */ - a = context->state[0]; - b = context->state[1]; - c = context->state[2]; - d = context->state[3]; - e = context->state[4]; - f = context->state[5]; - g = context->state[6]; - h = context->state[7]; - - j = 0; - do { -#if BYTE_ORDER == LITTLE_ENDIAN - /* Convert TO host byte order */ - REVERSE64(*data++, W512[j]); - /* Apply the SHA-512 compression function to update a..h */ - T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j]; -#else /* BYTE_ORDER == LITTLE_ENDIAN */ - /* Apply the SHA-512 compression function to update a..h with copy */ - T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++); -#endif /* BYTE_ORDER == LITTLE_ENDIAN */ - T2 = Sigma0_512(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 16); - - do { - /* Part of the message block expansion: */ - s0 = W512[(j+1)&0x0f]; - s0 = sigma0_512(s0); - s1 = W512[(j+14)&0x0f]; - s1 = sigma1_512(s1); - - /* Apply the SHA-512 compression function to update a..h */ - T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + - (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); - T2 = Sigma0_512(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 80); - - /* Compute the current intermediate hash value */ - context->state[0] += a; - context->state[1] += b; - context->state[2] += c; - context->state[3] += d; - context->state[4] += e; - context->state[5] += f; - context->state[6] += g; - context->state[7] += h; - - /* Clean up */ - a = b = c = d = e = f = g = h = T1 = T2 = 0; - (void)a; -} - -#endif /* SHA2_UNROLL_TRANSFORM */ - -void ldns_sha512_update(ldns_sha512_CTX* context, const sha2_byte *data, size_t len) { - size_t freespace, usedspace; - - if (len == 0) { - /* Calling with no data is valid - we do nothing */ - return; - } - - /* Sanity check: */ - assert(context != (ldns_sha512_CTX*)0 && data != (sha2_byte*)0); - - usedspace = (context->bitcount[0] >> 3) % LDNS_SHA512_BLOCK_LENGTH; - if (usedspace > 0) { - /* Calculate how much free space is available in the buffer */ - freespace = LDNS_SHA512_BLOCK_LENGTH - usedspace; - - if (len >= freespace) { - /* Fill the buffer completely and process it */ - MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace); - ADDINC128(context->bitcount, freespace << 3); - len -= freespace; - data += freespace; - ldns_sha512_Transform(context, (sha2_word64*)context->buffer); - } else { - /* The buffer is not yet full */ - MEMCPY_BCOPY(&context->buffer[usedspace], data, len); - ADDINC128(context->bitcount, len << 3); - /* Clean up: */ - usedspace = freespace = 0; - (void)usedspace; - return; - } - } - while (len >= LDNS_SHA512_BLOCK_LENGTH) { - /* Process as many complete blocks as we can */ - ldns_sha512_Transform(context, (sha2_word64*)data); - ADDINC128(context->bitcount, LDNS_SHA512_BLOCK_LENGTH << 3); - len -= LDNS_SHA512_BLOCK_LENGTH; - data += LDNS_SHA512_BLOCK_LENGTH; - } - if (len > 0) { - /* There's left-overs, so save 'em */ - MEMCPY_BCOPY(context->buffer, data, len); - ADDINC128(context->bitcount, len << 3); - } - /* Clean up: */ - usedspace = freespace = 0; - (void)usedspace; -} - -static void ldns_sha512_Last(ldns_sha512_CTX* context) { - size_t usedspace; - ldns_sha2_buffer_union cast_var; - - usedspace = (context->bitcount[0] >> 3) % LDNS_SHA512_BLOCK_LENGTH; -#if BYTE_ORDER == LITTLE_ENDIAN - /* Convert FROM host byte order */ - REVERSE64(context->bitcount[0],context->bitcount[0]); - REVERSE64(context->bitcount[1],context->bitcount[1]); -#endif - if (usedspace > 0) { - /* Begin padding with a 1 bit: */ - context->buffer[usedspace++] = 0x80; - - if (usedspace <= ldns_sha512_SHORT_BLOCK_LENGTH) { - /* Set-up for the last transform: */ - MEMSET_BZERO(&context->buffer[usedspace], ldns_sha512_SHORT_BLOCK_LENGTH - usedspace); - } else { - if (usedspace < LDNS_SHA512_BLOCK_LENGTH) { - MEMSET_BZERO(&context->buffer[usedspace], LDNS_SHA512_BLOCK_LENGTH - usedspace); - } - /* Do second-to-last transform: */ - ldns_sha512_Transform(context, (sha2_word64*)context->buffer); - - /* And set-up for the last transform: */ - MEMSET_BZERO(context->buffer, LDNS_SHA512_BLOCK_LENGTH - 2); - } - } else { - /* Prepare for final transform: */ - MEMSET_BZERO(context->buffer, ldns_sha512_SHORT_BLOCK_LENGTH); - - /* Begin padding with a 1 bit: */ - *context->buffer = 0x80; - } - /* Store the length of input data (in bits): */ - cast_var.theChars = context->buffer; - cast_var.theLongs[ldns_sha512_SHORT_BLOCK_LENGTH / 8] = context->bitcount[1]; - cast_var.theLongs[ldns_sha512_SHORT_BLOCK_LENGTH / 8 + 1] = context->bitcount[0]; - - /* final transform: */ - ldns_sha512_Transform(context, (sha2_word64*)context->buffer); -} - -void ldns_sha512_final(sha2_byte digest[], ldns_sha512_CTX* context) { - sha2_word64 *d = (sha2_word64*)digest; - - /* Sanity check: */ - assert(context != (ldns_sha512_CTX*)0); - - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { - ldns_sha512_Last(context); - - /* Save the hash data for output: */ -#if BYTE_ORDER == LITTLE_ENDIAN - { - /* Convert TO host byte order */ - int j; - for (j = 0; j < 8; j++) { - REVERSE64(context->state[j],context->state[j]); - *d++ = context->state[j]; - } - } -#else - MEMCPY_BCOPY(d, context->state, LDNS_SHA512_DIGEST_LENGTH); -#endif - } - - /* Zero out state data */ - MEMSET_BZERO(context, sizeof(ldns_sha512_CTX)); -} - -unsigned char * -ldns_sha512(unsigned char *data, unsigned int data_len, unsigned char *digest) -{ - ldns_sha512_CTX ctx; - ldns_sha512_init(&ctx); - ldns_sha512_update(&ctx, data, data_len); - ldns_sha512_final(digest, &ctx); - return digest; -} - -/*** SHA-384: *********************************************************/ -void ldns_sha384_init(ldns_sha384_CTX* context) { - if (context == (ldns_sha384_CTX*)0) { - return; - } - MEMCPY_BCOPY(context->state, sha384_initial_hash_value, LDNS_SHA512_DIGEST_LENGTH); - MEMSET_BZERO(context->buffer, LDNS_SHA384_BLOCK_LENGTH); - context->bitcount[0] = context->bitcount[1] = 0; -} - -void ldns_sha384_update(ldns_sha384_CTX* context, const sha2_byte* data, size_t len) { - ldns_sha512_update((ldns_sha512_CTX*)context, data, len); -} - -void ldns_sha384_final(sha2_byte digest[], ldns_sha384_CTX* context) { - sha2_word64 *d = (sha2_word64*)digest; - - /* Sanity check: */ - assert(context != (ldns_sha384_CTX*)0); - - /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { - ldns_sha512_Last((ldns_sha512_CTX*)context); - - /* Save the hash data for output: */ -#if BYTE_ORDER == LITTLE_ENDIAN - { - /* Convert TO host byte order */ - int j; - for (j = 0; j < 6; j++) { - REVERSE64(context->state[j],context->state[j]); - *d++ = context->state[j]; - } - } -#else - MEMCPY_BCOPY(d, context->state, LDNS_SHA384_DIGEST_LENGTH); -#endif - } - - /* Zero out state data */ - MEMSET_BZERO(context, sizeof(ldns_sha384_CTX)); -} - -unsigned char * -ldns_sha384(unsigned char *data, unsigned int data_len, unsigned char *digest) -{ - ldns_sha384_CTX ctx; - ldns_sha384_init(&ctx); - ldns_sha384_update(&ctx, data, data_len); - ldns_sha384_final(digest, &ctx); - return digest; -} diff --git a/ldns/str2host.c b/ldns/str2host.c deleted file mode 100644 index 0bf62d1..0000000 --- a/ldns/str2host.c +++ /dev/null @@ -1,1802 +0,0 @@ -/* - * str2host.c - * - * conversion routines from the presentation format - * to the host format - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif -#ifdef HAVE_ARPA_INET_H -#include <arpa/inet.h> -#endif -#include <time.h> - -#include <errno.h> -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif - -#include <limits.h> -#ifdef HAVE_SYS_PARAM_H -#include <sys/param.h> -#endif - -ldns_status -ldns_str2rdf_int16(ldns_rdf **rd, const char *shortstr) -{ - char *end = NULL; - uint16_t *r; - r = LDNS_MALLOC(uint16_t); - if(!r) return LDNS_STATUS_MEM_ERR; - - *r = htons((uint16_t)strtol((char *)shortstr, &end, 10)); - - if(*end != 0) { - LDNS_FREE(r); - return LDNS_STATUS_INVALID_INT; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_INT16, sizeof(uint16_t), r); - LDNS_FREE(r); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; - } -} - -ldns_status -ldns_str2rdf_time(ldns_rdf **rd, const char *time) -{ - /* convert a time YYYYDDMMHHMMSS to wireformat */ - uint32_t *r = NULL; - struct tm tm; - uint32_t l; - char *end; - - /* Try to scan the time... */ - r = (uint32_t *)LDNS_MALLOC(uint32_t); - if(!r) return LDNS_STATUS_MEM_ERR; - - memset(&tm, 0, sizeof(tm)); - - if (strlen(time) == 14 && - sscanf(time, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) == 6 - ) { - tm.tm_year -= 1900; - tm.tm_mon--; - /* Check values */ - if (tm.tm_year < 70) { - goto bad_format; - } - if (tm.tm_mon < 0 || tm.tm_mon > 11) { - goto bad_format; - } - if (tm.tm_mday < 1 || tm.tm_mday > 31) { - goto bad_format; - } - - if (tm.tm_hour < 0 || tm.tm_hour > 23) { - goto bad_format; - } - - if (tm.tm_min < 0 || tm.tm_min > 59) { - goto bad_format; - } - - if (tm.tm_sec < 0 || tm.tm_sec > 59) { - goto bad_format; - } - - l = htonl(ldns_mktime_from_utc(&tm)); - memcpy(r, &l, sizeof(uint32_t)); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_TIME, sizeof(uint32_t), r); - LDNS_FREE(r); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; - } else { - /* handle it as 32 bits timestamp */ - l = htonl((uint32_t)strtol((char*)time, &end, 10)); - if(*end != 0) { - LDNS_FREE(r); - return LDNS_STATUS_ERR; - } else { - memcpy(r, &l, sizeof(uint32_t)); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_INT32, sizeof(uint32_t), r); - LDNS_FREE(r); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; - } - } - - bad_format: - LDNS_FREE(r); - return LDNS_STATUS_INVALID_TIME; -} - -ldns_status -ldns_str2rdf_nsec3_salt(ldns_rdf **rd, const char *salt_str) -{ - uint8_t salt_length; - int c; - int salt_length_str; - - uint8_t *salt; - uint8_t *data; - if(rd == NULL) { - return LDNS_STATUS_NULL; - } - - salt_length_str = (int)strlen(salt_str); - if (salt_length_str == 1 && salt_str[0] == '-') { - salt_length_str = 0; - } else if (salt_length_str % 2 != 0) { - return LDNS_STATUS_INVALID_HEX; - } - if (salt_length_str > 512) { - return LDNS_STATUS_INVALID_HEX; - } - - salt = LDNS_XMALLOC(uint8_t, salt_length_str / 2); - if(!salt) { - return LDNS_STATUS_MEM_ERR; - } - for (c = 0; c < salt_length_str; c += 2) { - if (isxdigit((int) salt_str[c]) && isxdigit((int) salt_str[c+1])) { - salt[c/2] = (uint8_t) ldns_hexdigit_to_int(salt_str[c]) * 16 + - ldns_hexdigit_to_int(salt_str[c+1]); - } else { - LDNS_FREE(salt); - return LDNS_STATUS_INVALID_HEX; - } - } - salt_length = (uint8_t) (salt_length_str / 2); - - data = LDNS_XMALLOC(uint8_t, 1 + salt_length); - if(!data) { - LDNS_FREE(salt); - return LDNS_STATUS_MEM_ERR; - } - data[0] = salt_length; - memcpy(&data[1], salt, salt_length); - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_NSEC3_SALT, 1 + salt_length, data); - LDNS_FREE(data); - LDNS_FREE(salt); - - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_period(ldns_rdf **rd,const char *period) -{ - uint32_t p; - const char *end; - - /* Allocate required space... */ - p = ldns_str2period(period, &end); - - if (*end != 0) { - return LDNS_STATUS_ERR; - } else { - p = (uint32_t) htonl(p); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_PERIOD, sizeof(uint32_t), &p); - } - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_int32(ldns_rdf **rd, const char *longstr) -{ - char *end; - uint32_t *r = NULL; - uint32_t l; - - r = (uint32_t*)LDNS_MALLOC(uint32_t); - if(!r) return LDNS_STATUS_MEM_ERR; - errno = 0; /* must set to zero before call, - note race condition on errno */ - if(*longstr == '-') - l = htonl((uint32_t)strtol((char*)longstr, &end, 10)); - else l = htonl((uint32_t)strtoul((char*)longstr, &end, 10)); - - if(*end != 0) { - LDNS_FREE(r); - return LDNS_STATUS_ERR; - } else { - if (errno == ERANGE) { - LDNS_FREE(r); - return LDNS_STATUS_SYNTAX_INTEGER_OVERFLOW; - } - memcpy(r, &l, sizeof(uint32_t)); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_INT32, sizeof(uint32_t), r); - LDNS_FREE(r); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; - } -} - -ldns_status -ldns_str2rdf_int8(ldns_rdf **rd, const char *bytestr) -{ - char *end; - uint8_t *r = NULL; - - r = LDNS_MALLOC(uint8_t); - if(!r) return LDNS_STATUS_MEM_ERR; - - *r = (uint8_t)strtol((char*)bytestr, &end, 10); - - if(*end != 0) { - LDNS_FREE(r); - return LDNS_STATUS_ERR; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_INT8, sizeof(uint8_t), r); - LDNS_FREE(r); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; - } -} - - -/* - * Checks whether the escaped value at **s is an decimal value or - * a 'normally' escaped character (and not eos) - * - * The string pointer at *s is increased by either 0 (on error), 1 (on - * normal escapes), or 3 (on decimals) - * - * Returns the number of bytes read from the escaped string, or - * 0 on error - */ -INLINE bool -parse_escape(uint8_t *ch_p, const char** str_p) -{ - uint16_t val; - - if ((*str_p)[0] && isdigit((unsigned char)(*str_p)[0]) && - (*str_p)[1] && isdigit((unsigned char)(*str_p)[1]) && - (*str_p)[2] && isdigit((unsigned char)(*str_p)[2])) { - - val = (uint16_t)(((*str_p)[0] - '0') * 100 + - ((*str_p)[1] - '0') * 10 + - ((*str_p)[2] - '0')); - - if (val > 255) { - goto error; - } - *ch_p = (uint8_t)val; - *str_p += 3; - return true; - - } else if ((*str_p)[0] && !isdigit((unsigned char)(*str_p)[0])) { - - *ch_p = (uint8_t)*(*str_p)++; - return true; - } -error: - *str_p = NULL; - return false; /* LDNS_STATUS_SYNTAX_BAD_ESCAPE */ -} - -INLINE bool -parse_char(uint8_t *ch_p, const char** str_p) -{ - switch (**str_p) { - - case '\0': return false; - - case '\\': *str_p += 1; - return parse_escape(ch_p, str_p); - - default: *ch_p = (uint8_t)*(*str_p)++; - return true; - } -} - -/* - * No special care is taken, all dots are translated into - * label seperators. - * Could be made more efficient....we do 3 memcpy's in total... - */ -ldns_status -ldns_str2rdf_dname(ldns_rdf **d, const char *str) -{ - size_t len; - - const char *s; - uint8_t *q, *pq, label_len; - uint8_t buf[LDNS_MAX_DOMAINLEN + 1]; - *d = NULL; - - len = strlen((char*)str); - /* octet representation can make strings a lot longer than actual length */ - if (len > LDNS_MAX_DOMAINLEN * 4) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - if (0 == len) { - return LDNS_STATUS_DOMAINNAME_UNDERFLOW; - } - - /* root label */ - if (1 == len && *str == '.') { - *d = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, 1, "\0"); - return LDNS_STATUS_OK; - } - - /* get on with the rest */ - - /* s is on the current character in the string - * pq points to where the labellength is going to go - * label_len keeps track of the current label's length - * q builds the dname inside the buf array - */ - len = 0; - q = buf+1; - pq = buf; - label_len = 0; - for (s = str; *s; s++, q++) { - if (q > buf + LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - *q = 0; - switch (*s) { - case '.': - if (label_len > LDNS_MAX_LABELLEN) { - return LDNS_STATUS_LABEL_OVERFLOW; - } - if (label_len == 0) { - return LDNS_STATUS_EMPTY_LABEL; - } - len += label_len + 1; - *pq = label_len; - label_len = 0; - pq = q; - break; - case '\\': - /* octet value or literal char */ - s += 1; - if (! parse_escape(q, &s)) { - return LDNS_STATUS_SYNTAX_BAD_ESCAPE; - } - s -= 1; - label_len++; - break; - default: - *q = (uint8_t)*s; - label_len++; - } - } - - /* add root label if last char was not '.' */ - if (!ldns_dname_str_absolute(str)) { - if (q > buf + LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - if (label_len > LDNS_MAX_LABELLEN) { - return LDNS_STATUS_LABEL_OVERFLOW; - } - if (label_len == 0) { /* label_len 0 but not . at end? */ - return LDNS_STATUS_EMPTY_LABEL; - } - len += label_len + 1; - *pq = label_len; - *q = 0; - } - len++; - - *d = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, len, buf); - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_a(ldns_rdf **rd, const char *str) -{ - in_addr_t address; - if (inet_pton(AF_INET, (char*)str, &address) != 1) { - return LDNS_STATUS_INVALID_IP4; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_A, sizeof(address), &address); - } - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_aaaa(ldns_rdf **rd, const char *str) -{ - uint8_t address[LDNS_IP6ADDRLEN + 1]; - - if (inet_pton(AF_INET6, (char*)str, address) != 1) { - return LDNS_STATUS_INVALID_IP6; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_AAAA, sizeof(address) - 1, &address); - } - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_str(ldns_rdf **rd, const char *str) -{ - uint8_t *data, *dp, ch = 0; - size_t length; - - /* Worst case space requirement. We'll realloc to actual size later. */ - dp = data = LDNS_XMALLOC(uint8_t, strlen(str) > 255 ? 256 : (strlen(str) + 1)); - if (! data) { - return LDNS_STATUS_MEM_ERR; - } - - /* Fill data (up to 255 characters) */ - while (parse_char(&ch, &str)) { - if (dp - data >= 255) { - LDNS_FREE(data); - return LDNS_STATUS_INVALID_STR; - } - *++dp = ch; - } - if (! str) { - LDNS_FREE(data); - return LDNS_STATUS_SYNTAX_BAD_ESCAPE; - } - length = (size_t)(dp - data); - /* Fix last length byte */ - data[0] = (uint8_t)length; - - /* Lose the overmeasure */ - data = LDNS_XREALLOC(dp = data, uint8_t, length + 1); - if (! data) { - LDNS_FREE(dp); - return LDNS_STATUS_MEM_ERR; - } - - /* Create rdf */ - *rd = ldns_rdf_new(LDNS_RDF_TYPE_STR, length + 1, data); - if (! *rd) { - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_apl(ldns_rdf **rd, const char *str) -{ - const char *my_str = str; - - char *my_ip_str; - size_t ip_str_len; - - uint16_t family; - bool negation; - uint8_t afdlength = 0; - uint8_t *afdpart; - uint8_t prefix; - - uint8_t *data; - - size_t i = 0; - - /* [!]afi:address/prefix */ - if (strlen(my_str) < 2 - || strchr(my_str, ':') == NULL - || strchr(my_str, '/') == NULL - || strchr(my_str, ':') > strchr(my_str, '/')) { - return LDNS_STATUS_INVALID_STR; - } - - if (my_str[0] == '!') { - negation = true; - my_str += 1; - } else { - negation = false; - } - - family = (uint16_t) atoi(my_str); - - my_str = strchr(my_str, ':') + 1; - - /* need ip addr and only ip addr for inet_pton */ - ip_str_len = (size_t) (strchr(my_str, '/') - my_str); - my_ip_str = LDNS_XMALLOC(char, ip_str_len + 1); - if(!my_ip_str) return LDNS_STATUS_MEM_ERR; - strncpy(my_ip_str, my_str, ip_str_len + 1); - my_ip_str[ip_str_len] = '\0'; - - if (family == 1) { - /* ipv4 */ - afdpart = LDNS_XMALLOC(uint8_t, 4); - if(!afdpart) { - LDNS_FREE(my_ip_str); - return LDNS_STATUS_MEM_ERR; - } - if (inet_pton(AF_INET, my_ip_str, afdpart) == 0) { - LDNS_FREE(my_ip_str); - LDNS_FREE(afdpart); - return LDNS_STATUS_INVALID_STR; - } - for (i = 0; i < 4; i++) { - if (afdpart[i] != 0) { - afdlength = i + 1; - } - } - } else if (family == 2) { - /* ipv6 */ - afdpart = LDNS_XMALLOC(uint8_t, 16); - if(!afdpart) { - LDNS_FREE(my_ip_str); - return LDNS_STATUS_MEM_ERR; - } - if (inet_pton(AF_INET6, my_ip_str, afdpart) == 0) { - LDNS_FREE(my_ip_str); - LDNS_FREE(afdpart); - return LDNS_STATUS_INVALID_STR; - } - for (i = 0; i < 16; i++) { - if (afdpart[i] != 0) { - afdlength = i + 1; - } - } - } else { - /* unknown family */ - LDNS_FREE(my_ip_str); - return LDNS_STATUS_INVALID_STR; - } - - my_str = strchr(my_str, '/') + 1; - prefix = (uint8_t) atoi(my_str); - - data = LDNS_XMALLOC(uint8_t, 4 + afdlength); - if(!data) { - LDNS_FREE(afdpart); - LDNS_FREE(my_ip_str); - return LDNS_STATUS_INVALID_STR; - } - ldns_write_uint16(data, family); - data[2] = prefix; - data[3] = afdlength; - if (negation) { - /* set bit 1 of byte 3 */ - data[3] = data[3] | 0x80; - } - - memcpy(data + 4, afdpart, afdlength); - - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_APL, afdlength + 4, data); - LDNS_FREE(afdpart); - LDNS_FREE(data); - LDNS_FREE(my_ip_str); - - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_b64(ldns_rdf **rd, const char *str) -{ - uint8_t *buffer; - int16_t i; - - if ((*str == '-' || *str == '0') && str[1] == '\0') { - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, 0, NULL); - return *rd ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; - } - - buffer = LDNS_XMALLOC(uint8_t, ldns_b64_ntop_calculate_size(strlen(str))); - if(!buffer) { - return LDNS_STATUS_MEM_ERR; - } - - i = (uint16_t)ldns_b64_pton((const char*)str, buffer, - ldns_b64_ntop_calculate_size(strlen(str))); - if (-1 == i) { - LDNS_FREE(buffer); - return LDNS_STATUS_INVALID_B64; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_B64, (uint16_t) i, buffer); - } - LDNS_FREE(buffer); - - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_b32_ext(ldns_rdf **rd, const char *str) -{ - uint8_t *buffer; - int i; - /* first byte contains length of actual b32 data */ - size_t slen = strlen(str); - size_t len = ldns_b32_pton_calculate_size(slen); - if (len > 255) { - return LDNS_STATUS_INVALID_B32_EXT; - } - buffer = LDNS_XMALLOC(uint8_t, len + 1); - if(!buffer) { - return LDNS_STATUS_MEM_ERR; - } - buffer[0] = len; - - i = ldns_b32_pton_extended_hex((const char*)str, slen, buffer + 1, - ldns_b32_ntop_calculate_size(slen)); - if (i < 0) { - LDNS_FREE(buffer); - return LDNS_STATUS_INVALID_B32_EXT; - } else { - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_B32_EXT, (uint16_t) i + 1, buffer); - } - LDNS_FREE(buffer); - - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_hex(ldns_rdf **rd, const char *str) -{ - uint8_t *t, *t_orig; - int i; - size_t len; - - len = strlen(str); - - if (len > LDNS_MAX_RDFLEN * 2) { - return LDNS_STATUS_LABEL_OVERFLOW; - } else { - t = LDNS_XMALLOC(uint8_t, (len / 2) + 1); - if(!t) { - return LDNS_STATUS_MEM_ERR; - } - t_orig = t; - /* Now process octet by octet... */ - while (*str) { - *t = 0; - if (isspace((int) *str)) { - str++; - } else { - for (i = 16; i >= 1; i -= 15) { - while (*str && isspace((int) *str)) { str++; } - if (*str) { - if (isxdigit((int) *str)) { - *t += ldns_hexdigit_to_int(*str) * i; - } else { - LDNS_FREE(t_orig); - return LDNS_STATUS_ERR; - } - ++str; - } - } - ++t; - } - } - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, - (size_t) (t - t_orig), - t_orig); - LDNS_FREE(t_orig); - } - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_nsec(ldns_rdf **rd, const char *str) -{ - const char *delimiters = "\n\t "; - char *token = LDNS_XMALLOC(char, LDNS_MAX_RDFLEN); - ldns_buffer *str_buf; - ssize_t c; - uint16_t cur_type; - size_t type_count = 0; - ldns_rr_type type_list[65536]; - if(!token) return LDNS_STATUS_MEM_ERR; - if(rd == NULL) { - LDNS_FREE(token); - return LDNS_STATUS_NULL; - } - - str_buf = LDNS_MALLOC(ldns_buffer); - if(!str_buf) { - LDNS_FREE(token); - return LDNS_STATUS_MEM_ERR; - } - ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); - if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { - LDNS_FREE(str_buf); - LDNS_FREE(token); - return LDNS_STATUS_MEM_ERR; - } - - while ((c = ldns_bget_token(str_buf, token, delimiters, LDNS_MAX_RDFLEN)) != -1 && c != 0) { - if(type_count >= sizeof(type_list)) { - LDNS_FREE(str_buf); - LDNS_FREE(token); - return LDNS_STATUS_ERR; - } - cur_type = ldns_get_rr_type_by_name(token); - type_list[type_count] = cur_type; - type_count++; - } - - *rd = ldns_dnssec_create_nsec_bitmap(type_list, - type_count, - LDNS_RR_TYPE_NSEC); - - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_type(ldns_rdf **rd, const char *str) -{ - uint16_t type; - type = htons(ldns_get_rr_type_by_name(str)); - /* ldns_rr_type is a 16 bit value */ - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_TYPE, sizeof(uint16_t), &type); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_class(ldns_rdf **rd, const char *str) -{ - uint16_t klass; - klass = htons(ldns_get_rr_class_by_name(str)); - /* class is 16 bit */ - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_CLASS, sizeof(uint16_t), &klass); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -/* An certificate alg field can either be specified as a 8 bits number - * or by its symbolic name. Handle both - */ -ldns_status -ldns_str2rdf_cert_alg(ldns_rdf **rd, const char *str) -{ - ldns_lookup_table *lt; - ldns_status st; - uint8_t idd[2]; - lt = ldns_lookup_by_name(ldns_cert_algorithms, str); - st = LDNS_STATUS_OK; - - if (lt) { - ldns_write_uint16(idd, (uint16_t) lt->id); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_INT16, sizeof(uint16_t), idd); - if (!*rd) { - st = LDNS_STATUS_ERR; - } - } else { - /* try as-is (a number) */ - st = ldns_str2rdf_int16(rd, str); - if (st == LDNS_STATUS_OK && - ldns_rdf2native_int16(*rd) == 0) { - st = LDNS_STATUS_CERT_BAD_ALGORITHM; - } - } - - return st; -} - -static ldns_lookup_table ldns_tlsa_certificate_usages[] = { - { LDNS_TLSA_USAGE_PKIX_TA , "PKIX-TA" }, - { LDNS_TLSA_USAGE_PKIX_EE , "PKIX-EE" }, - { LDNS_TLSA_USAGE_DANE_TA , "DANE-TA" }, - { LDNS_TLSA_USAGE_DANE_EE , "DANE-EE" }, - { LDNS_TLSA_USAGE_PRIVCERT , "PrivCert" }, - { 0, NULL } -}; - -static ldns_lookup_table ldns_tlsa_selectors[] = { - { LDNS_TLSA_SELECTOR_CERT , "Cert" }, - { LDNS_TLSA_SELECTOR_SPKI , "SPKI" }, - { LDNS_TLSA_SELECTOR_PRIVSEL , "PrivSel" }, - { 0, NULL } -}; - -static ldns_lookup_table ldns_tlsa_matching_types[] = { - { LDNS_TLSA_MATCHING_TYPE_FULL , "Full" }, - { LDNS_TLSA_MATCHING_TYPE_SHA2_256 , "SHA2-256" }, - { LDNS_TLSA_MATCHING_TYPE_SHA2_512 , "SHA2-512" }, - { LDNS_TLSA_MATCHING_TYPE_PRIVMATCH , "PrivMatch" }, - { 0, NULL } -}; - -static ldns_status -ldns_str2rdf_mnemonic4int8(ldns_lookup_table *lt, - ldns_rdf **rd, const char *str) -{ - if ((lt = ldns_lookup_by_name(lt, str))) { - /* it was given as a integer */ - *rd = ldns_native2rdf_int8(LDNS_RDF_TYPE_INT8, (uint8_t) lt->id); - if (!*rd) - return LDNS_STATUS_ERR; - else - return LDNS_STATUS_OK; - } - return ldns_str2rdf_int8(rd, str); -} - -/* An alg field can either be specified as a 8 bits number - * or by its symbolic name. Handle both - */ -ldns_status -ldns_str2rdf_alg(ldns_rdf **rd, const char *str) -{ - return ldns_str2rdf_mnemonic4int8(ldns_algorithms, rd, str); -} - -ldns_status -ldns_str2rdf_certificate_usage(ldns_rdf **rd, const char *str) -{ - return ldns_str2rdf_mnemonic4int8( - ldns_tlsa_certificate_usages, rd, str); -} - -ldns_status -ldns_str2rdf_selector(ldns_rdf **rd, const char *str) -{ - return ldns_str2rdf_mnemonic4int8(ldns_tlsa_selectors, rd, str); -} - -ldns_status -ldns_str2rdf_matching_type(ldns_rdf **rd, const char *str) -{ - return ldns_str2rdf_mnemonic4int8(ldns_tlsa_matching_types, rd, str); -} - -ldns_status -ldns_str2rdf_unknown( ATTR_UNUSED(ldns_rdf **rd) - , ATTR_UNUSED(const char *str) - ) -{ - /* this should be caught in an earlier time (general str2host for - rr's */ - return LDNS_STATUS_NOT_IMPL; -} - -ldns_status -ldns_str2rdf_service( ATTR_UNUSED(ldns_rdf **rd) - , ATTR_UNUSED(const char *str) - ) -{ - /* is this used? is this actually WKS? or SRV? */ - return LDNS_STATUS_NOT_IMPL; -} - -static int -loc_parse_cm(char* my_str, char** endstr, uint8_t* m, uint8_t* e) -{ - /* read <digits>[.<digits>][mM] */ - /* into mantissa exponent format for LOC type */ - uint32_t meters = 0, cm = 0, val; - while (isblank((unsigned char)*my_str)) { - my_str++; - } - meters = (uint32_t)strtol(my_str, &my_str, 10); - if (*my_str == '.') { - my_str++; - cm = (uint32_t)strtol(my_str, &my_str, 10); - } - if (meters >= 1) { - *e = 2; - val = meters; - } else { - *e = 0; - val = cm; - } - while(val >= 10) { - (*e)++; - val /= 10; - } - *m = (uint8_t)val; - - if (*e > 9) - return 0; - if (*my_str == 'm' || *my_str == 'M') { - my_str++; - } - *endstr = my_str; - return 1; -} - -ldns_status -ldns_str2rdf_loc(ldns_rdf **rd, const char *str) -{ - uint32_t latitude = 0; - uint32_t longitude = 0; - uint32_t altitude = 0; - - uint8_t *data; - uint32_t equator = (uint32_t) ldns_power(2, 31); - - uint32_t h = 0; - uint32_t m = 0; - uint8_t size_b = 1, size_e = 2; - uint8_t horiz_pre_b = 1, horiz_pre_e = 6; - uint8_t vert_pre_b = 1, vert_pre_e = 3; - - double s = 0.0; - bool northerness; - bool easterness; - - char *my_str = (char *) str; - - /* only support version 0 */ - if (isdigit((int) *my_str)) { - h = (uint32_t) strtol(my_str, &my_str, 10); - } else { - return LDNS_STATUS_INVALID_STR; - } - - while (isblank((int) *my_str)) { - my_str++; - } - - if (isdigit((int) *my_str)) { - m = (uint32_t) strtol(my_str, &my_str, 10); - } else if (*my_str == 'N' || *my_str == 'S') { - goto north; - } else { - return LDNS_STATUS_INVALID_STR; - } - - while (isblank((int) *my_str)) { - my_str++; - } - - if (isdigit((int) *my_str)) { - s = strtod(my_str, &my_str); - } -north: - while (isblank((int) *my_str)) { - my_str++; - } - - if (*my_str == 'N') { - northerness = true; - } else if (*my_str == 'S') { - northerness = false; - } else { - return LDNS_STATUS_INVALID_STR; - } - - my_str++; - - /* store number */ - s = 1000.0 * s; - /* add a little to make floor in conversion a round */ - s += 0.0005; - latitude = (uint32_t) s; - latitude += 1000 * 60 * m; - latitude += 1000 * 60 * 60 * h; - if (northerness) { - latitude = equator + latitude; - } else { - latitude = equator - latitude; - } - while (isblank((unsigned char)*my_str)) { - my_str++; - } - - if (isdigit((int) *my_str)) { - h = (uint32_t) strtol(my_str, &my_str, 10); - } else { - return LDNS_STATUS_INVALID_STR; - } - - while (isblank((int) *my_str)) { - my_str++; - } - - if (isdigit((int) *my_str)) { - m = (uint32_t) strtol(my_str, &my_str, 10); - } else if (*my_str == 'E' || *my_str == 'W') { - goto east; - } else { - return LDNS_STATUS_INVALID_STR; - } - - while (isblank((unsigned char)*my_str)) { - my_str++; - } - - if (isdigit((int) *my_str)) { - s = strtod(my_str, &my_str); - } - -east: - while (isblank((unsigned char)*my_str)) { - my_str++; - } - - if (*my_str == 'E') { - easterness = true; - } else if (*my_str == 'W') { - easterness = false; - } else { - return LDNS_STATUS_INVALID_STR; - } - - my_str++; - - /* store number */ - s *= 1000.0; - /* add a little to make floor in conversion a round */ - s += 0.0005; - longitude = (uint32_t) s; - longitude += 1000 * 60 * m; - longitude += 1000 * 60 * 60 * h; - - if (easterness) { - longitude += equator; - } else { - longitude = equator - longitude; - } - - altitude = (uint32_t)(strtod(my_str, &my_str)*100.0 + - 10000000.0 + 0.5); - if (*my_str == 'm' || *my_str == 'M') { - my_str++; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &size_b, &size_e)) - return LDNS_STATUS_INVALID_STR; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &horiz_pre_b, &horiz_pre_e)) - return LDNS_STATUS_INVALID_STR; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &vert_pre_b, &vert_pre_e)) - return LDNS_STATUS_INVALID_STR; - } - - data = LDNS_XMALLOC(uint8_t, 16); - if(!data) { - return LDNS_STATUS_MEM_ERR; - } - data[0] = 0; - data[1] = 0; - data[1] = ((size_b << 4) & 0xf0) | (size_e & 0x0f); - data[2] = ((horiz_pre_b << 4) & 0xf0) | (horiz_pre_e & 0x0f); - data[3] = ((vert_pre_b << 4) & 0xf0) | (vert_pre_e & 0x0f); - ldns_write_uint32(data + 4, latitude); - ldns_write_uint32(data + 8, longitude); - ldns_write_uint32(data + 12, altitude); - - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_LOC, 16, data); - - LDNS_FREE(data); - return *rd?LDNS_STATUS_OK:LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_wks(ldns_rdf **rd, const char *str) -{ - uint8_t *bitmap = NULL; - uint8_t *data; - int bm_len = 0; - - struct protoent *proto = NULL; - struct servent *serv = NULL; - int serv_port; - - ldns_buffer *str_buf; - - char *proto_str = NULL; - char *lc_proto_str = NULL; - char *token; - char *lc_token; - char *c; - if(strlen(str) == 0) - token = LDNS_XMALLOC(char, 50); - else token = LDNS_XMALLOC(char, strlen(str)+2); - if(!token) return LDNS_STATUS_MEM_ERR; - - str_buf = LDNS_MALLOC(ldns_buffer); - if(!str_buf) {LDNS_FREE(token); return LDNS_STATUS_MEM_ERR;} - ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); - if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { - LDNS_FREE(str_buf); - LDNS_FREE(token); - return LDNS_STATUS_MEM_ERR; - } - - while(ldns_bget_token(str_buf, token, "\t\n ", strlen(str)) > 0) { - if (!proto_str) { - proto_str = strdup(token); - lc_proto_str = strdup(token); - for (c = lc_proto_str; *c; c++) { - *c = tolower((unsigned char)*c); - } - if (!proto_str || !lc_proto_str) { - free(proto_str); - free(lc_proto_str); - LDNS_FREE(bitmap); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - } else { - serv = getservbyname(token, proto_str); - if (!serv) { - serv = getservbyname(token, lc_proto_str); - } - if (!serv && (lc_token = strdup(token))) { - for (c = lc_token; *c; c++) { - *c = tolower((unsigned char)*c); - } - serv = getservbyname(lc_token, proto_str); - if (!serv) { - serv = getservbyname(lc_token, lc_proto_str); - } - free(lc_token); - } - if (serv) { - serv_port = (int) ntohs((uint16_t) serv->s_port); - } else { - serv_port = atoi(token); - } - if (serv_port < 0 || serv_port > 65535) { - LDNS_FREE(bitmap); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - free(proto_str); - free(lc_proto_str); - return LDNS_STATUS_INVALID_STR; - } - if (serv_port / 8 >= bm_len) { - uint8_t *b2 = LDNS_XREALLOC(bitmap, uint8_t, (serv_port / 8) + 1); - if(!b2) { - LDNS_FREE(bitmap); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - free(proto_str); - free(lc_proto_str); - return LDNS_STATUS_INVALID_STR; - } - bitmap = b2; - /* set to zero to be sure */ - for (; bm_len <= serv_port / 8; bm_len++) { - bitmap[bm_len] = 0; - } - } - ldns_set_bit(bitmap + (serv_port / 8), 7 - (serv_port % 8), true); - } - } - - if (!proto_str || !bitmap) { - LDNS_FREE(bitmap); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - free(proto_str); - free(lc_proto_str); - return LDNS_STATUS_INVALID_STR; - } - - data = LDNS_XMALLOC(uint8_t, bm_len + 1); - if(!data) { - LDNS_FREE(token); - ldns_buffer_free(str_buf); - LDNS_FREE(bitmap); - free(proto_str); - free(lc_proto_str); - return LDNS_STATUS_INVALID_STR; - } - if (proto_str) - proto = getprotobyname(proto_str); - if (!proto) { - proto = getprotobyname(lc_proto_str); - } - if (proto) { - data[0] = (uint8_t) proto->p_proto; - } else if (proto_str) { - data[0] = (uint8_t) atoi(proto_str); - } - memcpy(data + 1, bitmap, (size_t) bm_len); - - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_WKS, (uint16_t) (bm_len + 1), data); - - LDNS_FREE(data); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - LDNS_FREE(bitmap); - free(proto_str); - free(lc_proto_str); -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - - if(!*rd) return LDNS_STATUS_MEM_ERR; - - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_nsap(ldns_rdf **rd, const char *str) -{ - size_t len, i; - char* nsap_str = (char*) str; - - /* just a hex string with optional dots? */ - if (str[0] != '0' || str[1] != 'x') { - return LDNS_STATUS_INVALID_STR; - } else { - len = strlen(str); - for (i=0; i < len; i++) { - if (nsap_str[i] == '.') - nsap_str[i] = ' '; - } - return ldns_str2rdf_hex(rd, str+2); - } -} - -ldns_status -ldns_str2rdf_atma(ldns_rdf **rd, const char *str) -{ - size_t len, i; - char* atma_str = (char*) str; - ldns_status status; - - /* just a hex string with optional dots? */ - len = strlen(str); - for (i=0; i < len; i++) { - if (atma_str[i] == '.') - atma_str[i] = ' '; - } - status = ldns_str2rdf_hex(rd, str); - if (status != LDNS_STATUS_OK) { - ; /* probably in e.164 format than */ - } - return status; -} - -ldns_status -ldns_str2rdf_ipseckey(ldns_rdf **rd, const char *str) -{ - uint8_t precedence = 0; - uint8_t gateway_type = 0; - uint8_t algorithm = 0; - char* gateway = NULL; - char* publickey = NULL; - uint8_t *data; - ldns_buffer *str_buf; - char *token; - int token_count = 0; - int ipseckey_len = 0; - ldns_rdf* gateway_rdf = NULL; - ldns_rdf* publickey_rdf = NULL; - ldns_status status = LDNS_STATUS_OK; - - if(strlen(str) == 0) - token = LDNS_XMALLOC(char, 256); - else token = LDNS_XMALLOC(char, strlen(str)+2); - if(!token) return LDNS_STATUS_MEM_ERR; - - str_buf = LDNS_MALLOC(ldns_buffer); - if(!str_buf) {LDNS_FREE(token); return LDNS_STATUS_MEM_ERR;} - ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); - if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { - LDNS_FREE(str_buf); - LDNS_FREE(token); - return LDNS_STATUS_MEM_ERR; - } - while(ldns_bget_token(str_buf, token, "\t\n ", strlen(str)) > 0) { - switch (token_count) { - case 0: - precedence = (uint8_t)atoi(token); - break; - case 1: - gateway_type = (uint8_t)atoi(token); - break; - case 2: - algorithm = (uint8_t)atoi(token); - break; - case 3: - gateway = strdup(token); - if (!gateway || (gateway_type == 0 && - (token[0] != '.' || token[1] != '\0'))) { - LDNS_FREE(gateway); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - break; - case 4: - publickey = strdup(token); - break; - default: - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - break; - } - token_count++; - } - - if (!gateway || !publickey) { - if (gateway) - LDNS_FREE(gateway); - if (publickey) - LDNS_FREE(publickey); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - - if (gateway_type == 1) { - status = ldns_str2rdf_a(&gateway_rdf, gateway); - } else if (gateway_type == 2) { - status = ldns_str2rdf_aaaa(&gateway_rdf, gateway); - } else if (gateway_type == 3) { - status = ldns_str2rdf_dname(&gateway_rdf, gateway); - } else if (gateway_type > 3) { - status = LDNS_STATUS_INVALID_STR; - } - - if (status != LDNS_STATUS_OK) { - if (gateway) - LDNS_FREE(gateway); - if (publickey) - LDNS_FREE(publickey); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - - status = ldns_str2rdf_b64(&publickey_rdf, publickey); - - if (status != LDNS_STATUS_OK) { - if (gateway) - LDNS_FREE(gateway); - if (publickey) - LDNS_FREE(publickey); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - if (gateway_rdf) ldns_rdf_free(gateway_rdf); - return LDNS_STATUS_INVALID_STR; - } - - /* now copy all into one ipseckey rdf */ - if (gateway_type) - ipseckey_len = 3 + (int)ldns_rdf_size(gateway_rdf) + (int)ldns_rdf_size(publickey_rdf); - else - ipseckey_len = 3 + (int)ldns_rdf_size(publickey_rdf); - - data = LDNS_XMALLOC(uint8_t, ipseckey_len); - if(!data) { - if (gateway) - LDNS_FREE(gateway); - if (publickey) - LDNS_FREE(publickey); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - if (gateway_rdf) ldns_rdf_free(gateway_rdf); - if (publickey_rdf) ldns_rdf_free(publickey_rdf); - return LDNS_STATUS_MEM_ERR; - } - - data[0] = precedence; - data[1] = gateway_type; - data[2] = algorithm; - - if (gateway_type) { - memcpy(data + 3, - ldns_rdf_data(gateway_rdf), ldns_rdf_size(gateway_rdf)); - memcpy(data + 3 + ldns_rdf_size(gateway_rdf), - ldns_rdf_data(publickey_rdf), ldns_rdf_size(publickey_rdf)); - } else { - memcpy(data + 3, - ldns_rdf_data(publickey_rdf), ldns_rdf_size(publickey_rdf)); - } - - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_IPSECKEY, (uint16_t) ipseckey_len, data); - - if (gateway) - LDNS_FREE(gateway); - if (publickey) - LDNS_FREE(publickey); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - ldns_rdf_free(gateway_rdf); - ldns_rdf_free(publickey_rdf); - LDNS_FREE(data); - if(!*rd) return LDNS_STATUS_MEM_ERR; - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_ilnp64(ldns_rdf **rd, const char *str) -{ - unsigned int a, b, c, d; - uint16_t shorts[4]; - int l; - - if (sscanf(str, "%4x:%4x:%4x:%4x%n", &a, &b, &c, &d, &l) != 4 || - l != (int)strlen(str) || /* more data to read */ - strpbrk(str, "+-") /* signed hexes */ - ) { - return LDNS_STATUS_INVALID_ILNP64; - } else { - shorts[0] = htons(a); - shorts[1] = htons(b); - shorts[2] = htons(c); - shorts[3] = htons(d); - *rd = ldns_rdf_new_frm_data( - LDNS_RDF_TYPE_ILNP64, 4 * sizeof(uint16_t), &shorts); - } - return *rd ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_eui48(ldns_rdf **rd, const char *str) -{ - unsigned int a, b, c, d, e, f; - uint8_t bytes[6]; - int l; - - if (sscanf(str, "%2x-%2x-%2x-%2x-%2x-%2x%n", - &a, &b, &c, &d, &e, &f, &l) != 6 || - l != (int)strlen(str)) { - return LDNS_STATUS_INVALID_EUI48; - } else { - bytes[0] = a; - bytes[1] = b; - bytes[2] = c; - bytes[3] = d; - bytes[4] = e; - bytes[5] = f; - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_EUI48, 6, &bytes); - } - return *rd ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_eui64(ldns_rdf **rd, const char *str) -{ - unsigned int a, b, c, d, e, f, g, h; - uint8_t bytes[8]; - int l; - - if (sscanf(str, "%2x-%2x-%2x-%2x-%2x-%2x-%2x-%2x%n", - &a, &b, &c, &d, &e, &f, &g, &h, &l) != 8 || - l != (int)strlen(str)) { - return LDNS_STATUS_INVALID_EUI64; - } else { - bytes[0] = a; - bytes[1] = b; - bytes[2] = c; - bytes[3] = d; - bytes[4] = e; - bytes[5] = f; - bytes[6] = g; - bytes[7] = h; - *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_EUI64, 8, &bytes); - } - return *rd ? LDNS_STATUS_OK : LDNS_STATUS_MEM_ERR; -} - -ldns_status -ldns_str2rdf_tag(ldns_rdf **rd, const char *str) -{ - uint8_t *data; - const char* ptr; - - if (strlen(str) > 255) { - return LDNS_STATUS_INVALID_TAG; - } - for (ptr = str; *ptr; ptr++) { - if (! isalnum((unsigned char)*ptr)) { - return LDNS_STATUS_INVALID_TAG; - } - } - data = LDNS_XMALLOC(uint8_t, strlen(str) + 1); - if (!data) { - return LDNS_STATUS_MEM_ERR; - } - data[0] = strlen(str); - memcpy(data + 1, str, strlen(str)); - - *rd = ldns_rdf_new(LDNS_RDF_TYPE_TAG, strlen(str) + 1, data); - if (!*rd) { - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_long_str(ldns_rdf **rd, const char *str) -{ - uint8_t *data, *dp, ch = 0; - size_t length; - - /* Worst case space requirement. We'll realloc to actual size later. */ - dp = data = LDNS_XMALLOC(uint8_t, strlen(str)); - if (! data) { - return LDNS_STATUS_MEM_ERR; - } - - /* Fill data with parsed bytes */ - while (parse_char(&ch, &str)) { - *dp++ = ch; - if (dp - data > LDNS_MAX_RDFLEN) { - LDNS_FREE(data); - return LDNS_STATUS_INVALID_STR; - } - } - if (! str) { - LDNS_FREE(data); - return LDNS_STATUS_SYNTAX_BAD_ESCAPE; - } - if (!(length = (size_t)(dp - data))) { - LDNS_FREE(data); - return LDNS_STATUS_SYNTAX_EMPTY; - } - /* Lose the overmeasure */ - data = LDNS_XREALLOC(dp = data, uint8_t, length); - if (! data) { - LDNS_FREE(dp); - return LDNS_STATUS_MEM_ERR; - } - - /* Create rdf */ - *rd = ldns_rdf_new(LDNS_RDF_TYPE_LONG_STR, length, data); - if (! *rd) { - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -ldns_status -ldns_str2rdf_hip(ldns_rdf **rd, const char *str) -{ - const char *hit = str == NULL ? NULL : strchr(str, ' '); - const char *pk = hit == NULL ? NULL : strchr(hit + 1, ' '); - size_t hit_size = hit == NULL ? 0 - : pk == NULL ? strlen(hit + 1) : (size_t) (pk - hit) - 1; - size_t pk_size = pk == NULL ? 0 : strlen(pk + 1); - size_t hit_wire_size = (hit_size + 1) / 2; - size_t pk_wire_size = ldns_b64_pton_calculate_size(pk_size); - size_t rdf_size = 4 + hit_wire_size + pk_wire_size; - - char *endptr; /* utility var for strtol usage */ - int algorithm = str == NULL ? 0 : strtol(str, &endptr, 10); - - uint8_t *data, *dp; - int hi, lo, written; - - if (hit_size == 0 || pk_size == 0 || (hit_size + 1) / 2 > 255 - || rdf_size > LDNS_MAX_RDFLEN - || algorithm < 0 || algorithm > 255 - || (errno != 0 && algorithm == 0) /* out of range */ - || endptr == str /* no digits */) { - - return LDNS_STATUS_SYNTAX_ERR; - } - hit += 1; - pk += 1; - if ((data = LDNS_XMALLOC(uint8_t, rdf_size)) == NULL) { - - return LDNS_STATUS_MEM_ERR; - } - /* From RFC 5205 section 5. HIP RR Storage Format: - ************************************************* - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | HIT length | PK algorithm | PK length | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - ~ HIT ~ - | | - + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | | - +-+-+-+-+-+-+-+-+-+-+-+ + - | Public Key | - ~ ~ - | | - + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + - | | - ~ Rendezvous Servers ~ - | | - + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - +-+-+-+-+-+-+-+ */ - - data[0] = (uint8_t) hit_wire_size; - data[1] = (uint8_t) algorithm; - - for (dp = data + 4; *hit && *hit != ' '; dp++) { - - if ((hi = ldns_hexdigit_to_int(*hit++)) == -1 || - (lo = ldns_hexdigit_to_int(*hit++)) == -1) { - - LDNS_FREE(data); - return LDNS_STATUS_INVALID_HEX; - } - *dp = (uint8_t) hi << 4 | lo; - } - if ((written = ldns_b64_pton(pk, dp, pk_wire_size)) <= 0) { - - LDNS_FREE(data); - return LDNS_STATUS_INVALID_B64; - } - - /* Because ldns_b64_pton_calculate_size isn't always correct: - * (we have to fix it at some point) - */ - pk_wire_size = (uint16_t) written; - ldns_write_uint16(data + 2, pk_wire_size); - rdf_size = 4 + hit_wire_size + pk_wire_size; - - /* Create rdf */ - if (! (*rd = ldns_rdf_new(LDNS_RDF_TYPE_HIP, rdf_size, data))) { - - LDNS_FREE(data); - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - - -/* Implementation mimics ldns_str2rdf_ipseckey */ -ldns_status -ldns_str2rdf_amtrelay(ldns_rdf **rd, const char *str) -{ - /* From draft-ietf-mboned-driad-amt-discovery - * Section 4.2. AMTRELAY RData Format - ************************************************* - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | precedence |D| type | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + - ~ relay ~ - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - - uint8_t precedence = 0; - uint8_t relay_type = 0; - uint8_t discovery_optional = 0; - char* relay = NULL; - uint8_t *data; - ldns_buffer *str_buf; - char *token; - int token_count = 0; - int amtrelay_len = 0; - ldns_rdf* relay_rdf = NULL; - ldns_status status = LDNS_STATUS_OK; - - if(strlen(str) == 0) - token = LDNS_XMALLOC(char, 256); - else token = LDNS_XMALLOC(char, strlen(str)+2); - if(!token) return LDNS_STATUS_MEM_ERR; - - str_buf = LDNS_MALLOC(ldns_buffer); - if(!str_buf) {LDNS_FREE(token); return LDNS_STATUS_MEM_ERR;} - ldns_buffer_new_frm_data(str_buf, (char *)str, strlen(str)); - if(ldns_buffer_status(str_buf) != LDNS_STATUS_OK) { - LDNS_FREE(str_buf); - LDNS_FREE(token); - return LDNS_STATUS_MEM_ERR; - } - while(ldns_bget_token(str_buf, token, "\t\n ", strlen(str)) > 0) { - switch (token_count) { - case 0: - precedence = (uint8_t)atoi(token); - break; - case 1: - discovery_optional = (uint8_t)atoi(token); - if (discovery_optional != 0 && - discovery_optional != 1) { - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - break; - case 2: - relay_type = (uint8_t)atoi(token); - break; - case 3: - relay = strdup(token); - if (!relay || (relay_type == 0 && - (token[0] != '.' || token[1] != '\0'))) { - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - break; - default: - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - break; - } - token_count++; - } - if (!relay && relay_type > 0) { - if (relay) - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - - if (relay_type == 1) { - status = ldns_str2rdf_a(&relay_rdf, relay); - } else if (relay_type == 2) { - status = ldns_str2rdf_aaaa(&relay_rdf, relay); - } else if (relay_type == 3) { - status = ldns_str2rdf_dname(&relay_rdf, relay); - } else if (relay_type > 3) { - status = LDNS_STATUS_INVALID_STR; - } - - if (status != LDNS_STATUS_OK) { - if (relay) - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - return LDNS_STATUS_INVALID_STR; - } - - /* now copy all into one amtrelay rdf */ - if (relay_type) - amtrelay_len = 2 + (int)ldns_rdf_size(relay_rdf); - else - amtrelay_len = 2; - - data = LDNS_XMALLOC(uint8_t, amtrelay_len); - if(!data) { - if (relay) - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - if (relay_rdf) ldns_rdf_free(relay_rdf); - return LDNS_STATUS_MEM_ERR; - } - - data[0] = precedence; - data[1] = relay_type; - data[1] |= (discovery_optional << 7); - - if (relay_type) { - memcpy(data + 2, - ldns_rdf_data(relay_rdf), ldns_rdf_size(relay_rdf)); - } - *rd = ldns_rdf_new_frm_data( LDNS_RDF_TYPE_AMTRELAY - , (uint16_t) amtrelay_len, data); - - if (relay) - LDNS_FREE(relay); - LDNS_FREE(token); - ldns_buffer_free(str_buf); - ldns_rdf_free(relay_rdf); - LDNS_FREE(data); - if(!*rd) return LDNS_STATUS_MEM_ERR; - return LDNS_STATUS_OK; -} diff --git a/ldns/tsig.c b/ldns/tsig.c deleted file mode 100644 index 458861a..0000000 --- a/ldns/tsig.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * tsig.c - * - * contains the functions needed for TSIG [RFC2845] - * - * (c) 2005-2006 NLnet Labs - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> - -#ifdef HAVE_SSL -#include <openssl/hmac.h> -#include <openssl/md5.h> -#endif /* HAVE_SSL */ - -const char * -ldns_tsig_algorithm(const ldns_tsig_credentials *tc) -{ - return tc->algorithm; -} - -const char * -ldns_tsig_keyname(const ldns_tsig_credentials *tc) -{ - return tc->keyname; -} - -const char * -ldns_tsig_keydata(const ldns_tsig_credentials *tc) -{ - return tc->keydata; -} - -char * -ldns_tsig_keyname_clone(const ldns_tsig_credentials *tc) -{ - return strdup(tc->keyname); -} - -char * -ldns_tsig_keydata_clone(const ldns_tsig_credentials *tc) -{ - return strdup(tc->keydata); -} - -/* - * Makes an exact copy of the wire, but with the tsig rr removed - */ -static uint8_t * -ldns_tsig_prepare_pkt_wire(const uint8_t *wire, size_t wire_len, size_t *result_len) -{ - uint8_t *wire2 = NULL; - uint16_t qd_count; - uint16_t an_count; - uint16_t ns_count; - uint16_t ar_count; - ldns_rr *rr; - - size_t pos; - uint16_t i; - - ldns_status status; - - if(wire_len < LDNS_HEADER_SIZE) { - return NULL; - } - /* fake parse the wire */ - qd_count = LDNS_QDCOUNT(wire); - an_count = LDNS_ANCOUNT(wire); - ns_count = LDNS_NSCOUNT(wire); - ar_count = LDNS_ARCOUNT(wire); - - if (ar_count > 0) { - ar_count--; - } else { - return NULL; - } - - pos = LDNS_HEADER_SIZE; - - for (i = 0; i < qd_count; i++) { - status = ldns_wire2rr(&rr, wire, wire_len, &pos, LDNS_SECTION_QUESTION); - if (status != LDNS_STATUS_OK) { - return NULL; - } - ldns_rr_free(rr); - } - - for (i = 0; i < an_count; i++) { - status = ldns_wire2rr(&rr, wire, wire_len, &pos, LDNS_SECTION_ANSWER); - if (status != LDNS_STATUS_OK) { - return NULL; - } - ldns_rr_free(rr); - } - - for (i = 0; i < ns_count; i++) { - status = ldns_wire2rr(&rr, wire, wire_len, &pos, LDNS_SECTION_AUTHORITY); - if (status != LDNS_STATUS_OK) { - return NULL; - } - ldns_rr_free(rr); - } - - for (i = 0; i < ar_count; i++) { - status = ldns_wire2rr(&rr, wire, wire_len, &pos, - LDNS_SECTION_ADDITIONAL); - if (status != LDNS_STATUS_OK) { - return NULL; - } - ldns_rr_free(rr); - } - - *result_len = pos; - wire2 = LDNS_XMALLOC(uint8_t, *result_len); - if(!wire2) { - return NULL; - } - memcpy(wire2, wire, *result_len); - - ldns_write_uint16(wire2 + LDNS_ARCOUNT_OFF, ar_count); - - return wire2; -} - -#ifdef HAVE_SSL -static const EVP_MD * -ldns_digest_function(char *name) -{ - /* these are the mandatory algorithms from RFC4635 */ - /* The optional algorithms are not yet implemented */ - if (strcasecmp(name, "hmac-sha512.") == 0) { -#ifdef HAVE_EVP_SHA512 - return EVP_sha512(); -#else - return NULL; -#endif - } else if (strcasecmp(name, "hmac-shac384.") == 0) { -#ifdef HAVE_EVP_SHA384 - return EVP_sha384(); -#else - return NULL; -#endif - } else if (strcasecmp(name, "hmac-sha256.") == 0) { -#ifdef HAVE_EVP_SHA256 - return EVP_sha256(); -#else - return NULL; -#endif - } else if (strcasecmp(name, "hmac-sha1.") == 0) { - return EVP_sha1(); - } else if (strcasecmp(name, "hmac-md5.sig-alg.reg.int.") == 0) { - return EVP_md5(); - } else { - return NULL; - } -} -#endif - -#ifdef HAVE_SSL -static ldns_status -ldns_tsig_mac_new(ldns_rdf **tsig_mac, const uint8_t *pkt_wire, size_t pkt_wire_size, - const char *key_data, const ldns_rdf *key_name_rdf, const ldns_rdf *fudge_rdf, - const ldns_rdf *algorithm_rdf, const ldns_rdf *time_signed_rdf, const ldns_rdf *error_rdf, - const ldns_rdf *other_data_rdf, const ldns_rdf *orig_mac_rdf, int tsig_timers_only) -{ - ldns_status status; - char *wireformat; - int wiresize; - unsigned char *mac_bytes = NULL; - unsigned char *key_bytes = NULL; - int key_size; - const EVP_MD *digester; - char *algorithm_name = NULL; - unsigned int md_len = EVP_MAX_MD_SIZE; - ldns_rdf *result = NULL; - ldns_buffer *data_buffer = NULL; - ldns_rdf *canonical_key_name_rdf = NULL; - ldns_rdf *canonical_algorithm_rdf = NULL; - - if (key_name_rdf == NULL || algorithm_rdf == NULL) { - return LDNS_STATUS_NULL; - } - canonical_key_name_rdf = ldns_rdf_clone(key_name_rdf); - if (canonical_key_name_rdf == NULL) { - return LDNS_STATUS_MEM_ERR; - } - canonical_algorithm_rdf = ldns_rdf_clone(algorithm_rdf); - if (canonical_algorithm_rdf == NULL) { - ldns_rdf_deep_free(canonical_key_name_rdf); - return LDNS_STATUS_MEM_ERR; - } - /* - * prepare the digestable information - */ - data_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); - if (!data_buffer) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - /* if orig_mac is not NULL, add it too */ - if (orig_mac_rdf) { - (void) ldns_rdf2buffer_wire(data_buffer, orig_mac_rdf); - } - ldns_buffer_write(data_buffer, pkt_wire, pkt_wire_size); - if (!tsig_timers_only) { - ldns_dname2canonical(canonical_key_name_rdf); - (void)ldns_rdf2buffer_wire(data_buffer, - canonical_key_name_rdf); - ldns_buffer_write_u16(data_buffer, LDNS_RR_CLASS_ANY); - ldns_buffer_write_u32(data_buffer, 0); - ldns_dname2canonical(canonical_algorithm_rdf); - (void)ldns_rdf2buffer_wire(data_buffer, - canonical_algorithm_rdf); - } - (void)ldns_rdf2buffer_wire(data_buffer, time_signed_rdf); - (void)ldns_rdf2buffer_wire(data_buffer, fudge_rdf); - if (!tsig_timers_only) { - (void)ldns_rdf2buffer_wire(data_buffer, error_rdf); - (void)ldns_rdf2buffer_wire(data_buffer, other_data_rdf); - } - - wireformat = (char *) data_buffer->_data; - wiresize = (int) ldns_buffer_position(data_buffer); - - algorithm_name = ldns_rdf2str(algorithm_rdf); - if(!algorithm_name) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - - /* prepare the key */ - key_bytes = LDNS_XMALLOC(unsigned char, - ldns_b64_pton_calculate_size(strlen(key_data))); - if(!key_bytes) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - key_size = ldns_b64_pton(key_data, key_bytes, - ldns_b64_pton_calculate_size(strlen(key_data))); - if (key_size < 0) { - status = LDNS_STATUS_INVALID_B64; - goto clean; - } - /* hmac it */ - /* 2 spare bytes for the length */ - mac_bytes = LDNS_XMALLOC(unsigned char, md_len+2); - if(!mac_bytes) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - memset(mac_bytes, 0, md_len+2); - - digester = ldns_digest_function(algorithm_name); - - if (digester) { - (void) HMAC(digester, key_bytes, key_size, (void *)wireformat, - (size_t) wiresize, mac_bytes + 2, &md_len); - - ldns_write_uint16(mac_bytes, md_len); - result = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_INT16_DATA, md_len + 2, - mac_bytes); - } else { - status = LDNS_STATUS_CRYPTO_UNKNOWN_ALGO; - goto clean; - } - *tsig_mac = result; - status = LDNS_STATUS_OK; - clean: - LDNS_FREE(mac_bytes); - LDNS_FREE(key_bytes); - LDNS_FREE(algorithm_name); - ldns_buffer_free(data_buffer); - ldns_rdf_deep_free(canonical_algorithm_rdf); - ldns_rdf_deep_free(canonical_key_name_rdf); - return status; -} -#endif /* HAVE_SSL */ - - -#ifdef HAVE_SSL -bool -ldns_pkt_tsig_verify(ldns_pkt *pkt, const uint8_t *wire, size_t wirelen, const char *key_name, - const char *key_data, const ldns_rdf *orig_mac_rdf) -{ - return ldns_pkt_tsig_verify_next(pkt, wire, wirelen, key_name, key_data, orig_mac_rdf, 0); -} - -bool -ldns_pkt_tsig_verify_next(ldns_pkt *pkt, const uint8_t *wire, size_t wirelen, const char* key_name, - const char *key_data, const ldns_rdf *orig_mac_rdf, int tsig_timers_only) -{ - ldns_rdf *fudge_rdf; - ldns_rdf *algorithm_rdf; - ldns_rdf *time_signed_rdf; - ldns_rdf *orig_id_rdf; - ldns_rdf *error_rdf; - ldns_rdf *other_data_rdf; - ldns_rdf *pkt_mac_rdf; - ldns_rdf *my_mac_rdf; - ldns_rdf *key_name_rdf = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, key_name); - uint16_t pkt_id, orig_pkt_id; - ldns_status status; - - uint8_t *prepared_wire = NULL; - size_t prepared_wire_size = 0; - - ldns_rr *orig_tsig = ldns_pkt_tsig(pkt); - - if (!orig_tsig || ldns_rr_rd_count(orig_tsig) <= 6) { - ldns_rdf_deep_free(key_name_rdf); - return false; - } - algorithm_rdf = ldns_rr_rdf(orig_tsig, 0); - time_signed_rdf = ldns_rr_rdf(orig_tsig, 1); - fudge_rdf = ldns_rr_rdf(orig_tsig, 2); - pkt_mac_rdf = ldns_rr_rdf(orig_tsig, 3); - orig_id_rdf = ldns_rr_rdf(orig_tsig, 4); - error_rdf = ldns_rr_rdf(orig_tsig, 5); - other_data_rdf = ldns_rr_rdf(orig_tsig, 6); - - /* remove temporarily */ - ldns_pkt_set_tsig(pkt, NULL); - /* temporarily change the id to the original id */ - pkt_id = ldns_pkt_id(pkt); - orig_pkt_id = ldns_rdf2native_int16(orig_id_rdf); - ldns_pkt_set_id(pkt, orig_pkt_id); - - prepared_wire = ldns_tsig_prepare_pkt_wire(wire, wirelen, &prepared_wire_size); - - status = ldns_tsig_mac_new(&my_mac_rdf, prepared_wire, prepared_wire_size, - key_data, key_name_rdf, fudge_rdf, algorithm_rdf, - time_signed_rdf, error_rdf, other_data_rdf, orig_mac_rdf, tsig_timers_only); - - LDNS_FREE(prepared_wire); - - if (status != LDNS_STATUS_OK) { - ldns_rdf_deep_free(key_name_rdf); - return false; - } - /* Put back the values */ - ldns_pkt_set_tsig(pkt, orig_tsig); - ldns_pkt_set_id(pkt, pkt_id); - - ldns_rdf_deep_free(key_name_rdf); - - if( ldns_rdf_size(pkt_mac_rdf) != ldns_rdf_size(my_mac_rdf)) { - ldns_rdf_deep_free(my_mac_rdf); - return false; - } - /* use time insensitive memory compare */ - if(CRYPTO_memcmp(ldns_rdf_data(pkt_mac_rdf), ldns_rdf_data(my_mac_rdf), - ldns_rdf_size(my_mac_rdf)) == 0) { - ldns_rdf_deep_free(my_mac_rdf); - return true; - } else { - ldns_rdf_deep_free(my_mac_rdf); - return false; - } -} -#endif /* HAVE_SSL */ - -#ifdef HAVE_SSL -ldns_status -ldns_pkt_tsig_sign(ldns_pkt *pkt, const char *key_name, const char *key_data, - uint16_t fudge, const char *algorithm_name, const ldns_rdf *query_mac) -{ - return ldns_pkt_tsig_sign_next(pkt, key_name, key_data, fudge, algorithm_name, query_mac, 0); -} - -ldns_status -ldns_pkt_tsig_sign_next(ldns_pkt *pkt, const char *key_name, const char *key_data, - uint16_t fudge, const char *algorithm_name, const ldns_rdf *query_mac, int tsig_timers_only) -{ - ldns_rr *tsig_rr; - ldns_rdf *key_name_rdf = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, key_name); - ldns_rdf *fudge_rdf = NULL; - ldns_rdf *orig_id_rdf = NULL; - ldns_rdf *algorithm_rdf; - ldns_rdf *error_rdf = NULL; - ldns_rdf *mac_rdf = NULL; - ldns_rdf *other_data_rdf = NULL; - - ldns_status status = LDNS_STATUS_OK; - - uint8_t *pkt_wire = NULL; - size_t pkt_wire_len; - - struct timeval tv_time_signed; - uint8_t *time_signed = NULL; - ldns_rdf *time_signed_rdf = NULL; - - algorithm_rdf = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_DNAME, algorithm_name); - if(!key_name_rdf || !algorithm_rdf) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - - /* eww don't have create tsigtime rdf yet :( */ - /* bleh :p */ - if (gettimeofday(&tv_time_signed, NULL) == 0) { - time_signed = LDNS_XMALLOC(uint8_t, 6); - if(!time_signed) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - ldns_write_uint64_as_uint48(time_signed, - (uint64_t)tv_time_signed.tv_sec); - } else { - status = LDNS_STATUS_INTERNAL_ERR; - goto clean; - } - - time_signed_rdf = ldns_rdf_new(LDNS_RDF_TYPE_TSIGTIME, 6, time_signed); - if(!time_signed_rdf) { - LDNS_FREE(time_signed); - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - - fudge_rdf = ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, fudge); - - orig_id_rdf = ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, ldns_pkt_id(pkt)); - - error_rdf = ldns_native2rdf_int16(LDNS_RDF_TYPE_INT16, 0); - - other_data_rdf = ldns_native2rdf_int16_data(0, NULL); - - if(!fudge_rdf || !orig_id_rdf || !error_rdf || !other_data_rdf) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - - if (ldns_pkt2wire(&pkt_wire, pkt, &pkt_wire_len) != LDNS_STATUS_OK) { - status = LDNS_STATUS_ERR; - goto clean; - } - - status = ldns_tsig_mac_new(&mac_rdf, pkt_wire, pkt_wire_len, - key_data, key_name_rdf, fudge_rdf, algorithm_rdf, - time_signed_rdf, error_rdf, other_data_rdf, query_mac, tsig_timers_only); - - if (!mac_rdf) { - goto clean; - } - - LDNS_FREE(pkt_wire); - - /* Create the TSIG RR */ - tsig_rr = ldns_rr_new(); - if(!tsig_rr) { - status = LDNS_STATUS_MEM_ERR; - goto clean; - } - ldns_rr_set_owner(tsig_rr, key_name_rdf); - ldns_rr_set_class(tsig_rr, LDNS_RR_CLASS_ANY); - ldns_rr_set_type(tsig_rr, LDNS_RR_TYPE_TSIG); - ldns_rr_set_ttl(tsig_rr, 0); - - ldns_rr_push_rdf(tsig_rr, algorithm_rdf); - ldns_rr_push_rdf(tsig_rr, time_signed_rdf); - ldns_rr_push_rdf(tsig_rr, fudge_rdf); - ldns_rr_push_rdf(tsig_rr, mac_rdf); - ldns_rr_push_rdf(tsig_rr, orig_id_rdf); - ldns_rr_push_rdf(tsig_rr, error_rdf); - ldns_rr_push_rdf(tsig_rr, other_data_rdf); - - ldns_pkt_set_tsig(pkt, tsig_rr); - - return status; - - clean: - LDNS_FREE(pkt_wire); - ldns_rdf_free(key_name_rdf); - ldns_rdf_free(algorithm_rdf); - ldns_rdf_free(time_signed_rdf); - ldns_rdf_free(fudge_rdf); - ldns_rdf_free(orig_id_rdf); - ldns_rdf_free(error_rdf); - ldns_rdf_free(other_data_rdf); - return status; -} -#endif /* HAVE_SSL */ diff --git a/ldns/update.c b/ldns/update.c deleted file mode 100644 index e799bdb..0000000 --- a/ldns/update.c +++ /dev/null @@ -1,325 +0,0 @@ -/* update.c - * - * Functions for RFC 2136 Dynamic Update - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - */ - -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> -#include <stdlib.h> -#include <limits.h> - -/* - * RFC 2136 sections mapped to RFC 1035: - * zone/ZO -- QD/question - * prerequisites/PR -- AN/answers - * updates/UP -- NS/authority records - * additional data/AD -- AR/additional records - */ - -ldns_pkt * -ldns_update_pkt_new(ldns_rdf *zone_rdf, ldns_rr_class c, - const ldns_rr_list *pr_rrlist, const ldns_rr_list *up_rrlist, const ldns_rr_list *ad_rrlist) -{ - ldns_pkt *p; - - if (!zone_rdf || !up_rrlist) { - return NULL; - } - - if (c == 0) { - c = LDNS_RR_CLASS_IN; - } - - /* Create packet, fill in Zone Section. */ - p = ldns_pkt_query_new(zone_rdf, LDNS_RR_TYPE_SOA, c, LDNS_RD); - if (!p) { - return NULL; - } - zone_rdf = NULL; /* No longer safe to use. */ - - ldns_pkt_set_opcode(p, LDNS_PACKET_UPDATE); - - ldns_rr_list_deep_free(p->_authority); - - ldns_pkt_set_authority(p, ldns_rr_list_clone(up_rrlist)); - - ldns_update_set_upcount(p, ldns_rr_list_rr_count(up_rrlist)); - - if (pr_rrlist) { - ldns_rr_list_deep_free(p->_answer); /*XXX access function */ - ldns_pkt_set_answer(p, ldns_rr_list_clone(pr_rrlist)); - ldns_update_set_prcount(p, ldns_rr_list_rr_count(pr_rrlist)); - } - - if (ad_rrlist) { - ldns_rr_list_deep_free(p->_additional); - ldns_pkt_set_additional(p, ldns_rr_list_clone(ad_rrlist)); - ldns_update_set_adcount(p, ldns_rr_list_rr_count(ad_rrlist)); - } - return p; -} - -ldns_status -ldns_update_pkt_tsig_add(ldns_pkt *p, const ldns_resolver *r) -{ -#ifdef HAVE_SSL - uint16_t fudge = 300; /* Recommended fudge. [RFC2845 6.4] */ - if (ldns_resolver_tsig_keyname(r) && ldns_resolver_tsig_keydata(r)) - return ldns_pkt_tsig_sign(p, ldns_resolver_tsig_keyname(r), - ldns_resolver_tsig_keydata(r), fudge, - ldns_resolver_tsig_algorithm(r), NULL); -#else - /* do nothing */ - (void)p; - (void)r; -#endif /* HAVE_SSL */ - /* No TSIG to do. */ - return LDNS_STATUS_OK; -} - -/* Move to higher.c or similar? */ -/* XXX doc */ -ldns_status -ldns_update_soa_mname(ldns_rdf *zone, ldns_resolver *r, - ldns_rr_class c, ldns_rdf **mname) -{ - ldns_rr *soa_rr; - ldns_pkt *query, *resp; - - /* Nondestructive, so clone 'zone' here */ - query = ldns_pkt_query_new(ldns_rdf_clone(zone), LDNS_RR_TYPE_SOA, - c, LDNS_RD); - if (!query) { - return LDNS_STATUS_ERR; - } - - ldns_pkt_set_random_id(query); - if (ldns_resolver_send_pkt(&resp, r, query) != LDNS_STATUS_OK) { - ldns_pkt_free(query); - return LDNS_STATUS_ERR; - } - ldns_pkt_free(query); - if (!resp) { - return LDNS_STATUS_ERR; - } - - /* Expect a SOA answer. */ - *mname = NULL; - while ((soa_rr = ldns_rr_list_pop_rr(ldns_pkt_answer(resp)))) { - if (ldns_rr_get_type(soa_rr) != LDNS_RR_TYPE_SOA - || ldns_rr_rdf(soa_rr, 0) == NULL) - continue; - /* [RFC1035 3.3.13] */ - *mname = ldns_rdf_clone(ldns_rr_rdf(soa_rr, 0)); - break; - } - ldns_pkt_free(resp); - - return *mname ? LDNS_STATUS_OK : LDNS_STATUS_ERR; -} - -/* Try to get zone and MNAME from SOA queries. */ -ldns_status -ldns_update_soa_zone_mname(const char *fqdn, ldns_resolver *r, - ldns_rr_class c, ldns_rdf **zone_rdf, ldns_rdf **mname_rdf) -{ - ldns_rr *soa_rr, *rr; - ldns_rdf *soa_zone = NULL, *soa_mname = NULL; - ldns_rdf *ipaddr, *fqdn_rdf, *tmp; - ldns_rdf **nslist; - ldns_pkt *query, *resp; - ldns_resolver *tmp_r; - size_t i; - - /* - * XXX Ok, this cannot be the best way to find this...? - * XXX (I run into weird cache-related stuff here) - */ - - /* Step 1 - first find a nameserver that should know *something* */ - fqdn_rdf = ldns_dname_new_frm_str(fqdn); - query = ldns_pkt_query_new(fqdn_rdf, LDNS_RR_TYPE_SOA, c, LDNS_RD); - if (!query) { - return LDNS_STATUS_ERR; - } - fqdn_rdf = NULL; - - ldns_pkt_set_random_id(query); - if (ldns_resolver_send_pkt(&resp, r, query) != LDNS_STATUS_OK) { - ldns_pkt_free(query); - return LDNS_STATUS_ERR; - } - ldns_pkt_free(query); - if (!resp) { - return LDNS_STATUS_ERR; - } - - /* XXX Is it safe to only look in authority section here? */ - while ((soa_rr = ldns_rr_list_pop_rr(ldns_pkt_authority(resp)))) { - if (ldns_rr_get_type(soa_rr) != LDNS_RR_TYPE_SOA - || ldns_rr_rdf(soa_rr, 0) == NULL) - continue; - /* [RFC1035 3.3.13] */ - soa_mname = ldns_rdf_clone(ldns_rr_rdf(soa_rr, 0)); - break; - } - ldns_pkt_free(resp); - if (!soa_rr) { - return LDNS_STATUS_ERR; - } - - /* Step 2 - find SOA MNAME IP address, add to resolver */ - query = ldns_pkt_query_new(soa_mname, LDNS_RR_TYPE_A, c, LDNS_RD); - if (!query) { - return LDNS_STATUS_ERR; - } - soa_mname = NULL; - - ldns_pkt_set_random_id(query); - if (ldns_resolver_send_pkt(&resp, r, query) != LDNS_STATUS_OK) { - ldns_pkt_free(query); - return LDNS_STATUS_ERR; - } - ldns_pkt_free(query); - if (!resp) { - return LDNS_STATUS_ERR; - } - - if (ldns_pkt_ancount(resp) == 0) { - ldns_pkt_free(resp); - return LDNS_STATUS_ERR; - } - - /* XXX There may be more than one answer RR here. */ - rr = ldns_rr_list_pop_rr(ldns_pkt_answer(resp)); - ipaddr = ldns_rr_rdf(rr, 0); - - /* Put the SOA mname IP first in the nameserver list. */ - if (!(tmp_r = ldns_resolver_clone(r))) { - return LDNS_STATUS_MEM_ERR; - } - nslist = ldns_resolver_nameservers(tmp_r); - for (i = 0; i < ldns_resolver_nameserver_count(tmp_r); i++) { - if (ldns_rdf_compare(ipaddr, nslist[i]) == 0) { - if (i) { - tmp = nslist[0]; - nslist[0] = nslist[i]; - nslist[i] = tmp; - } - break; - } - } - if (i >= ldns_resolver_nameserver_count(tmp_r)) { - /* SOA mname was not part of the resolver so add it first. */ - (void) ldns_resolver_push_nameserver(tmp_r, ipaddr); - nslist = ldns_resolver_nameservers(tmp_r); - i = ldns_resolver_nameserver_count(tmp_r) - 1; - tmp = nslist[0]; - nslist[0] = nslist[i]; - nslist[i] = tmp; - } - ldns_pkt_free(resp); - - /* Make sure to ask the first in the list, i.e SOA mname */ - ldns_resolver_set_random(tmp_r, false); - - /* Step 3 - Redo SOA query, sending to SOA MNAME directly. */ - fqdn_rdf = ldns_dname_new_frm_str(fqdn); - query = ldns_pkt_query_new(fqdn_rdf, LDNS_RR_TYPE_SOA, c, LDNS_RD); - if (!query) { - ldns_resolver_free(tmp_r); - return LDNS_STATUS_ERR; - } - fqdn_rdf = NULL; - - ldns_pkt_set_random_id(query); - if (ldns_resolver_send_pkt(&resp, tmp_r, query) != LDNS_STATUS_OK) { - ldns_pkt_free(query); - ldns_resolver_free(tmp_r); - return LDNS_STATUS_ERR; - } - ldns_resolver_free(tmp_r); - ldns_pkt_free(query); - if (!resp) { - return LDNS_STATUS_ERR; - } - - /* XXX Is it safe to only look in authority section here, too? */ - while ((soa_rr = ldns_rr_list_pop_rr(ldns_pkt_authority(resp)))) { - if (ldns_rr_get_type(soa_rr) != LDNS_RR_TYPE_SOA - || ldns_rr_rdf(soa_rr, 0) == NULL) - continue; - /* [RFC1035 3.3.13] */ - soa_mname = ldns_rdf_clone(ldns_rr_rdf(soa_rr, 0)); - soa_zone = ldns_rdf_clone(ldns_rr_owner(soa_rr)); - break; - } - ldns_pkt_free(resp); - if (!soa_rr) { - return LDNS_STATUS_ERR; - } - - /* That seems to have worked, pass results to caller. */ - *zone_rdf = soa_zone; - *mname_rdf = soa_mname; - return LDNS_STATUS_OK; -} - -/* - * ldns_update_{get,set}_{zo,pr,up,ad}count - */ - -uint16_t -ldns_update_zocount(const ldns_pkt *p) -{ - return ldns_pkt_qdcount(p); -} - -uint16_t -ldns_update_prcount(const ldns_pkt *p) -{ - return ldns_pkt_ancount(p); -} - -uint16_t -ldns_update_upcount(const ldns_pkt *p) -{ - return ldns_pkt_nscount(p); -} - -uint16_t -ldns_update_ad(const ldns_pkt *p) -{ - return ldns_pkt_arcount(p); -} - -void -ldns_update_set_zo(ldns_pkt *p, uint16_t v) -{ - ldns_pkt_set_qdcount(p, v); -} - -void -ldns_update_set_prcount(ldns_pkt *p, uint16_t v) -{ - ldns_pkt_set_ancount(p, v); -} - -void -ldns_update_set_upcount(ldns_pkt *p, uint16_t v) -{ - ldns_pkt_set_nscount(p, v); -} - -void -ldns_update_set_adcount(ldns_pkt *p, uint16_t v) -{ - ldns_pkt_set_arcount(p, v); -} diff --git a/ldns/util.c b/ldns/util.c deleted file mode 100644 index 1216134..0000000 --- a/ldns/util.c +++ /dev/null @@ -1,782 +0,0 @@ -/* - * util.c - * - * some general memory functions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - -#include <ldns/config.h> - -#include <ldns/rdata.h> -#include <ldns/rr.h> -#include <ldns/util.h> -#include <strings.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/time.h> -#include <time.h> -#include <ctype.h> - -#ifdef HAVE_SSL -#include <openssl/rand.h> -#endif - -ldns_lookup_table * -ldns_lookup_by_name(ldns_lookup_table *table, const char *name) -{ - while (table->name != NULL) { - if (strcasecmp(name, table->name) == 0) - return table; - table++; - } - return NULL; -} - -ldns_lookup_table * -ldns_lookup_by_id(ldns_lookup_table *table, int id) -{ - while (table->name != NULL) { - if (table->id == id) - return table; - table++; - } - return NULL; -} - -int -ldns_get_bit(uint8_t bits[], size_t index) -{ - /* - * The bits are counted from left to right, so bit #0 is the - * left most bit. - */ - return (int) (bits[index / 8] & (1 << (7 - index % 8))); -} - -int -ldns_get_bit_r(uint8_t bits[], size_t index) -{ - /* - * The bits are counted from right to left, so bit #0 is the - * right most bit. - */ - return (int) bits[index / 8] & (1 << (index % 8)); -} - -void -ldns_set_bit(uint8_t *byte, int bit_nr, bool value) -{ - /* - * The bits are counted from right to left, so bit #0 is the - * right most bit. - */ - if (bit_nr >= 0 && bit_nr < 8) { - if (value) { - *byte = *byte | (0x01 << bit_nr); - } else { - *byte = *byte & ~(0x01 << bit_nr); - } - } -} - -int -ldns_hexdigit_to_int(char ch) -{ - switch (ch) { - case '0': return 0; - case '1': return 1; - case '2': return 2; - case '3': return 3; - case '4': return 4; - case '5': return 5; - case '6': return 6; - case '7': return 7; - case '8': return 8; - case '9': return 9; - case 'a': case 'A': return 10; - case 'b': case 'B': return 11; - case 'c': case 'C': return 12; - case 'd': case 'D': return 13; - case 'e': case 'E': return 14; - case 'f': case 'F': return 15; - default: - return -1; - } -} - -char -ldns_int_to_hexdigit(int i) -{ - switch (i) { - case 0: return '0'; - case 1: return '1'; - case 2: return '2'; - case 3: return '3'; - case 4: return '4'; - case 5: return '5'; - case 6: return '6'; - case 7: return '7'; - case 8: return '8'; - case 9: return '9'; - case 10: return 'a'; - case 11: return 'b'; - case 12: return 'c'; - case 13: return 'd'; - case 14: return 'e'; - case 15: return 'f'; - default: - abort(); - } -} - -int -ldns_hexstring_to_data(uint8_t *data, const char *str) -{ - size_t i; - - if (!str || !data) { - return -1; - } - - if (strlen(str) % 2 != 0) { - return -2; - } - - for (i = 0; i < strlen(str) / 2; i++) { - data[i] = - 16 * (uint8_t) ldns_hexdigit_to_int(str[i*2]) + - (uint8_t) ldns_hexdigit_to_int(str[i*2 + 1]); - } - - return (int) i; -} - -const char * -ldns_version(void) -{ - return (char*)LDNS_VERSION; -} - -/* Number of days per month (except for February in leap years). */ -static const int mdays[] = { - 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -}; - -#define LDNS_MOD(x,y) (((x) % (y) < 0) ? ((x) % (y) + (y)) : ((x) % (y))) -#define LDNS_DIV(x,y) (((x) % (y) < 0) ? ((x) / (y) - 1 ) : ((x) / (y))) - -static int -is_leap_year(int year) -{ - return LDNS_MOD(year, 4) == 0 && (LDNS_MOD(year, 100) != 0 - || LDNS_MOD(year, 400) == 0); -} - -static int -leap_days(int y1, int y2) -{ - --y1; - --y2; - return (LDNS_DIV(y2, 4) - LDNS_DIV(y1, 4)) - - (LDNS_DIV(y2, 100) - LDNS_DIV(y1, 100)) + - (LDNS_DIV(y2, 400) - LDNS_DIV(y1, 400)); -} - -/* - * Code adapted from Python 2.4.1 sources (Lib/calendar.py). - */ -time_t -ldns_mktime_from_utc(const struct tm *tm) -{ - int year = 1900 + tm->tm_year; - time_t days = 365 * ((time_t) year - 1970) + leap_days(1970, year); - time_t hours; - time_t minutes; - time_t seconds; - int i; - - for (i = 0; i < tm->tm_mon; ++i) { - days += mdays[i]; - } - if (tm->tm_mon > 1 && is_leap_year(year)) { - ++days; - } - days += tm->tm_mday - 1; - - hours = days * 24 + tm->tm_hour; - minutes = hours * 60 + tm->tm_min; - seconds = minutes * 60 + tm->tm_sec; - - return seconds; -} - -time_t -mktime_from_utc(const struct tm *tm) -{ - return ldns_mktime_from_utc(tm); -} - -#if SIZEOF_TIME_T <= 4 - -static void -ldns_year_and_yday_from_days_since_epoch(int64_t days, struct tm *result) -{ - int year = 1970; - int new_year; - - while (days < 0 || days >= (int64_t) (is_leap_year(year) ? 366 : 365)) { - new_year = year + (int) LDNS_DIV(days, 365); - days -= (new_year - year) * 365; - days -= leap_days(year, new_year); - year = new_year; - } - result->tm_year = year; - result->tm_yday = (int) days; -} - -/* Number of days per month in a leap year. */ -static const int leap_year_mdays[] = { - 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -}; - -static void -ldns_mon_and_mday_from_year_and_yday(struct tm *result) -{ - int idays = result->tm_yday; - const int *mon_lengths = is_leap_year(result->tm_year) ? - leap_year_mdays : mdays; - - result->tm_mon = 0; - while (idays >= mon_lengths[result->tm_mon]) { - idays -= mon_lengths[result->tm_mon++]; - } - result->tm_mday = idays + 1; -} - -static void -ldns_wday_from_year_and_yday(struct tm *result) -{ - result->tm_wday = 4 /* 1-1-1970 was a thursday */ - + LDNS_MOD((result->tm_year - 1970), 7) * LDNS_MOD(365, 7) - + leap_days(1970, result->tm_year) - + result->tm_yday; - result->tm_wday = LDNS_MOD(result->tm_wday, 7); - if (result->tm_wday < 0) { - result->tm_wday += 7; - } -} - -static struct tm * -ldns_gmtime64_r(int64_t clock, struct tm *result) -{ - result->tm_isdst = 0; - result->tm_sec = (int) LDNS_MOD(clock, 60); - clock = LDNS_DIV(clock, 60); - result->tm_min = (int) LDNS_MOD(clock, 60); - clock = LDNS_DIV(clock, 60); - result->tm_hour = (int) LDNS_MOD(clock, 24); - clock = LDNS_DIV(clock, 24); - - ldns_year_and_yday_from_days_since_epoch(clock, result); - ldns_mon_and_mday_from_year_and_yday(result); - ldns_wday_from_year_and_yday(result); - result->tm_year -= 1900; - - return result; -} - -#endif /* SIZEOF_TIME_T <= 4 */ - -static int64_t -ldns_serial_arithmitics_time(int32_t time, time_t now) -{ - int32_t offset = time - (int32_t) now; - return (int64_t) now + offset; -} - - -struct tm * -ldns_serial_arithmitics_gmtime_r(int32_t time, time_t now, struct tm *result) -{ -#if SIZEOF_TIME_T <= 4 - int64_t secs_since_epoch = ldns_serial_arithmitics_time(time, now); - return ldns_gmtime64_r(secs_since_epoch, result); -#else - time_t secs_since_epoch = ldns_serial_arithmitics_time(time, now); - return gmtime_r(&secs_since_epoch, result); -#endif -} - -/** - * Init the random source - * applications should call this if they need entropy data within ldns - * If openSSL is available, it is automatically seeded from /dev/urandom - * or /dev/random - * - * If you need more entropy, or have no openssl available, this function - * MUST be called at the start of the program - * - * If openssl *is* available, this function just adds more entropy - **/ -int -ldns_init_random(FILE *fd, unsigned int size) -{ - /* if fp is given, seed srandom with data from file - otherwise use /dev/urandom */ - FILE *rand_f; - uint8_t *seed; - size_t read = 0; - unsigned int seed_i; - struct timeval tv; - - /* we'll need at least sizeof(unsigned int) bytes for the - standard prng seed */ - if (size < (unsigned int) sizeof(seed_i)){ - size = (unsigned int) sizeof(seed_i); - } - - seed = LDNS_XMALLOC(uint8_t, size); - if(!seed) { - return 1; - } - - if (!fd) { - if ((rand_f = fopen("/dev/urandom", "r")) == NULL) { - /* no readable /dev/urandom, try /dev/random */ - if ((rand_f = fopen("/dev/random", "r")) == NULL) { - /* no readable /dev/random either, and no entropy - source given. we'll have to improvise */ - for (read = 0; read < size; read++) { - gettimeofday(&tv, NULL); - seed[read] = (uint8_t) (tv.tv_usec % 256); - } - } else { - read = fread(seed, 1, size, rand_f); - } - } else { - read = fread(seed, 1, size, rand_f); - } - } else { - rand_f = fd; - read = fread(seed, 1, size, rand_f); - } - - if (read < size) { - LDNS_FREE(seed); - if (!fd) fclose(rand_f); - return 1; - } else { -#ifdef HAVE_SSL - /* Seed the OpenSSL prng (most systems have it seeded - automatically, in that case this call just adds entropy */ - RAND_seed(seed, (int) size); -#else - /* Seed the standard prng, only uses the first - * unsigned sizeof(unsiged int) bytes found in the entropy pool - */ - memcpy(&seed_i, seed, sizeof(seed_i)); - srandom(seed_i); -#endif - LDNS_FREE(seed); - } - - if (!fd) { - if (rand_f) fclose(rand_f); - } - - return 0; -} - -/** - * Get random number. - * - */ -uint16_t -ldns_get_random(void) -{ - uint16_t rid = 0; -#ifdef HAVE_SSL - if (RAND_bytes((unsigned char*)&rid, 2) != 1) { - rid = (uint16_t) random(); - } -#else - rid = (uint16_t) random(); -#endif - return rid; -} - -/* - * BubbleBabble code taken from OpenSSH - * Copyright (c) 2001 Carsten Raskgaard. All rights reserved. - */ -char * -ldns_bubblebabble(uint8_t *data, size_t len) -{ - char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' }; - char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm', - 'n', 'p', 'r', 's', 't', 'v', 'z', 'x' }; - size_t i, j = 0, rounds, seed = 1; - char *retval; - - rounds = (len / 2) + 1; - retval = LDNS_XMALLOC(char, rounds * 6); - if(!retval) return NULL; - retval[j++] = 'x'; - for (i = 0; i < rounds; i++) { - size_t idx0, idx1, idx2, idx3, idx4; - if ((i + 1 < rounds) || (len % 2 != 0)) { - idx0 = (((((size_t)(data[2 * i])) >> 6) & 3) + - seed) % 6; - idx1 = (((size_t)(data[2 * i])) >> 2) & 15; - idx2 = ((((size_t)(data[2 * i])) & 3) + - (seed / 6)) % 6; - retval[j++] = vowels[idx0]; - retval[j++] = consonants[idx1]; - retval[j++] = vowels[idx2]; - if ((i + 1) < rounds) { - idx3 = (((size_t)(data[(2 * i) + 1])) >> 4) & 15; - idx4 = (((size_t)(data[(2 * i) + 1]))) & 15; - retval[j++] = consonants[idx3]; - retval[j++] = '-'; - retval[j++] = consonants[idx4]; - seed = ((seed * 5) + - ((((size_t)(data[2 * i])) * 7) + - ((size_t)(data[(2 * i) + 1])))) % 36; - } - } else { - idx0 = seed % 6; - idx1 = 16; - idx2 = seed / 6; - retval[j++] = vowels[idx0]; - retval[j++] = consonants[idx1]; - retval[j++] = vowels[idx2]; - } - } - retval[j++] = 'x'; - retval[j++] = '\0'; - return retval; -} - -/* - * For backwards compatibility, because we have always exported this symbol. - */ -#ifdef HAVE_B64_NTOP -int ldns_b64_ntop(const uint8_t* src, size_t srclength, - char *target, size_t targsize); -{ - return b64_ntop(src, srclength, target, targsize); -} -#endif - -/* - * For backwards compatibility, because we have always exported this symbol. - */ -#ifdef HAVE_B64_PTON -int ldns_b64_pton(const char* src, uint8_t *target, size_t targsize) -{ - return b64_pton(src, target, targsize); -} -#endif - - -static int -ldns_b32_ntop_base(const uint8_t* src, size_t src_sz, - char* dst, size_t dst_sz, - bool extended_hex, bool add_padding) -{ - size_t ret_sz; - const char* b32 = extended_hex ? "0123456789abcdefghijklmnopqrstuv" - : "abcdefghijklmnopqrstuvwxyz234567"; - - size_t c = 0; /* c is used to carry partial base32 character over - * byte boundaries for sizes with a remainder. - * (i.e. src_sz % 5 != 0) - */ - - ret_sz = add_padding ? ldns_b32_ntop_calculate_size(src_sz) - : ldns_b32_ntop_calculate_size_no_padding(src_sz); - - /* Do we have enough space? */ - if (dst_sz < ret_sz + 1) - return -1; - - /* We know the size; terminate the string */ - dst[ret_sz] = '\0'; - - /* First process all chunks of five */ - while (src_sz >= 5) { - /* 00000... ........ ........ ........ ........ */ - dst[0] = b32[(src[0] ) >> 3]; - - /* .....111 11...... ........ ........ ........ */ - dst[1] = b32[(src[0] & 0x07) << 2 | src[1] >> 6]; - - /* ........ ..22222. ........ ........ ........ */ - dst[2] = b32[(src[1] & 0x3e) >> 1]; - - /* ........ .......3 3333.... ........ ........ */ - dst[3] = b32[(src[1] & 0x01) << 4 | src[2] >> 4]; - - /* ........ ........ ....4444 4....... ........ */ - dst[4] = b32[(src[2] & 0x0f) << 1 | src[3] >> 7]; - - /* ........ ........ ........ .55555.. ........ */ - dst[5] = b32[(src[3] & 0x7c) >> 2]; - - /* ........ ........ ........ ......66 666..... */ - dst[6] = b32[(src[3] & 0x03) << 3 | src[4] >> 5]; - - /* ........ ........ ........ ........ ...77777 */ - dst[7] = b32[(src[4] & 0x1f) ]; - - src_sz -= 5; - src += 5; - dst += 8; - } - /* Process what remains */ - switch (src_sz) { - case 4: /* ........ ........ ........ ......66 666..... */ - dst[6] = b32[(src[3] & 0x03) << 3]; - - /* ........ ........ ........ .55555.. ........ */ - dst[5] = b32[(src[3] & 0x7c) >> 2]; - - /* ........ ........ ....4444 4....... ........ */ - c = src[3] >> 7 ; - /* fallthrough */ - case 3: dst[4] = b32[(src[2] & 0x0f) << 1 | c]; - - /* ........ .......3 3333.... ........ ........ */ - c = src[2] >> 4 ; - /* fallthrough */ - case 2: dst[3] = b32[(src[1] & 0x01) << 4 | c]; - - /* ........ ..22222. ........ ........ ........ */ - dst[2] = b32[(src[1] & 0x3e) >> 1]; - - /* .....111 11...... ........ ........ ........ */ - c = src[1] >> 6 ; - /* fallthrough */ - case 1: dst[1] = b32[(src[0] & 0x07) << 2 | c]; - - /* 00000... ........ ........ ........ ........ */ - dst[0] = b32[ src[0] >> 3]; - } - /* Add padding */ - if (add_padding) { - switch (src_sz) { - case 1: dst[2] = '='; - dst[3] = '='; - /* fallthrough */ - case 2: dst[4] = '='; - /* fallthrough */ - case 3: dst[5] = '='; - dst[6] = '='; - /* fallthrough */ - case 4: dst[7] = '='; - } - } - return (int)ret_sz; -} - -int -ldns_b32_ntop(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz) -{ - return ldns_b32_ntop_base(src, src_sz, dst, dst_sz, false, true); -} - -int -ldns_b32_ntop_extended_hex(const uint8_t* src, size_t src_sz, - char* dst, size_t dst_sz) -{ - return ldns_b32_ntop_base(src, src_sz, dst, dst_sz, true, true); -} - -#ifndef HAVE_B32_NTOP - -int -b32_ntop(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz) -{ - return ldns_b32_ntop_base(src, src_sz, dst, dst_sz, false, true); -} - -int -b32_ntop_extended_hex(const uint8_t* src, size_t src_sz, - char* dst, size_t dst_sz) -{ - return ldns_b32_ntop_base(src, src_sz, dst, dst_sz, true, true); -} - -#endif /* ! HAVE_B32_NTOP */ - -static int -ldns_b32_pton_base(const char* src, size_t src_sz, - uint8_t* dst, size_t dst_sz, - bool extended_hex, bool check_padding) -{ - size_t i = 0; - char ch = '\0'; - uint8_t buf[8]; - uint8_t* start = dst; - - while (src_sz) { - /* Collect 8 characters in buf (if possible) */ - for (i = 0; i < 8; i++) { - - do { - ch = *src++; - --src_sz; - - } while (isspace((unsigned char)ch) && src_sz > 0); - - if (ch == '=' || ch == '\0') - break; - - else if (extended_hex) - - if (ch >= '0' && ch <= '9') - buf[i] = (uint8_t)ch - '0'; - else if (ch >= 'a' && ch <= 'v') - buf[i] = (uint8_t)ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'V') - buf[i] = (uint8_t)ch - 'A' + 10; - else - return -1; - - else if (ch >= 'a' && ch <= 'z') - buf[i] = (uint8_t)ch - 'a'; - else if (ch >= 'A' && ch <= 'Z') - buf[i] = (uint8_t)ch - 'A'; - else if (ch >= '2' && ch <= '7') - buf[i] = (uint8_t)ch - '2' + 26; - else - return -1; - } - /* Less that 8 characters. We're done. */ - if (i < 8) - break; - - /* Enough space available at the destination? */ - if (dst_sz < 5) - return -1; - - /* 00000... ........ ........ ........ ........ */ - /* .....111 11...... ........ ........ ........ */ - dst[0] = buf[0] << 3 | buf[1] >> 2; - - /* .....111 11...... ........ ........ ........ */ - /* ........ ..22222. ........ ........ ........ */ - /* ........ .......3 3333.... ........ ........ */ - dst[1] = buf[1] << 6 | buf[2] << 1 | buf[3] >> 4; - - /* ........ .......3 3333.... ........ ........ */ - /* ........ ........ ....4444 4....... ........ */ - dst[2] = buf[3] << 4 | buf[4] >> 1; - - /* ........ ........ ....4444 4....... ........ */ - /* ........ ........ ........ .55555.. ........ */ - /* ........ ........ ........ ......66 666..... */ - dst[3] = buf[4] << 7 | buf[5] << 2 | buf[6] >> 3; - - /* ........ ........ ........ ......66 666..... */ - /* ........ ........ ........ ........ ...77777 */ - dst[4] = buf[6] << 5 | buf[7]; - - dst += 5; - dst_sz -= 5; - } - /* Not ending on a eight byte boundary? */ - if (i > 0 && i < 8) { - - /* Enough space available at the destination? */ - if (dst_sz < (i + 1) / 2) - return -1; - - switch (i) { - case 7: /* ........ ........ ........ ......66 666..... */ - /* ........ ........ ........ .55555.. ........ */ - /* ........ ........ ....4444 4....... ........ */ - dst[3] = buf[4] << 7 | buf[5] << 2 | buf[6] >> 3; - /* fallthrough */ - - case 5: /* ........ ........ ....4444 4....... ........ */ - /* ........ .......3 3333.... ........ ........ */ - dst[2] = buf[3] << 4 | buf[4] >> 1; - /* fallthrough */ - - case 4: /* ........ .......3 3333.... ........ ........ */ - /* ........ ..22222. ........ ........ ........ */ - /* .....111 11...... ........ ........ ........ */ - dst[1] = buf[1] << 6 | buf[2] << 1 | buf[3] >> 4; - /* fallthrough */ - - case 2: /* .....111 11...... ........ ........ ........ */ - /* 00000... ........ ........ ........ ........ */ - dst[0] = buf[0] << 3 | buf[1] >> 2; - - break; - - default: - return -1; - } - dst += (i + 1) / 2; - - if (check_padding) { - /* Check remaining padding characters */ - if (ch != '=') - return -1; - - /* One down, 8 - i - 1 more to come... */ - for (i = 8 - i - 1; i > 0; i--) { - - do { - if (src_sz == 0) - return -1; - ch = *src++; - src_sz--; - - } while (isspace((unsigned char)ch)); - - if (ch != '=') - return -1; - } - } - } - return dst - start; -} - -int -ldns_b32_pton(const char* src, size_t src_sz, uint8_t* dst, size_t dst_sz) -{ - return ldns_b32_pton_base(src, src_sz, dst, dst_sz, false, true); -} - -int -ldns_b32_pton_extended_hex(const char* src, size_t src_sz, - uint8_t* dst, size_t dst_sz) -{ - return ldns_b32_pton_base(src, src_sz, dst, dst_sz, true, true); -} - -#ifndef HAVE_B32_PTON - -int -b32_pton(const char* src, size_t src_sz, uint8_t* dst, size_t dst_sz) -{ - return ldns_b32_pton_base(src, src_sz, dst, dst_sz, false, true); -} - -int -b32_pton_extended_hex(const char* src, size_t src_sz, - uint8_t* dst, size_t dst_sz) -{ - return ldns_b32_pton_base(src, src_sz, dst, dst_sz, true, true); -} - -#endif /* ! HAVE_B32_PTON */ - diff --git a/ldns/wire2host.c b/ldns/wire2host.c deleted file mode 100644 index 1473a94..0000000 --- a/ldns/wire2host.c +++ /dev/null @@ -1,497 +0,0 @@ -/* - * wire2host.c - * - * conversion routines from the wire to the host - * format. - * This will usually just a re-ordering of the - * data (as we store it in network format) - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ - - -#include <ldns/config.h> - -#include <ldns/ldns.h> -/*#include <ldns/wire2host.h>*/ - -#include <strings.h> -#include <limits.h> - - - -/* - * Set of macro's to deal with the dns message header as specified - * in RFC1035 in portable way. - * - */ - -/* - * - * 1 1 1 1 1 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ID | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * |QR| Opcode |AA|TC|RD|RA| Z|AD|CD| RCODE | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | QDCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ANCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | NSCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * | ARCOUNT | - * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - * - */ - - -/* allocates memory to *dname! */ -ldns_status -ldns_wire2dname(ldns_rdf **dname, const uint8_t *wire, size_t max, size_t *pos) -{ - uint8_t label_size; - uint16_t pointer_target; - uint8_t pointer_target_buf[2]; - size_t dname_pos = 0; - size_t uncompressed_length = 0; - size_t compression_pos = 0; - uint8_t tmp_dname[LDNS_MAX_DOMAINLEN]; - unsigned int pointer_count = 0; - - if (pos == NULL) { - return LDNS_STATUS_WIRE_RDATA_ERR; - } - if (*pos >= max) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - label_size = wire[*pos]; - while (label_size > 0) { - /* compression */ - while (label_size >= 192) { - if (compression_pos == 0) { - compression_pos = *pos + 2; - } - - pointer_count++; - - /* remove first two bits */ - if (*pos + 2 > max) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - pointer_target_buf[0] = wire[*pos] & 63; - pointer_target_buf[1] = wire[*pos + 1]; - pointer_target = ldns_read_uint16(pointer_target_buf); - - if (pointer_target == 0) { - return LDNS_STATUS_INVALID_POINTER; - } else if (pointer_target >= max) { - return LDNS_STATUS_INVALID_POINTER; - } else if (pointer_count > LDNS_MAX_POINTERS) { - return LDNS_STATUS_INVALID_POINTER; - } - *pos = pointer_target; - label_size = wire[*pos]; - } - if(label_size == 0) - break; /* break from pointer to 0 byte */ - if (label_size > LDNS_MAX_LABELLEN) { - return LDNS_STATUS_LABEL_OVERFLOW; - } - if (*pos + 1 + label_size > max) { - return LDNS_STATUS_LABEL_OVERFLOW; - } - - /* check space for labelcount itself */ - if (dname_pos + 1 > LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - tmp_dname[dname_pos] = label_size; - if (label_size > 0) { - dname_pos++; - } - *pos = *pos + 1; - if (dname_pos + label_size > LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - memcpy(&tmp_dname[dname_pos], &wire[*pos], label_size); - uncompressed_length += label_size + 1; - dname_pos += label_size; - *pos = *pos + label_size; - - if (*pos < max) { - label_size = wire[*pos]; - } - } - - if (compression_pos > 0) { - *pos = compression_pos; - } else { - *pos = *pos + 1; - } - - if (dname_pos >= LDNS_MAX_DOMAINLEN) { - return LDNS_STATUS_DOMAINNAME_OVERFLOW; - } - - tmp_dname[dname_pos] = 0; - dname_pos++; - - *dname = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, - (uint16_t) dname_pos, tmp_dname); - if (!*dname) { - return LDNS_STATUS_MEM_ERR; - } - return LDNS_STATUS_OK; -} - -/* maybe make this a goto error so data can be freed or something/ */ -#define LDNS_STATUS_CHECK_RETURN(st) {if (st != LDNS_STATUS_OK) { return st; }} -#define LDNS_STATUS_CHECK_GOTO(st, label) {if (st != LDNS_STATUS_OK) { /*printf("STG %s:%d: status code %d\n", __FILE__, __LINE__, st);*/ goto label; }} - -ldns_status -ldns_wire2rdf(ldns_rr *rr, const uint8_t *wire, size_t max, size_t *pos) -{ - size_t end; - size_t cur_rdf_length; - uint8_t rdf_index; - uint8_t *data; - uint16_t rd_length; - ldns_rdf *cur_rdf = NULL; - ldns_rdf_type cur_rdf_type; - const ldns_rr_descriptor *descriptor; - ldns_status status; - - assert(rr != NULL); - - descriptor = ldns_rr_descript(ldns_rr_get_type(rr)); - - if (*pos + 2 > max) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - - rd_length = ldns_read_uint16(&wire[*pos]); - *pos = *pos + 2; - - if (*pos + rd_length > max) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - - end = *pos + (size_t) rd_length; - - rdf_index = 0; - while (*pos < end && - rdf_index < ldns_rr_descriptor_maximum(descriptor)) { - - cur_rdf_length = 0; - - cur_rdf_type = ldns_rr_descriptor_field_type( - descriptor, rdf_index); - - /* handle special cases immediately, set length - for fixed length rdata and do them below */ - switch (cur_rdf_type) { - case LDNS_RDF_TYPE_DNAME: - status = ldns_wire2dname(&cur_rdf, wire, max, pos); - LDNS_STATUS_CHECK_RETURN(status); - break; - case LDNS_RDF_TYPE_CLASS: - case LDNS_RDF_TYPE_ALG: - case LDNS_RDF_TYPE_CERTIFICATE_USAGE: - case LDNS_RDF_TYPE_SELECTOR: - case LDNS_RDF_TYPE_MATCHING_TYPE: - case LDNS_RDF_TYPE_INT8: - cur_rdf_length = LDNS_RDF_SIZE_BYTE; - break; - case LDNS_RDF_TYPE_TYPE: - case LDNS_RDF_TYPE_INT16: - case LDNS_RDF_TYPE_CERT_ALG: - cur_rdf_length = LDNS_RDF_SIZE_WORD; - break; - case LDNS_RDF_TYPE_TIME: - case LDNS_RDF_TYPE_INT32: - case LDNS_RDF_TYPE_A: - case LDNS_RDF_TYPE_PERIOD: - cur_rdf_length = LDNS_RDF_SIZE_DOUBLEWORD; - break; - case LDNS_RDF_TYPE_TSIGTIME: - case LDNS_RDF_TYPE_EUI48: - cur_rdf_length = LDNS_RDF_SIZE_6BYTES; - break; - case LDNS_RDF_TYPE_ILNP64: - case LDNS_RDF_TYPE_EUI64: - cur_rdf_length = LDNS_RDF_SIZE_8BYTES; - break; - case LDNS_RDF_TYPE_AAAA: - cur_rdf_length = LDNS_RDF_SIZE_16BYTES; - break; - case LDNS_RDF_TYPE_STR: - case LDNS_RDF_TYPE_NSEC3_SALT: - case LDNS_RDF_TYPE_TAG: - /* len is stored in first byte - * it should be in the rdf too, so just - * copy len+1 from this position - */ - cur_rdf_length = ((size_t) wire[*pos]) + 1; - break; - - case LDNS_RDF_TYPE_INT16_DATA: - if (*pos + 2 > end) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - cur_rdf_length = - (size_t) ldns_read_uint16(&wire[*pos]) + 2; - break; - case LDNS_RDF_TYPE_HIP: - if (*pos + 4 > end) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - cur_rdf_length = - (size_t) wire[*pos] + - (size_t) ldns_read_uint16(&wire[*pos + 2]) + 4; - break; - case LDNS_RDF_TYPE_B32_EXT: - case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: - /* length is stored in first byte */ - cur_rdf_length = ((size_t) wire[*pos]) + 1; - break; - case LDNS_RDF_TYPE_APL: - case LDNS_RDF_TYPE_B64: - case LDNS_RDF_TYPE_HEX: - case LDNS_RDF_TYPE_NSEC: - case LDNS_RDF_TYPE_UNKNOWN: - case LDNS_RDF_TYPE_SERVICE: - case LDNS_RDF_TYPE_LOC: - case LDNS_RDF_TYPE_WKS: - case LDNS_RDF_TYPE_NSAP: - case LDNS_RDF_TYPE_ATMA: - case LDNS_RDF_TYPE_IPSECKEY: - case LDNS_RDF_TYPE_LONG_STR: - case LDNS_RDF_TYPE_AMTRELAY: - case LDNS_RDF_TYPE_NONE: - /* - * Read to end of rr rdata - */ - cur_rdf_length = end - *pos; - break; - } - - /* fixed length rdata */ - if (cur_rdf_length > 0) { - if (cur_rdf_length + *pos > end) { - return LDNS_STATUS_PACKET_OVERFLOW; - } - data = LDNS_XMALLOC(uint8_t, rd_length); - if (!data) { - return LDNS_STATUS_MEM_ERR; - } - memcpy(data, &wire[*pos], cur_rdf_length); - - cur_rdf = ldns_rdf_new(cur_rdf_type, - cur_rdf_length, data); - *pos = *pos + cur_rdf_length; - } - - if (cur_rdf) { - ldns_rr_push_rdf(rr, cur_rdf); - cur_rdf = NULL; - } - - rdf_index++; - - } /* while (rdf_index < ldns_rr_descriptor_maximum(descriptor)) */ - - - return LDNS_STATUS_OK; -} - - -/* TODO: - can *pos be incremented at READ_INT? or maybe use something like - RR_CLASS(wire)? - uhhm Jelte?? -*/ -ldns_status -ldns_wire2rr(ldns_rr **rr_p, const uint8_t *wire, size_t max, - size_t *pos, ldns_pkt_section section) -{ - ldns_rdf *owner = NULL; - ldns_rr *rr = ldns_rr_new(); - ldns_status status; - - status = ldns_wire2dname(&owner, wire, max, pos); - LDNS_STATUS_CHECK_GOTO(status, status_error); - - ldns_rr_set_owner(rr, owner); - - if (*pos + 4 > max) { - status = LDNS_STATUS_PACKET_OVERFLOW; - goto status_error; - } - - ldns_rr_set_type(rr, ldns_read_uint16(&wire[*pos])); - *pos = *pos + 2; - - ldns_rr_set_class(rr, ldns_read_uint16(&wire[*pos])); - *pos = *pos + 2; - - if (section != LDNS_SECTION_QUESTION) { - if (*pos + 4 > max) { - status = LDNS_STATUS_PACKET_OVERFLOW; - goto status_error; - } - ldns_rr_set_ttl(rr, ldns_read_uint32(&wire[*pos])); - - *pos = *pos + 4; - status = ldns_wire2rdf(rr, wire, max, pos); - - LDNS_STATUS_CHECK_GOTO(status, status_error); - ldns_rr_set_question(rr, false); - } else { - ldns_rr_set_question(rr, true); - } - - *rr_p = rr; - return LDNS_STATUS_OK; - -status_error: - ldns_rr_free(rr); - return status; -} - -static ldns_status -ldns_wire2pkt_hdr(ldns_pkt *packet, const uint8_t *wire, size_t max, size_t *pos) -{ - if (*pos + LDNS_HEADER_SIZE > max) { - return LDNS_STATUS_WIRE_INCOMPLETE_HEADER; - } else { - ldns_pkt_set_id(packet, LDNS_ID_WIRE(wire)); - ldns_pkt_set_qr(packet, LDNS_QR_WIRE(wire)); - ldns_pkt_set_opcode(packet, LDNS_OPCODE_WIRE(wire)); - ldns_pkt_set_aa(packet, LDNS_AA_WIRE(wire)); - ldns_pkt_set_tc(packet, LDNS_TC_WIRE(wire)); - ldns_pkt_set_rd(packet, LDNS_RD_WIRE(wire)); - ldns_pkt_set_ra(packet, LDNS_RA_WIRE(wire)); - ldns_pkt_set_ad(packet, LDNS_AD_WIRE(wire)); - ldns_pkt_set_cd(packet, LDNS_CD_WIRE(wire)); - ldns_pkt_set_rcode(packet, LDNS_RCODE_WIRE(wire)); - - ldns_pkt_set_qdcount(packet, LDNS_QDCOUNT(wire)); - ldns_pkt_set_ancount(packet, LDNS_ANCOUNT(wire)); - ldns_pkt_set_nscount(packet, LDNS_NSCOUNT(wire)); - ldns_pkt_set_arcount(packet, LDNS_ARCOUNT(wire)); - - *pos += LDNS_HEADER_SIZE; - - return LDNS_STATUS_OK; - } -} - -ldns_status -ldns_buffer2pkt_wire(ldns_pkt **packet, const ldns_buffer *buffer) -{ - /* lazy */ - return ldns_wire2pkt(packet, ldns_buffer_begin(buffer), - ldns_buffer_limit(buffer)); - -} - -ldns_status -ldns_wire2pkt(ldns_pkt **packet_p, const uint8_t *wire, size_t max) -{ - size_t pos = 0; - uint16_t i; - ldns_rr *rr; - ldns_pkt *packet = ldns_pkt_new(); - ldns_status status = LDNS_STATUS_OK; - uint8_t have_edns = 0; - - uint8_t data[4]; - - if (!packet) { - return LDNS_STATUS_MEM_ERR; - } - - status = ldns_wire2pkt_hdr(packet, wire, max, &pos); - LDNS_STATUS_CHECK_GOTO(status, status_error); - - for (i = 0; i < ldns_pkt_qdcount(packet); i++) { - - status = ldns_wire2rr(&rr, wire, max, &pos, LDNS_SECTION_QUESTION); - if (status == LDNS_STATUS_PACKET_OVERFLOW) { - status = LDNS_STATUS_WIRE_INCOMPLETE_QUESTION; - } - LDNS_STATUS_CHECK_GOTO(status, status_error); - if (!ldns_rr_list_push_rr(ldns_pkt_question(packet), rr)) { - ldns_pkt_free(packet); - return LDNS_STATUS_INTERNAL_ERR; - } - } - for (i = 0; i < ldns_pkt_ancount(packet); i++) { - status = ldns_wire2rr(&rr, wire, max, &pos, LDNS_SECTION_ANSWER); - if (status == LDNS_STATUS_PACKET_OVERFLOW) { - status = LDNS_STATUS_WIRE_INCOMPLETE_ANSWER; - } - LDNS_STATUS_CHECK_GOTO(status, status_error); - if (!ldns_rr_list_push_rr(ldns_pkt_answer(packet), rr)) { - ldns_pkt_free(packet); - return LDNS_STATUS_INTERNAL_ERR; - } - } - for (i = 0; i < ldns_pkt_nscount(packet); i++) { - status = ldns_wire2rr(&rr, wire, max, &pos, LDNS_SECTION_AUTHORITY); - if (status == LDNS_STATUS_PACKET_OVERFLOW) { - status = LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY; - } - LDNS_STATUS_CHECK_GOTO(status, status_error); - if (!ldns_rr_list_push_rr(ldns_pkt_authority(packet), rr)) { - ldns_pkt_free(packet); - return LDNS_STATUS_INTERNAL_ERR; - } - } - for (i = 0; i < ldns_pkt_arcount(packet); i++) { - status = ldns_wire2rr(&rr, wire, max, &pos, LDNS_SECTION_ADDITIONAL); - if (status == LDNS_STATUS_PACKET_OVERFLOW) { - status = LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL; - } - LDNS_STATUS_CHECK_GOTO(status, status_error); - - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_OPT) { - ldns_pkt_set_edns_udp_size(packet, ldns_rr_get_class(rr)); - ldns_write_uint32(data, ldns_rr_ttl(rr)); - ldns_pkt_set_edns_extended_rcode(packet, data[0]); - ldns_pkt_set_edns_version(packet, data[1]); - ldns_pkt_set_edns_z(packet, ldns_read_uint16(&data[2])); - /* edns might not have rdfs */ - if (ldns_rr_rdf(rr, 0)) { - ldns_rdf_deep_free(ldns_pkt_edns_data(packet)); - ldns_pkt_set_edns_data(packet, ldns_rdf_clone(ldns_rr_rdf(rr, 0))); - } - ldns_rr_free(rr); - have_edns += 1; - } else if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_TSIG) { - ldns_pkt_set_tsig(packet, rr); - ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) - 1); - } else if (!ldns_rr_list_push_rr(ldns_pkt_additional(packet), rr)) { - ldns_pkt_free(packet); - return LDNS_STATUS_INTERNAL_ERR; - } - } - ldns_pkt_set_size(packet, max); - if(have_edns) - ldns_pkt_set_arcount(packet, ldns_pkt_arcount(packet) - - have_edns); - packet->_edns_present = have_edns; - - *packet_p = packet; - return status; - -status_error: - ldns_pkt_free(packet); - return status; -} diff --git a/ldns/zone.c b/ldns/zone.c deleted file mode 100644 index e952074..0000000 --- a/ldns/zone.c +++ /dev/null @@ -1,317 +0,0 @@ -/* zone.c - * - * Functions for ldns_zone structure - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ -#include <ldns/config.h> - -#include <ldns/ldns.h> - -#include <strings.h> -#include <limits.h> - -ldns_rr * -ldns_zone_soa(const ldns_zone *z) -{ - return z->_soa; -} - -size_t -ldns_zone_rr_count(const ldns_zone *z) -{ - return ldns_rr_list_rr_count(z->_rrs); -} - -void -ldns_zone_set_soa(ldns_zone *z, ldns_rr *soa) -{ - z->_soa = soa; -} - -ldns_rr_list * -ldns_zone_rrs(const ldns_zone *z) -{ - return z->_rrs; -} - -void -ldns_zone_set_rrs(ldns_zone *z, ldns_rr_list *rrlist) -{ - z->_rrs = rrlist; -} - -bool -ldns_zone_push_rr_list(ldns_zone *z, const ldns_rr_list *list) -{ - return ldns_rr_list_cat(ldns_zone_rrs(z), list); -} - -bool -ldns_zone_push_rr(ldns_zone *z, ldns_rr *rr) -{ - return ldns_rr_list_push_rr(ldns_zone_rrs(z), rr); -} - - -/* - * Get the list of glue records in a zone - * XXX: there should be a way for this to return error, other than NULL, - * since NULL is a valid return - */ -ldns_rr_list * -ldns_zone_glue_rr_list(const ldns_zone *z) -{ - /* when do we find glue? It means we find an IP address - * (AAAA/A) for a nameserver listed in the zone - * - * Alg used here: - * first find all the zonecuts (NS records) - * find all the AAAA or A records (can be done it the - * above loop). - * - * Check if the aaaa/a list are subdomains under the - * NS domains. - * If yes -> glue, if no -> not glue - */ - - ldns_rr_list *zone_cuts; - ldns_rr_list *addr; - ldns_rr_list *glue; - ldns_rr *r, *ns, *a; - ldns_rdf *dname_a, *ns_owner; - size_t i,j; - - zone_cuts = NULL; - addr = NULL; - glue = NULL; - - /* we cannot determine glue in a 'zone' without a SOA */ - if (!ldns_zone_soa(z)) { - return NULL; - } - - zone_cuts = ldns_rr_list_new(); - if (!zone_cuts) goto memory_error; - addr = ldns_rr_list_new(); - if (!addr) goto memory_error; - glue = ldns_rr_list_new(); - if (!glue) goto memory_error; - - for(i = 0; i < ldns_zone_rr_count(z); i++) { - r = ldns_rr_list_rr(ldns_zone_rrs(z), i); - if (ldns_rr_get_type(r) == LDNS_RR_TYPE_A || - ldns_rr_get_type(r) == LDNS_RR_TYPE_AAAA) { - /* possibly glue */ - if (!ldns_rr_list_push_rr(addr, r)) goto memory_error; - continue; - } - if (ldns_rr_get_type(r) == LDNS_RR_TYPE_NS) { - /* multiple zones will end up here - - * for now; not a problem - */ - /* don't add NS records for the current zone itself */ - if (ldns_rdf_compare(ldns_rr_owner(r), - ldns_rr_owner(ldns_zone_soa(z))) != 0) { - if (!ldns_rr_list_push_rr(zone_cuts, r)) goto memory_error; - } - continue; - } - } - - /* will sorting make it quicker ?? */ - for(i = 0; i < ldns_rr_list_rr_count(zone_cuts); i++) { - ns = ldns_rr_list_rr(zone_cuts, i); - ns_owner = ldns_rr_owner(ns); - - for(j = 0; j < ldns_rr_list_rr_count(addr); j++) { - a = ldns_rr_list_rr(addr, j); - dname_a = ldns_rr_owner(a); - - if (ldns_dname_is_subdomain(dname_a, ns_owner) || - ldns_dname_compare(dname_a, ns_owner) == 0) { - /* GLUE! */ - if (!ldns_rr_list_push_rr(glue, a)) goto memory_error; - } - } - } - - ldns_rr_list_free(addr); - ldns_rr_list_free(zone_cuts); - - if (ldns_rr_list_rr_count(glue) == 0) { - ldns_rr_list_free(glue); - return NULL; - } else { - return glue; - } - -memory_error: - if (zone_cuts) { - LDNS_FREE(zone_cuts); - } - if (addr) { - ldns_rr_list_free(addr); - } - if (glue) { - ldns_rr_list_free(glue); - } - return NULL; -} - -ldns_zone * -ldns_zone_new(void) -{ - ldns_zone *z; - - z = LDNS_MALLOC(ldns_zone); - if (!z) { - return NULL; - } - - z->_rrs = ldns_rr_list_new(); - if (!z->_rrs) { - LDNS_FREE(z); - return NULL; - } - ldns_zone_set_soa(z, NULL); - return z; -} - -/* we regocnize: - * $TTL, $ORIGIN - */ -ldns_status -ldns_zone_new_frm_fp(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, ldns_rr_class c) -{ - return ldns_zone_new_frm_fp_l(z, fp, origin, ttl, c, NULL); -} - -/* XXX: class is never used */ -ldns_status -ldns_zone_new_frm_fp_l(ldns_zone **z, FILE *fp, const ldns_rdf *origin, uint32_t ttl, - ldns_rr_class ATTR_UNUSED(c), int *line_nr) -{ - ldns_zone *newzone; - ldns_rr *rr; - uint32_t my_ttl; - ldns_rdf *my_origin; - ldns_rdf *my_prev; - bool soa_seen = false; /* 2 soa are an error */ - ldns_status s; - ldns_status ret; - - /* most cases of error are memory problems */ - ret = LDNS_STATUS_MEM_ERR; - - newzone = NULL; - my_origin = NULL; - my_prev = NULL; - - my_ttl = ttl; - - if (origin) { - my_origin = ldns_rdf_clone(origin); - if (!my_origin) goto error; - /* also set the prev */ - my_prev = ldns_rdf_clone(origin); - if (!my_prev) goto error; - } - - newzone = ldns_zone_new(); - if (!newzone) goto error; - - while(!feof(fp)) { - s = ldns_rr_new_frm_fp_l(&rr, fp, &my_ttl, &my_origin, &my_prev, line_nr); - switch (s) { - case LDNS_STATUS_OK: - if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) { - if (soa_seen) { - /* second SOA - * just skip, maybe we want to say - * something??? */ - ldns_rr_free(rr); - continue; - } - soa_seen = true; - ldns_zone_set_soa(newzone, rr); - /* set origin to soa if not specified */ - if (!my_origin) { - my_origin = ldns_rdf_clone(ldns_rr_owner(rr)); - } - continue; - } - - /* a normal RR - as sofar the DNS is normal */ - if (!ldns_zone_push_rr(newzone, rr)) goto error; - - case LDNS_STATUS_SYNTAX_EMPTY: - /* empty line was seen */ - case LDNS_STATUS_SYNTAX_TTL: - /* the function set the ttl */ - break; - case LDNS_STATUS_SYNTAX_ORIGIN: - /* the function set the origin */ - break; - case LDNS_STATUS_SYNTAX_INCLUDE: - ret = LDNS_STATUS_SYNTAX_INCLUDE_ERR_NOTIMPL; - break; - default: - ret = s; - goto error; - } - } - - if (my_origin) { - ldns_rdf_deep_free(my_origin); - } - if (my_prev) { - ldns_rdf_deep_free(my_prev); - } - if (z) { - *z = newzone; - } else { - ldns_zone_free(newzone); - } - - return LDNS_STATUS_OK; - -error: - if (my_origin) { - ldns_rdf_deep_free(my_origin); - } - if (my_prev) { - ldns_rdf_deep_free(my_prev); - } - if (newzone) { - ldns_zone_free(newzone); - } - return ret; -} - -void -ldns_zone_sort(ldns_zone *zone) -{ - ldns_rr_list *zrr; - assert(zone != NULL); - - zrr = ldns_zone_rrs(zone); - ldns_rr_list_sort(zrr); -} - -void -ldns_zone_free(ldns_zone *zone) -{ - ldns_rr_list_free(zone->_rrs); - LDNS_FREE(zone); -} - -void -ldns_zone_deep_free(ldns_zone *zone) -{ - ldns_rr_free(zone->_soa); - ldns_rr_list_deep_free(zone->_rrs); - LDNS_FREE(zone); -} |