From 30468a8435d211520a941a09740a77aac82c65a0 Mon Sep 17 00:00:00 2001 From: Sara Dickinson Date: Fri, 19 Aug 2016 15:54:51 +0100 Subject: [PATCH] Commit of dnsperf 2.1.1.0 code --- Makefile.in | 55 + README | 21 + RELEASE_NOTES | 183 ++ aclocal.m4 | 2 + acx_pthread.m4 | 242 ++ config.guess | 1447 +++++++++ config.sub | 1555 ++++++++++ configure | 4940 +++++++++++++++++++++++++++++++ configure.in | 73 + contrib/queryparse/INSTALL | 48 + contrib/queryparse/USAGE | 52 + contrib/queryparse/queryparse | 118 + contrib/queryparse/queryparse.1 | 50 + datafile.c | 275 ++ datafile.h | 44 + dns.c | 848 ++++++ dns.h | 66 + dnsperf.1 | 313 ++ dnsperf.c | 1167 ++++++++ doc/caching-dns-performance.pdf | Bin 0 -> 70898 bytes doc/dnsperf.pdf | Bin 0 -> 204284 bytes doc/resperf.pdf | Bin 0 -> 254854 bytes install-sh | 250 ++ log.c | 63 + log.h | 32 + net.c | 187 ++ net.h | 53 + opt.c | 240 ++ opt.h | 40 + os.c | 132 + os.h | 34 + resperf-report | 96 + resperf.1 | 598 ++++ resperf.c | 745 +++++ util.h | 122 + version.h | 5 + 36 files changed, 14096 insertions(+) create mode 100644 Makefile.in create mode 100644 README create mode 100644 RELEASE_NOTES create mode 100644 aclocal.m4 create mode 100644 acx_pthread.m4 create mode 100644 config.guess create mode 100644 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 contrib/queryparse/INSTALL create mode 100644 contrib/queryparse/USAGE create mode 100755 contrib/queryparse/queryparse create mode 100644 contrib/queryparse/queryparse.1 create mode 100644 datafile.c create mode 100644 datafile.h create mode 100644 dns.c create mode 100644 dns.h create mode 100644 dnsperf.1 create mode 100644 dnsperf.c create mode 100644 doc/caching-dns-performance.pdf create mode 100644 doc/dnsperf.pdf create mode 100644 doc/resperf.pdf create mode 100755 install-sh create mode 100644 log.c create mode 100644 log.h create mode 100644 net.c create mode 100644 net.h create mode 100644 opt.c create mode 100644 opt.h create mode 100644 os.c create mode 100644 os.h create mode 100755 resperf-report create mode 100644 resperf.1 create mode 100644 resperf.c create mode 100644 util.h create mode 100644 version.h diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..edcd668 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,55 @@ +# Copyright 2000, 2001, 2003, 2006-2012 Nominum, Inc. All Rights Reserved. + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +mandir = @mandir@ +datarootdir = @datarootdir@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +RANLIB = @RANLIB@ + +CC = @PTHREAD_CC@ +CFLAGS = @CFLAGS@ @DNSCFLAGS@ @DEFS@ @PTHREAD_CFLAGS@ +LIBS = libperf.a @LIBS@ @DNSLIBS@ @PTHREAD_LIBS@ -lm +LIBOBJS = @LIBOBJS@ +LDFLAGS = @LDFLAGS@ @PTHREAD_CFLAGS@ + +PERFOBJS = datafile.o dns.o log.o net.o opt.o os.o + +all: dnsperf resperf + +libperf.a: ${PERFOBJS} + ${AR} ${ARFLAGS} $@ ${PERFOBJS} + ${RANLIB} $@ + +dnsperf: dnsperf.o libperf.a $(LIBOBJS) + $(CC) $(LDFLAGS) dnsperf.o $(LIBOBJS) $(LIBS) -o dnsperf + +resperf: resperf.o libperf.a $(LIBOBJS) + $(CC) $(LDFLAGS) resperf.o $(LIBOBJS) $(LIBS) -o resperf + +.c.o: + $(CC) $(CFLAGS) -c $< + +installdirs: + mkdir -p ${DESTDIR}${bindir} + mkdir -p ${DESTDIR}${mandir}/man1 + +install: all installdirs + ${INSTALL_PROGRAM} dnsperf ${DESTDIR}${bindir} + ${INSTALL_PROGRAM} resperf ${DESTDIR}${bindir} + ${INSTALL_PROGRAM} resperf-report ${DESTDIR}${bindir} + ${INSTALL_DATA} dnsperf.1 ${DESTDIR}${mandir}/man1 + ${INSTALL_DATA} resperf.1 ${DESTDIR}${mandir}/man1 + +clean: + rm -f *.o dnsperf resperf libperf.a + +distclean: clean + rm -f config.log + rm -f config.cache + rm -f config.status + rm -f Makefile diff --git a/README b/README new file mode 100644 index 0000000..638e233 --- /dev/null +++ b/README @@ -0,0 +1,21 @@ +This is dnsperf, a collection of DNS server performance testing tools. +For more information, see the dnsperf(1) and resperf(1) man pages. + +To configure, compile, and install these programs, follow these steps. + +1. Make sure that BIND 9 (9.4.0 or greater) is installed, including libraries + and header files, and that the isc-config.sh program distributed with BIND + is in your path. + + Note: many versions of bind do not correctly install the + header file, so if the compilation fails, obtain this file from the BIND + source distribution, and install it in the appropriate place. + +2. Run "sh configure" to configure the software. Most standard configure + options are supported. + +3. Run "make" to build dnsperf and resperf + +4. Run "make install" to install dnsperf and resperf. + +Additional software is available in the contrib/ directory. diff --git a/RELEASE_NOTES b/RELEASE_NOTES new file mode 100644 index 0000000..e8c6765 --- /dev/null +++ b/RELEASE_NOTES @@ -0,0 +1,183 @@ +Nominum dnsperf 2.1.0.0 +Release Notes +************************ + +December 15, 2015 + +In addition to various bug fixes, the following new capabilities +were added in this release: + + - The -C option was added to resperf. This option enables the local + server to act as multiple clients. By default, the local server + acts as a single client. + + - the -T option was added to dnsperf. This option separates the + number of clients from the number of threads and allows more + clients to be simulated effectively. Note that using this option + impacts CPU and memory, so we recommend limiting the number of + threads. + + +----------------------- +Nominum dnsperf 2.0.0.0 +March 1, 2012 + +In the dnsperf command, the following changes occurred: + + - The socket buffer size is no longer set to 32 kilobytes by default. + + - A new -c clients option was added to enable the server to act as + multiple clients. Each client uses the same source IP address with a + unique source port. Use the "clients" argument to specify the number of + clients represented by the server. We recommend limiting the number of + clients represented by the server because the dnsperf process uses two + threads for each client (one thread for sent packets and one for + received packets), which impacts CPU and memory. + + - Example query files are no longer included with the dnsperf program. + Nominum provides a sample query file that is available for download at: + ftp://ftp.nominum.com/pub/nominum/dnsperf/data/ + + - Latency reporting improved. When the -v (verbose mode) option is + configured with the dnsperf command, the command output now includes + latency measurements and the DNS RCODE of each response. This enables + users to create their own latency graphs. + + - Performance was enhanced on modern operating systems so that faster + name servers can be tested. + + - The dnsperf command output is enhanced to display more information in a + compact format. + +The following options were removed from the dnsperf command: + + - The -A option for displaying command line arguments passed to the + dnsperf tool in the final statistics output. Now, the dnsperf command + output always displays command line arguments. + + - The -T option for printing a histogram showing response latency after + completing a test run. Now, the -v option enables users to include + latency measurements in the dnsperf command output. + + - The -H option for configuring the number of buckets for which response + latency is displayed. Now, the -v option enables users to include + latency measurements in the dnsperf command output. + + - The -1 option for configuring the dnsperf tool to run through the input + file exactly one time. (Now, you use the -n 1 option to configure the + dnsperf tool to run through the input file one time.) + + - The -c option for including the number of responses received (for + each DNS RCODE) in the final statistics output. Now, DNS RCODE responses + are always reported. + +In the resperf command, the following changes occurred: + + - The socket buffer size is no longer set to 32 kilobytes by default. + + - The -A option, which displayed command line arguments passed to the + resperf tool in the final statistics output, was removed. Now, the + resperf command output always displays command line arguments. + + +----------------------- +Nominum dnsperf 1.0.2.0 +December 22, 2011 + +This release adds support for RHEL6-64 and for Solaris 10 x86-64. + +Some new configuration options have been added. You can now specify: + + - the local port from which to send requests + - the local address from which to send requests + - the maximum number of runs through the input file, up + to the timeout limit. + - when using TSIG, algorithms other than hmac-md5 can be used. + +One default has been changed: + + - The maximum number of outstanding requests now defaults + to 100. + +A new example query file for IPv6, queryfile-example-ipv6, is now +included with the distribution. + + +----------------------- +Nominum dnsperf 1.0.1.0 +January 10, 2008 + +This release makes binary builds of dnsperf available in addition to +the source code version previously released. + +This release of dnsperf includes a sample query file containing +100,000 queries to help with performance testing. This query file is +useful for checking latencies or a continuous dnsperf run. In the +binary distribution, this file is found at: + + /usr/local/nom/examples/dnsperf/queryfile-example-100thousand + +In the source distribution, it is at: + + ./examples/queryfile-example-100thousand + +where "." is the directory made by extracting the source tarball. + +Nominum recommends using a query file with at least 3 million queries +for a full resperf run as described in the man page; we make such a +file available for download at: + +ftp://ftp.nominum.com/pub/nominum/dnsperf/data/queryfile-example-3million.gz + +The following fix is included in the source distribution: + + - 20996: makefile.in does not allow overriding mandir + + The --mandir argument to configure, which allows the user to + specify the location man pages are installed, was incorrectly + ignored. + +"queryparse" is a contributed program available in the source +distribution of dnsperf. It can be found at contrib/queryparse/. +The following changes were made to that program: + + - 19717: contrib/queryparse includes outgoing queries + + The queryparse script had no way of distinguishing between incoming + queries and outgoing queries when applied to a traffic trace from a + caching server. This was addressed by adding a new flag (-r) that, + when included in the command line, will keep queries with + RD=0. Otherwise, it will default to discarding them. + + - The ability to parse responses instead of queries was added. + + - A check was added to avoid short packets. + + - Logic was added to detect link type and correctly set the initial + offset to handle both Ethernet and Cisco HDLC frames. + + - Queryparse now uses pcapy instead of the btk python libcap module. + +Note that announcements of new releases of dnsperf are sent to the +mailing list: dnsperf-announce@nominum.com. To be added to the +mailing list, send a message to dnsperf-announce-request@nominum.com +with "subscribe" as the subject. + +Known Issues: + + - None. + +----------------------- +Nominum dnsperf 1.0.0.1 +December 21, 2006 + +This release addresses the following issue in the dnsperf program: + + - 18838/18782: dnsperf slow down issue + + Because of an error in how timeout checking was being done, queries + were rarely timing out, so the number of valid queries in flight kept + dropping. This error has been corrected. + + + diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..14b8f4e --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,2 @@ +sinclude(./acx_pthread.m4)dnl + diff --git a/acx_pthread.m4 b/acx_pthread.m4 new file mode 100644 index 0000000..e4e91d3 --- /dev/null +++ b/acx_pthread.m4 @@ -0,0 +1,242 @@ +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/config.guess b/config.guess new file mode 100644 index 0000000..f8d6eac --- /dev/null +++ b/config.guess @@ -0,0 +1,1447 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2009-01-17' + +# 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 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# 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. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -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 ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 + +trap 'exit 1' 1 2 15 + +# 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. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; 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) >/dev/null 2>&1 ; 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 + +# 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=`(/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 ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + 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 + # 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/[-_].*/\./'` + ;; + 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}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + 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'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + 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 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + 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 0 ;; + 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 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + 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 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # 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 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* 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 \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + 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 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + 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 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + 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 0 ;; + *:AIX:*:[45]) + 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/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 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 + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + 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 + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + 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 && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + 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 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit 0 ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #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-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #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-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + 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 ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + 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-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + 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 0 ;; + 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 0 ;; + 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 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V: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 0 ;; + i*86:*:5:[78]*) + 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 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /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 0 ;; + 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 i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + 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 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 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 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *: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 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + 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 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +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 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100644 index 0000000..edb6b66 --- /dev/null +++ b/config.sub @@ -0,0 +1,1555 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-08-29' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# 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 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# 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. + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# 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. + +# 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 + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -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 ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 0;; + + * ) + 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 + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -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) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +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 \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # 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 + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + 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 + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + 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 + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + 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=-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 + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + 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 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + 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 + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + 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 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + 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 + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + 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 + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + 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 + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + 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) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + 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 | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + 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 + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + 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 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + 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 + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + 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 + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + 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 + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + 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. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First 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* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -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 + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + 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 + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + 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 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + 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 + ;; + *-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 + ;; + *-next) + os=-nextstep3 + ;; + *-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 + ;; + *) + 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 + ;; + -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 + ;; + -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 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..8cf3dba --- /dev/null +++ b/configure @@ -0,0 +1,4940 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, 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= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="dnsperf.c" +ac_subst_vars='LTLIBOBJS +LIBOBJS +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +acx_pthread_config +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +DNSCFLAGS +DNSLIBS +ac_cv_isc_config +RANLIB +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +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_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS' + + +# 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}' +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=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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + 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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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 this package 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/PACKAGE] + --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 + + cat <<\_ACEOF + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_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 +configure +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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 $as_me, which was +generated by GNU Autoconf 2.63. 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) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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 + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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:$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + 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 + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + 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'; { (exit 1); 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 + +# 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 + + +# 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 + ac_site_file1=$CONFIG_SITE +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 -r "$ac_site_file"; then + { $as_echo "$as_me:$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" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$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:$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:$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:$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:$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:$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:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$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_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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 +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$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:$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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$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 test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + 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:$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:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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" + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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_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_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { (exit 1); exit 1; }; } +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. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$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:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$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:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$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:$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 + + + +{ $as_echo "$as_me:$LINENO: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +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:$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 + + + + + + + +{ $as_echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_socket+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_socket_socket=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_socket=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + + +{ $as_echo "$as_me:$LINENO: checking for inet_ntoa in -lnsl" >&5 +$as_echo_n "checking for inet_ntoa in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_inet_ntoa+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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_ntoa (); +int +main () +{ +return inet_ntoa (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_nsl_inet_ntoa=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_nsl_inet_ntoa=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_inet_ntoa" >&5 +$as_echo "$ac_cv_lib_nsl_inet_ntoa" >&6; } +if test "x$ac_cv_lib_nsl_inet_ntoa" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + + +# Extract the first word of "isc-config.sh", so it can be a program name with args. +set dummy isc-config.sh; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_cv_isc_config+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $ac_cv_isc_config in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_cv_isc_config="$ac_cv_isc_config" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_cv_isc_config="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_path_ac_cv_isc_config" && ac_cv_path_ac_cv_isc_config=""no"" + ;; +esac +fi +ac_cv_isc_config=$ac_cv_path_ac_cv_isc_config +if test -n "$ac_cv_isc_config"; then + { $as_echo "$as_me:$LINENO: result: $ac_cv_isc_config" >&5 +$as_echo "$ac_cv_isc_config" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "$ac_cv_isc_config" = "no"; then + { { $as_echo "$as_me:$LINENO: error: BIND 9 libraries must be installed" >&5 +$as_echo "$as_me: error: BIND 9 libraries must be installed" >&2;} + { (exit 1); exit 1; }; } +fi +DNSLIBS="`$ac_cv_isc_config --libs dns bind9`" + +DNSCFLAGS="`$ac_cv_isc_config --cflags dns bind9`" + + +{ $as_echo "$as_me:$LINENO: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if test "${ac_cv_type_socklen_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include +int +main () +{ +socklen_t len = 42; return len; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_socklen_t=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_socklen_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_socklen_t" >&5 +$as_echo "$ac_cv_type_socklen_t" >&6; } + if test $ac_cv_type_socklen_t != yes; then + cat >>confdefs.h <<\_ACEOF +#define socklen_t int +_ACEOF + + fi + +{ $as_echo "$as_me:$LINENO: checking for sa_len" >&5 +$as_echo_n "checking for sa_len... " >&6; } +if test "${ac_cv_sa_len+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include +int +main () +{ +struct sockaddr sa; sa.sa_len = 0; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_sa_len=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_sa_len=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sa_len" >&5 +$as_echo "$ac_cv_sa_len" >&6; } + if test $ac_cv_sa_len = yes; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_SA_LEN 1 +_ACEOF + + fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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 + + + + + +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 + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + acx_pthread_ok=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_acx_pthread_config+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$acx_pthread_config"; then + ac_cv_prog_acx_pthread_config="$acx_pthread_config" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_acx_pthread_config="yes" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" +fi +fi +acx_pthread_config=$ac_cv_prog_acx_pthread_config +if test -n "$acx_pthread_config"; then + { $as_echo "$as_me:$LINENO: result: $acx_pthread_config" >&5 +$as_echo "$acx_pthread_config" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + acx_pthread_ok=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int attr=$attr; return attr; + ; + return 0; +} +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + attr_name=$attr; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:$LINENO: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { $as_echo "$as_me:$LINENO: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +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:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD 1 +_ACEOF + + : +else + acx_pthread_ok=no + +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_config_files="$ac_config_files Makefile" + +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:$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= ;; #( + *) $as_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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$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}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$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:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_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 + + + + +# PATH needs CR +# 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_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 +if (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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +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. +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); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +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'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. 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 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# 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 + +# 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 $as_me, which was +generated by GNU Autoconf 2.63. 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 + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 + +Configuration files: +$config_files + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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' +INSTALL='$INSTALL' +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=$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 ;; + --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"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 +_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 + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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:$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 >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + 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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_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:$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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + + + + esac + +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# 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 || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..4a6bf6a --- /dev/null +++ b/configure.in @@ -0,0 +1,73 @@ +# +# Copyright (C) 2000, 2001 Nominum, Inc. +# +# 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. +# + +AC_INIT(dnsperf.c) + +AC_PREREQ(2.13) + +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_RANLIB + +AC_C_INLINE + +AC_DEFUN(AC_TYPE_SOCKLEN_T, +[AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, +[ + AC_TRY_COMPILE( + [#include + #include ], + [socklen_t len = 42; return len;], + ac_cv_type_socklen_t=yes, + ac_cv_type_socklen_t=no) +]) + if test $ac_cv_type_socklen_t != yes; then + AC_DEFINE(socklen_t, int) + fi +]) + +AC_DEFUN(AC_SA_LEN, +[AC_CACHE_CHECK([for sa_len], ac_cv_sa_len, +[ + AC_TRY_COMPILE( + [#include + #include ], + [struct sockaddr sa; sa.sa_len = 0;], + ac_cv_sa_len=yes, + ac_cv_sa_len=no) +]) + if test $ac_cv_sa_len = yes; then + AC_DEFINE(HAVE_SA_LEN) + fi +]) + +AC_CHECK_LIB(socket, socket) +AC_CHECK_LIB(nsl, inet_ntoa) + +AC_PATH_PROG(ac_cv_isc_config, [isc-config.sh], "no") +if test "$ac_cv_isc_config" = "no"; then + AC_MSG_ERROR(BIND 9 libraries must be installed) +fi +AC_SUBST(DNSLIBS, "`$ac_cv_isc_config --libs dns bind9`") +AC_SUBST(DNSCFLAGS, "`$ac_cv_isc_config --cflags dns bind9`") + +AC_TYPE_SOCKLEN_T +AC_SA_LEN + +ACX_PTHREAD + +AC_OUTPUT(Makefile) diff --git a/contrib/queryparse/INSTALL b/contrib/queryparse/INSTALL new file mode 100644 index 0000000..c22d5b3 --- /dev/null +++ b/contrib/queryparse/INSTALL @@ -0,0 +1,48 @@ + +Installation +------------ + +Queryparse requires the dnspython and pcapy python modules. Pcapy depends +upon the pcap library. + +Libpcap may be obtained from http://www.tcpdump.org/ +Dnspython may be obtained from http://www.dnspython.org/ +Pcapy may be obtained from http://oss.coresecurity.com/projects/pcapy.html + +Ensure queryparse is somewhere in your path. + + +Usage +----- +queryparse -i -o + + -i : the tcpdump file that will be parsed to locate DNS + queries. + + -o : the file to which you wish to save the queries parsed + from . When complete, this file is suitable + for use as input to dnsperf. + + -r Keep packets whose RD flag is not set. + Use this flag when parsing captures from authoritative + servers. When parsing captures from caching servers, + do not use this flag unless you also want to parse the + queries the server itself is sending. + + -R Parse response packets (QR=1), instead of query packets + (QR=0). + + +Queryparse takes as input a packet capture file as created by tcpdump (or any +other program that can save data in pcap format). It parses every UDP packet, +looking for DNS queries. When it finds a potential query, it makes every +effort to parse it as a valid query. + +Once queryparse has finished, it will print a set of statistics regarding +the capture file to STDOUT. + + +NOTE: Currently, queryparse will correctly handle packets contained in either +Ethernet frames or Cisco HDLC frames. It is not guaranteed to work with other +framing formats. + diff --git a/contrib/queryparse/USAGE b/contrib/queryparse/USAGE new file mode 100644 index 0000000..d5672e9 --- /dev/null +++ b/contrib/queryparse/USAGE @@ -0,0 +1,52 @@ + + +To use queryparse, you need one or more files containing pcap-formatted packet +captures, such as those generated by tcpdump via the -w switch. + +Once you have such a file, call queryparse as follows: + +queryparse -i tcpdump.raw -o outputfile + +where "tcpdump.raw" is the name of the pcap-formatted packet capture file, and +"outputfile" is the name you wish to call the saved output of queryparse. + +When queryparse finishes, it will print to STDOUT a count of each type of query +encountered during its run. For example: + +Statistics: + A: 1175140 + SOA: 23639 + NAPTR: 113 + NS: 1329 + CNAME: 1667 + NONE: 38 + PTR: 186053 + AAAA: 50858 + ANY: 2117 + SRV: 49470 + KEY: 218 + A6: 245 + TXT: 24243 + MX: 517510 +------------------------- + TOTAL: 2032640 + + + +The resulting output is in a format suitable as input to resperf or dnsperf. +For example: + +example.biz. A +example.net. MX +foo.example.tv. A +example.enc. MX +example[2].txt. MX +foo.]. MX + + +Note that there are both valid and invalid host names in the output: Neither +queryparse nor resperf or dnsperf discriminate on the basis of a host name's +adherence to RFCs. If the query was put on the wire and can be recognized as a +properly-formed query, it will be saved. If this does not meet your needs, you +may wish to parse the resulting output file to eliminate nonconforming host +names. diff --git a/contrib/queryparse/queryparse b/contrib/queryparse/queryparse new file mode 100755 index 0000000..516d933 --- /dev/null +++ b/contrib/queryparse/queryparse @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +import dns.message +import dns.rrset +import dns.flags +import dns.name +import pcapy +import socket +import sys +import struct +from optparse import OptionParser + + +__author__ = "Nominum, Inc." +__version__ = "1.0.2.0" +__date__ = "2007-05-14" + +IPHeader = '!BBHHHBBHLL' + +IPHDRLEN = 20 +UDPHDRLEN = 8 +LINKTYPE_C_HDLC = 104 +LINKTYPE_ETHERNET = 1 +qtypecount = {} + + +def main(argv): + parser = OptionParser(usage="%prog [options]", + version = "%prog " + __version__ ) + parser.add_option("-i", "--input", dest="fin", + help="name of tcpdump file to parse", metavar="FILE") + parser.add_option("-o", "--output", dest="fout", + help="file in which to save parsed DNS queries", + metavar="FILE") + parser.add_option("-r", "--recursion", dest="recurse", action="store_true", + default=False, + help="Keep queries whose RD flag is 0 (default: discard)") + parser.add_option("-R", "--responses", dest="responses", + action="store_true", default=False, + help="Parse query responses instead of queries") + (opts, args) = parser.parse_args() + + if opts.fin: + pcap = pcapy.open_offline(opts.fin) + else: + pcap = pcapy.open_offline('-') + linktype = pcap.datalink() + if linktype == LINKTYPE_C_HDLC: + IPHDRSTART = 4 + else: + IPHDRSTART = 14 + if opts.fout: + outfile = open(opts.fout, "w") + else: + outfile = sys.stdout + while True: + try: + packet = pcap.next() + except: + break + + + packet = packet[1] + # Toss the stuff before the IP header + packet = packet[IPHDRSTART:] + + # Grab the rest of the packet so we can parse proto + iphdr = packet[0:IPHDRLEN] + if len(iphdr) < IPHDRLEN: + continue + (vhl, tos, tlen, ipid, fragoff, ttl, proto, cksum, srcip, dstip) = \ + struct.unpack(IPHeader, iphdr) + + # Toss the IP header, we're done with it. We need to account + # for any IP header options. + ihl = (vhl & 0xF) * 4 + packet = packet[ihl:] + + if proto == socket.IPPROTO_UDP: # UDP, 8-byte header + packet = packet[UDPHDRLEN:] + else: + continue + + try: + msg = dns.message.from_wire(packet) + except: + continue + if not opts.recurse and not dns.flags.RD: + continue + if opts.responses: + querytest = msg.flags & dns.flags.QR + else: + querytest = not (msg.flags & dns.flags.QR) + if querytest: + for query in msg.question: # handle multiple queries per packet + fqdn = query.name.to_text() + qtype = dns.rdatatype.to_text(query.rdtype) + outfile.write("%s %s\n" % (fqdn, qtype)) + # add qtype to dict if not present, otherwise increment + qtypecount[query.rdtype] = qtypecount.get(query.rdtype, 0) + 1 + + if outfile is not sys.stdout: + outfile.close() + sum = 0 + print "Statistics:" + qtypes = qtypecount.keys() + qtypes.sort() + for qtype in qtypes: + qtype_str = dns.rdatatype.to_text(qtype) + count = qtypecount[qtype] + print " %10s:\t%d" % (qtype_str, count) + sum += count + print "-------------------------" + print " TOTAL:\t%d" % sum + +if __name__ == '__main__': + main(sys.argv[1:]) + diff --git a/contrib/queryparse/queryparse.1 b/contrib/queryparse/queryparse.1 new file mode 100644 index 0000000..8d9ea0d --- /dev/null +++ b/contrib/queryparse/queryparse.1 @@ -0,0 +1,50 @@ +.TH "queryparse" 1 +.SH NAME +queryparse \- extract DNS queries from pcap capture files. +.SH SYNOPSIS +.B queryparse [-i +.I input file +.B ] [-o +.I output file +.B ] [-r +.I recursion only +.B ] [-R +.I parse responses +.B ] +.SH DESCRIPTION +.B queryparse +is a tool designed to extract DNS queries from pcap-formatted packet +capture files and save them in a form suitable for input to Nominum's +dnsperf or resperf benchmarking tools. +.B queryparse +will only examine UDP packets, and currently supports Ethernet and Cisco HDLC frame types. +.SH OPTIONS +.IP "\-i filename" +Attempt to extract DNS queries from +.I filename, +which should be a pcap-formatted packet capture session (e.g., a file created +by tcpdump or ethereal). +.IP "\-o filename" +Write queries to +.I filename +in a format suitable for input to Nominum's dnsperf or resperf benchmarking tools. +.IP "\-r" +Keep queries that do not have the RD (recursion desired) flag set. This is useful when parsing packet captures from authoritative nameservers. When parsing captures from caching nameservers, do not use it unless you also want to parse the outgoing queries from the nameserver. Defaults to discarding queries with RD=0. +.IP "\-R" +Parse responses (QR=1) instead of queries (QR=0). +.SH FILES +None +.SH ENVIRONMENT +None +.SH DIAGNOSTICS +None +.SH BUGS +None +.SH AUTHOR +Nominum, Inc. +.SH "SEE ALSO" +.BR dnsperf (1), +.BR resperf (1), +.BR pcap (3), +.BR tcpdump (8) + diff --git a/datafile.c b/datafile.c new file mode 100644 index 0000000..b6274c0 --- /dev/null +++ b/datafile.c @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2011 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include +#include +#include +#include + +#define ISC_BUFFER_USEINLINE + +#include +#include + +#include "datafile.h" +#include "log.h" +#include "os.h" +#include "util.h" + +#define BUFFER_SIZE (64 * 1024) + +struct perf_datafile { + isc_mem_t *mctx; + pthread_mutex_t lock; + int pipe_fd; + int fd; + isc_boolean_t is_file; + size_t size; + isc_boolean_t cached; + char databuf[BUFFER_SIZE + 1]; + isc_buffer_t data; + unsigned int maxruns; + unsigned int nruns; + isc_boolean_t read_any; +}; + +static inline void +nul_terminate(perf_datafile_t *dfile) +{ + unsigned char *data; + + data = isc_buffer_used(&dfile->data); + *data = '\0'; +} + +perf_datafile_t * +perf_datafile_open(isc_mem_t *mctx, const char *filename) +{ + perf_datafile_t *dfile; + struct stat buf; + + dfile = isc_mem_get(mctx, sizeof(*dfile)); + if (dfile == NULL) + perf_log_fatal("out of memory"); + + dfile->mctx = mctx; + MUTEX_INIT(&dfile->lock); + dfile->pipe_fd = -1; + dfile->is_file = ISC_FALSE; + dfile->size = 0; + dfile->cached = ISC_FALSE; + dfile->maxruns = 1; + dfile->nruns = 0; + dfile->read_any = ISC_FALSE; + isc_buffer_init(&dfile->data, dfile->databuf, BUFFER_SIZE); + if (filename == NULL) { + dfile->fd = STDIN_FILENO; + } else { + dfile->fd = open(filename, O_RDONLY); + if (dfile->fd < 0) + perf_log_fatal("unable to open file: %s", filename); + if (fstat(dfile->fd, &buf) == 0 && S_ISREG(buf.st_mode)) { + dfile->is_file = ISC_TRUE; + dfile->size = buf.st_size; + } + } + nul_terminate(dfile); + + return dfile; +} + +void +perf_datafile_close(perf_datafile_t **dfilep) +{ + perf_datafile_t *dfile; + + ISC_INSIST(dfilep != NULL && *dfilep != NULL); + + dfile = *dfilep; + *dfilep = NULL; + + if (dfile->fd >= 0 && dfile->fd != STDIN_FILENO) + close(dfile->fd); + MUTEX_DESTROY(&dfile->lock); + isc_mem_put(dfile->mctx, dfile, sizeof(*dfile)); +} + +void +perf_datafile_setpipefd(perf_datafile_t *dfile, int pipe_fd) +{ + dfile->pipe_fd = pipe_fd; +} + +void +perf_datafile_setmaxruns(perf_datafile_t *dfile, unsigned int maxruns) +{ + dfile->maxruns = maxruns; +} + +static void +reopen_file(perf_datafile_t *dfile) +{ + if (dfile->cached) { + isc_buffer_first(&dfile->data); + } else { + if (lseek(dfile->fd, 0L, SEEK_SET) < 0) + perf_log_fatal("cannot reread input"); + isc_buffer_clear(&dfile->data); + nul_terminate(dfile); + } +} + +static isc_result_t +read_more(perf_datafile_t *dfile) +{ + unsigned char *data; + size_t size; + ssize_t n; + isc_result_t result; + + if (!dfile->is_file && dfile->pipe_fd >= 0) { + result = perf_os_waituntilreadable(dfile->fd, dfile->pipe_fd, + -1); + if (result != ISC_R_SUCCESS) + return (result); + } + + isc_buffer_compact(&dfile->data); + data = isc_buffer_used(&dfile->data); + size = isc_buffer_availablelength(&dfile->data); + + n = read(dfile->fd, data, size); + if (n < 0) + return (ISC_R_FAILURE); + + isc_buffer_add(&dfile->data, n); + nul_terminate(dfile); + + if (dfile->is_file && + isc_buffer_usedlength(&dfile->data) == dfile->size) + dfile->cached = ISC_TRUE; + + return (ISC_R_SUCCESS); +} + +static isc_result_t +read_one_line(perf_datafile_t *dfile, isc_buffer_t *lines) +{ + const char *cur; + unsigned int length, curlen, nrem; + isc_result_t result; + + while (ISC_TRUE) { + /* Get the current line */ + cur = isc_buffer_current(&dfile->data); + curlen = strcspn(cur, "\n"); + + /* + * If the current line contains the rest of the buffer, + * we need to read more (unless the full file is cached). + */ + nrem = isc_buffer_remaininglength(&dfile->data); + if (curlen == nrem) { + if (! dfile->cached) { + result = read_more(dfile); + if (result != ISC_R_SUCCESS) + return (result); + } + if (isc_buffer_remaininglength(&dfile->data) == 0) { + dfile->nruns++; + return (ISC_R_EOF); + } + if (isc_buffer_remaininglength(&dfile->data) > nrem) + continue; + } + + /* We now have a line. Advance the buffer past it. */ + isc_buffer_forward(&dfile->data, curlen); + if (isc_buffer_remaininglength(&dfile->data) > 0) + isc_buffer_forward(&dfile->data, 1); + + /* If the line is empty or a comment, we need to try again. */ + if (curlen > 0 && cur[0] != ';') + break; + } + + length = isc_buffer_availablelength(lines); + if (curlen > length - 1) + curlen = length - 1; + isc_buffer_putmem(lines, cur, curlen); + isc_buffer_putuint8(lines, 0); + + return (ISC_R_SUCCESS); +} + +isc_result_t +perf_datafile_next(perf_datafile_t *dfile, isc_buffer_t *lines, + isc_boolean_t is_update) +{ + const char *current; + isc_result_t result; + + LOCK(&dfile->lock); + + if (dfile->maxruns > 0 && dfile->maxruns == dfile->nruns) { + result = ISC_R_EOF; + goto done; + } + + result = read_one_line(dfile, lines); + if (result == ISC_R_EOF) { + if (!dfile->read_any) { + result = ISC_R_INVALIDFILE; + goto done; + } + if (dfile->maxruns != dfile->nruns) { + reopen_file(dfile); + result = read_one_line(dfile, lines); + + } + } + if (result != ISC_R_SUCCESS) { + goto done; + } + dfile->read_any = ISC_TRUE; + + if (is_update) { + while (ISC_TRUE) { + current = isc_buffer_used(lines); + result = read_one_line(dfile, lines); + if (result == ISC_R_EOF && + dfile->maxruns != dfile->nruns) { + reopen_file(dfile); + } + if (result != ISC_R_SUCCESS || + strcasecmp(current, "send") == 0) + break; + }; + } + + result = ISC_R_SUCCESS; + done: + UNLOCK(&dfile->lock); + return (result); +} + +unsigned int +perf_datafile_nruns(const perf_datafile_t *dfile) +{ + return dfile->nruns; +} diff --git a/datafile.h b/datafile.h new file mode 100644 index 0000000..9e0edc6 --- /dev/null +++ b/datafile.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2011 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#ifndef PERF_DATAFILE_H +#define PERF_DATAFILE_H 1 + +#include + +typedef struct perf_datafile perf_datafile_t; + +perf_datafile_t * +perf_datafile_open(isc_mem_t *mctx, const char *filename); + +void +perf_datafile_close(perf_datafile_t **dfilep); + +void +perf_datafile_setmaxruns(perf_datafile_t *dfile, unsigned int maxruns); + +void +perf_datafile_setpipefd(perf_datafile_t *dfile, int pipe_fd); + +isc_result_t +perf_datafile_next(perf_datafile_t *dfile, isc_buffer_t *lines, + isc_boolean_t is_update); + +unsigned int +perf_datafile_nruns(const perf_datafile_t *dfile); + +#endif diff --git a/dns.c b/dns.c new file mode 100644 index 0000000..be16490 --- /dev/null +++ b/dns.c @@ -0,0 +1,848 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include +#include +#include +#include + +#define ISC_BUFFER_USEINLINE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "dns.h" +#include "log.h" +#include "opt.h" + +#define WHITESPACE " \t\n" + +#define MAX_RDATA_LENGTH 65535 +#define EDNSLEN 11 + +const char *perf_dns_rcode_strings[] = { + "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", + "NOTIMP", "REFUSED", "YXDOMAIN", "YXRRSET", + "NXRRSET", "NOTAUTH", "NOTZONE", "rcode11", + "rcode12", "rcode13", "rcode14", "rcode15" +}; + +#define TSIG_HMACMD5_NAME "\010hmac-md5\007sig-alg\003reg\003int" +#define TSIG_HMACSHA1_NAME "\011hmac-sha1" +#define TSIG_HMACSHA224_NAME "\013hmac-sha224" +#define TSIG_HMACSHA256_NAME "\013hmac-sha256" +#define TSIG_HMACSHA384_NAME "\013hmac-sha384" +#define TSIG_HMACSHA512_NAME "\013hmac-sha512" + +typedef enum { + TSIG_HMACMD5, + TSIG_HMACSHA1, + TSIG_HMACSHA224, + TSIG_HMACSHA256, + TSIG_HMACSHA384, + TSIG_HMACSHA512 +} hmac_type_t; + +typedef union { + isc_hmacmd5_t hmacmd5; + isc_hmacsha1_t hmacsha1; + isc_hmacsha224_t hmacsha224; + isc_hmacsha256_t hmacsha256; + isc_hmacsha384_t hmacsha384; + isc_hmacsha512_t hmacsha512; +} hmac_ctx_t; + +struct perf_dnstsigkey { + isc_mem_t *mctx; + isc_constregion_t alg; + hmac_type_t hmactype; + unsigned int digestlen; + dns_fixedname_t fname; + dns_name_t *name; + unsigned char secretdata[256]; + isc_buffer_t secret; +}; + +struct perf_dnsctx { + isc_mem_t *mctx; + dns_compress_t compress; + isc_lex_t *lexer; +}; + +perf_dnsctx_t * +perf_dns_createctx(isc_boolean_t updates) +{ + isc_mem_t *mctx; + perf_dnsctx_t *ctx; + isc_result_t result; + + if (!updates) + return NULL; + + mctx = NULL; + result = isc_mem_create(0, 0, &mctx); + if (result != ISC_R_SUCCESS) + perf_log_fatal("creating memory context: %s", + isc_result_totext(result)); + + ctx = isc_mem_get(mctx, sizeof(*ctx)); + if (ctx == NULL) + perf_log_fatal("out of memory"); + + memset(ctx, 0, sizeof(*ctx)); + ctx->mctx = mctx; + + result = dns_compress_init(&ctx->compress, 0, ctx->mctx); + if (result != ISC_R_SUCCESS) { + perf_log_fatal("creating compression context: %s", + isc_result_totext(result)); + } + dns_compress_setmethods(&ctx->compress, DNS_COMPRESS_GLOBAL14); + + result = isc_lex_create(ctx->mctx, 1024, &ctx->lexer); + if (result != ISC_R_SUCCESS) { + perf_log_fatal("creating lexer: %s", + isc_result_totext(result)); + } + + return (ctx); +} + +void +perf_dns_destroyctx(perf_dnsctx_t **ctxp) +{ + perf_dnsctx_t *ctx; + isc_mem_t *mctx; + + INSIST(ctxp != NULL); + ctx = *ctxp; + *ctxp = NULL; + + if (ctx == NULL) + return; + + mctx = ctx->mctx; + isc_lex_destroy(&ctx->lexer); + dns_compress_invalidate(&ctx->compress); + isc_mem_put(mctx, ctx, sizeof(*ctx)); + isc_mem_destroy(&mctx); +} + +static isc_result_t +name_fromstring(dns_name_t *name, dns_name_t *origin, + const char *str, unsigned int len, + isc_buffer_t *target, const char *type) +{ + isc_buffer_t buffer; + isc_result_t result; + + isc_buffer_init(&buffer, str, len); + isc_buffer_add(&buffer, len); + result = dns_name_fromtext(name, &buffer, origin, 0, target); + if (result != ISC_R_SUCCESS) + perf_log_warning("invalid %s name: %.*s", type, (int)len, str); + return result; +} + +#define SET_KEY(key, type) do { \ + (key)->alg.base = TSIG_HMAC ## type ## _NAME; \ + (key)->alg.length = sizeof(TSIG_HMAC ## type ## _NAME); \ + (key)->hmactype = TSIG_HMAC ## type; \ + (key)->digestlen = ISC_ ## type ## _DIGESTLENGTH; \ + } while (0) + +perf_dnstsigkey_t * +perf_dns_parsetsigkey(const char *arg, isc_mem_t *mctx) +{ + perf_dnstsigkey_t *tsigkey; + const char *sep1, *sep2, *alg, *name, *secret; + int alglen, namelen; + isc_result_t result; + + tsigkey = isc_mem_get(mctx, sizeof (*tsigkey)); + if (tsigkey == NULL) + perf_log_fatal("out of memory"); + memset(tsigkey, 0, sizeof (*tsigkey)); + tsigkey->mctx = mctx; + + sep1 = strchr(arg, ':'); + if (sep1 == NULL) { + perf_log_warning("invalid TSIG [alg:]name:secret"); + perf_opt_usage(); + exit(1); + } + + sep2 = strchr(sep1 + 1, ':'); + if (sep2 == NULL) { + /* name:key */ + alg = NULL; + alglen = 0; + name = arg; + namelen = sep1 - arg; + secret = sep1 + 1; + } else { + /* [alg:]name:secret */ + alg = arg; + alglen = sep1 - arg; + name = sep1 + 1; + namelen = sep2 - sep1 - 1; + secret = sep2 + 1; + } + + /* Algorithm */ + + if (alg == NULL || strncasecmp(alg, "hmac-md5:", 9) == 0) { + SET_KEY(tsigkey, MD5); + } else if (strncasecmp(alg, "hmac-sha1:", 10) == 0) { + SET_KEY(tsigkey, SHA1); + } else if (strncasecmp(alg, "hmac-sha224:", 12) == 0) { + SET_KEY(tsigkey, SHA224); + } else if (strncasecmp(alg, "hmac-sha256:", 12) == 0) { + SET_KEY(tsigkey, SHA256); + } else if (strncasecmp(alg, "hmac-sha384:", 12) == 0) { + SET_KEY(tsigkey, SHA384); + } else if (strncasecmp(alg, "hmac-sha512:", 12) == 0) { + SET_KEY(tsigkey, SHA512); + } else { + perf_log_warning("invalid TSIG algorithm %.*s", alglen, alg); + perf_opt_usage(); + exit(1); + } + + /* Name */ + + dns_fixedname_init(&tsigkey->fname); + tsigkey->name = dns_fixedname_name(&tsigkey->fname); + result = name_fromstring(tsigkey->name, dns_rootname, name, namelen, + NULL, "TSIG key"); + if (result != ISC_R_SUCCESS) { + perf_opt_usage(); + exit(1); + } + (void)dns_name_downcase(tsigkey->name, tsigkey->name, NULL); + + /* Secret */ + + isc_buffer_init(&tsigkey->secret, tsigkey->secretdata, + sizeof(tsigkey->secretdata)); + result = isc_base64_decodestring(secret, &tsigkey->secret); + if (result != ISC_R_SUCCESS) { + perf_log_warning("invalid TSIG secret '%s'", secret); + perf_opt_usage(); + exit(1); + } + + return tsigkey; +} + +void +perf_dns_destroytsigkey(perf_dnstsigkey_t **tsigkeyp) +{ + perf_dnstsigkey_t *tsigkey; + + INSIST(tsigkeyp != NULL && *tsigkeyp != NULL); + + tsigkey = *tsigkeyp; + *tsigkeyp = NULL; + + isc_mem_put(tsigkey->mctx, tsigkey, sizeof(*tsigkey)); +} + +/* + * Appends an OPT record to the packet. + */ +static isc_result_t +add_edns(isc_buffer_t *packet, isc_boolean_t dnssec) { + unsigned char *base; + + if (isc_buffer_availablelength(packet) < EDNSLEN) { + perf_log_warning("failed to add OPT to query packet"); + return (ISC_R_NOSPACE); + } + + base = isc_buffer_base(packet); + + isc_buffer_putuint8(packet, 0); /* root name */ + isc_buffer_putuint16(packet, dns_rdatatype_opt);/* type */ + isc_buffer_putuint16(packet, MAX_EDNS_PACKET); /* class */ + isc_buffer_putuint8(packet, 0); /* xrcode */ + isc_buffer_putuint8(packet, 0); /* version */ + if (dnssec) /* flags */ + isc_buffer_putuint16(packet, 0x8000); + else + isc_buffer_putuint16(packet, 0); + isc_buffer_putuint16(packet, 0); /* rdlen */ + + base[11]++; /* increment record count */ + + return (ISC_R_SUCCESS); +} + +static void +hmac_init(perf_dnstsigkey_t *tsigkey, hmac_ctx_t *ctx) +{ + unsigned char *secret; + unsigned int length; + + secret = isc_buffer_base(&tsigkey->secret); + length = isc_buffer_usedlength(&tsigkey->secret); + + switch (tsigkey->hmactype) { + case TSIG_HMACMD5: + isc_hmacmd5_init(&ctx->hmacmd5, secret, length); + break; + case TSIG_HMACSHA1: + isc_hmacsha1_init(&ctx->hmacsha1, secret, length); + break; + case TSIG_HMACSHA224: + isc_hmacsha224_init(&ctx->hmacsha224, secret, length); + break; + case TSIG_HMACSHA256: + isc_hmacsha256_init(&ctx->hmacsha256, secret, length); + break; + case TSIG_HMACSHA384: + isc_hmacsha384_init(&ctx->hmacsha384, secret, length); + break; + case TSIG_HMACSHA512: + isc_hmacsha512_init(&ctx->hmacsha512, secret, length); + break; + } +} + +static void +hmac_update(perf_dnstsigkey_t *tsigkey, hmac_ctx_t *ctx, + unsigned char *data, unsigned int length) +{ + switch (tsigkey->hmactype) { + case TSIG_HMACMD5: + isc_hmacmd5_update(&ctx->hmacmd5, data, length); + break; + case TSIG_HMACSHA1: + isc_hmacsha1_update(&ctx->hmacsha1, data, length); + break; + case TSIG_HMACSHA224: + isc_hmacsha224_update(&ctx->hmacsha224, data, length); + break; + case TSIG_HMACSHA256: + isc_hmacsha256_update(&ctx->hmacsha256, data, length); + break; + case TSIG_HMACSHA384: + isc_hmacsha384_update(&ctx->hmacsha384, data, length); + break; + case TSIG_HMACSHA512: + isc_hmacsha512_update(&ctx->hmacsha512, data, length); + break; + } +} + +static void +hmac_sign(perf_dnstsigkey_t *tsigkey, hmac_ctx_t *ctx, unsigned char *digest, + unsigned int digestlen) +{ + switch (tsigkey->hmactype) { + case TSIG_HMACMD5: + isc_hmacmd5_sign(&ctx->hmacmd5, digest); + break; + case TSIG_HMACSHA1: + isc_hmacsha1_sign(&ctx->hmacsha1, digest, digestlen); + break; + case TSIG_HMACSHA224: + isc_hmacsha224_sign(&ctx->hmacsha224, digest, digestlen); + break; + case TSIG_HMACSHA256: + isc_hmacsha256_sign(&ctx->hmacsha256, digest, digestlen); + break; + case TSIG_HMACSHA384: + isc_hmacsha384_sign(&ctx->hmacsha384, digest, digestlen); + break; + case TSIG_HMACSHA512: + isc_hmacsha512_sign(&ctx->hmacsha512, digest, digestlen); + break; + } +} + +/* + * Appends a TSIG record to the packet. + */ +static isc_result_t +add_tsig(isc_buffer_t *packet, perf_dnstsigkey_t *tsigkey) +{ + unsigned char *base; + hmac_ctx_t hmac; + isc_region_t name_r; + isc_region_t *alg_r; + unsigned int rdlen, totallen; + unsigned char tmpdata[512]; + isc_buffer_t tmp; + isc_uint32_t now; + unsigned char digest[ISC_SHA256_DIGESTLENGTH]; + + hmac_init(tsigkey, &hmac); + now = time(NULL); + dns_name_toregion(tsigkey->name, &name_r); + alg_r = (isc_region_t *) &tsigkey->alg; + + /* Make sure everything will fit */ + rdlen = alg_r->length + 16 + tsigkey->digestlen; + totallen = name_r.length + 10 + rdlen; + if (totallen > isc_buffer_availablelength(packet)) { + perf_log_warning("adding TSIG: out of space"); + return (ISC_R_NOSPACE); + } + + base = isc_buffer_base(packet); + + /* Digest the message */ + hmac_update(tsigkey, &hmac, isc_buffer_base(packet), + isc_buffer_usedlength(packet)); + + /* Digest the TSIG record */ + isc_buffer_init(&tmp, tmpdata, sizeof tmpdata); + isc_buffer_copyregion(&tmp, &name_r); /* name */ + isc_buffer_putuint16(&tmp, dns_rdataclass_any); /* class */ + isc_buffer_putuint32(&tmp, 0); /* ttl */ + isc_buffer_copyregion(&tmp, alg_r); /* alg */ + isc_buffer_putuint16(&tmp, 0); /* time high */ + isc_buffer_putuint32(&tmp, now); /* time low */ + isc_buffer_putuint16(&tmp, 300); /* fudge */ + isc_buffer_putuint16(&tmp, 0); /* error */ + isc_buffer_putuint16(&tmp, 0); /* other length */ + hmac_update(tsigkey, &hmac, isc_buffer_base(&tmp), + isc_buffer_usedlength(&tmp)); + hmac_sign(tsigkey, &hmac, digest, tsigkey->digestlen); + + /* Add the TSIG record. */ + isc_buffer_copyregion(packet, &name_r); /* name */ + isc_buffer_putuint16(packet, dns_rdatatype_tsig); /* type */ + isc_buffer_putuint16(packet, dns_rdataclass_any); /* class */ + isc_buffer_putuint32(packet, 0); /* ttl */ + isc_buffer_putuint16(packet, rdlen); /* rdlen */ + isc_buffer_copyregion(packet, alg_r); /* alg */ + isc_buffer_putuint16(packet, 0); /* time high */ + isc_buffer_putuint32(packet, now); /* time low */ + isc_buffer_putuint16(packet, 300); /* fudge */ + isc_buffer_putuint16(packet, tsigkey->digestlen); /* digest len */ + isc_buffer_putmem(packet, digest, tsigkey->digestlen); /* digest */ + isc_buffer_putmem(packet, base, 2); /* orig ID */ + isc_buffer_putuint16(packet, 0); /* error */ + isc_buffer_putuint16(packet, 0); /* other len */ + + base[11]++; /* increment record count */ + + return (ISC_R_SUCCESS); +} + +static isc_result_t +build_query(const isc_textregion_t *line, isc_buffer_t *msg) +{ + char *domain_str; + int domain_len; + dns_name_t name; + dns_offsets_t offsets; + isc_textregion_t qtype_r; + dns_rdatatype_t qtype; + isc_result_t result; + + domain_str = line->base; + domain_len = strcspn(line->base, WHITESPACE); + + qtype_r.base = line->base + domain_len; + while (isspace(*qtype_r.base & 0xff)) + qtype_r.base++; + qtype_r.length = strcspn(qtype_r.base, WHITESPACE); + + /* Create the question section */ + DNS_NAME_INIT(&name, offsets); + result = name_fromstring(&name, dns_rootname, domain_str, domain_len, + msg, "domain"); + if (result != ISC_R_SUCCESS) + return (result); + + if (qtype_r.length == 0) { + perf_log_warning("invalid query input format: %s", line->base); + return (ISC_R_FAILURE); + } + result = dns_rdatatype_fromtext(&qtype, &qtype_r); + if (result != ISC_R_SUCCESS) { + perf_log_warning("invalid query type: %.*s", + (int) qtype_r.length, qtype_r.base); + return (ISC_R_FAILURE); + } + + isc_buffer_putuint16(msg, qtype); + isc_buffer_putuint16(msg, dns_rdataclass_in); + + return ISC_R_SUCCESS; +} + +static isc_boolean_t +token_equals(const isc_textregion_t *token, const char *str) +{ + return (strlen(str) == token->length && + strncasecmp(str, token->base, token->length) == 0); +} + +/* + * Reads one line containing an individual update for a dynamic update message. + */ +static isc_result_t +read_update_line(perf_dnsctx_t *ctx, const isc_textregion_t *line, char *str, + dns_name_t *zname, int want_ttl, int need_type, + int want_rdata, int need_rdata, dns_name_t *name, + isc_uint32_t *ttlp, dns_rdatatype_t *typep, + dns_rdata_t *rdata, isc_buffer_t *rdatabuf) +{ + char *curr_str; + unsigned int curr_len; + isc_buffer_t buffer; + isc_textregion_t src; + dns_rdatacallbacks_t callbacks; + isc_result_t result; + + while (isspace(*str & 0xff)) + str++; + + /* Read the owner name */ + curr_str = str; + curr_len = strcspn(curr_str, WHITESPACE); + result = name_fromstring(name, zname, curr_str, curr_len, NULL, + "owner"); + if (result != ISC_R_SUCCESS) + return (result); + str += curr_len; + while (isspace(*str & 0xff)) + str++; + + /* Read the ttl */ + if (want_ttl) { + curr_str = str; + curr_len = strcspn(curr_str, WHITESPACE); + src.base = curr_str; + src.length = curr_len; + result = dns_ttl_fromtext(&src, ttlp); + if (result != ISC_R_SUCCESS) { + perf_log_warning("invalid ttl: %.*s", + curr_len, curr_str); + return (result); + } + str += curr_len; + while (isspace(*str & 0xff)) + str++; + } + + /* Read the type */ + curr_str = str; + curr_len = strcspn(curr_str, WHITESPACE); + if (curr_len == 0) { + if (!need_type) + return (ISC_R_SUCCESS); + perf_log_warning("invalid update command: %s", line->base); + return (ISC_R_SUCCESS); + } + src.base = curr_str; + src.length = curr_len; + result = dns_rdatatype_fromtext(typep, &src); + if (result != ISC_R_SUCCESS) { + perf_log_warning("invalid type: %.*s", curr_len, curr_str); + return (result); + } + str += curr_len; + while (isspace(*str & 0xff)) + str++; + + /* Read the rdata */ + if (!want_rdata) + return (ISC_R_SUCCESS); + + if (*str == 0) { + if (!need_rdata) + return (ISC_R_SUCCESS); + perf_log_warning("invalid update command: %s\n", line->base); + return (ISC_R_FAILURE); + } + + isc_buffer_init(&buffer, str, strlen(str)); + isc_buffer_add(&buffer, strlen(str)); + result = isc_lex_openbuffer(ctx->lexer, &buffer); + if (result != ISC_R_SUCCESS) { + perf_log_warning("setting up lexer: %s", + isc_result_totext(result)); + return (result); + } + dns_rdatacallbacks_init_stdio(&callbacks); + result = dns_rdata_fromtext(rdata, dns_rdataclass_in, *typep, + ctx->lexer, zname, 0, ctx->mctx, rdatabuf, + &callbacks); + (void)isc_lex_close(ctx->lexer); + if (result != ISC_R_SUCCESS) { + perf_log_warning("parsing rdata: %s", str); + return (result); + } + + return (ISC_R_SUCCESS); +} + +/* + * Reads a complete dynamic update message and sends it. + */ +static isc_result_t +build_update(perf_dnsctx_t *ctx, const isc_textregion_t *record, + isc_buffer_t *msg) +{ + isc_textregion_t input; + char *msgbase; + isc_buffer_t rdlenbuf, rdatabuf; + unsigned char rdataarray[MAX_RDATA_LENGTH]; + isc_textregion_t token; + char *str; + isc_boolean_t is_update; + int updates = 0; + int prereqs = 0; + dns_fixedname_t fzname, foname; + dns_name_t *zname, *oname; + isc_uint32_t ttl; + dns_rdatatype_t rdtype; + dns_rdataclass_t rdclass; + dns_rdata_t rdata; + isc_uint16_t rdlen; + isc_result_t result; + + /* Reset compression context */ + dns_compress_rollback(&ctx->compress, 0); + + input = *record; + msgbase = isc_buffer_base(msg); + + /* Initialize */ + + dns_fixedname_init(&foname); + oname = dns_fixedname_name(&foname); + + /* Parse zone name */ + dns_fixedname_init(&fzname); + zname = dns_fixedname_name(&fzname); + result = name_fromstring(zname, dns_rootname, + input.base, strlen(input.base), + NULL, "zone"); + if (result != ISC_R_SUCCESS) + goto done; + + /* Render zone section */ + result = dns_name_towire(zname, &ctx->compress, msg); + if (result != ISC_R_SUCCESS) { + perf_log_warning("error rendering zone name: %s", + isc_result_totext(result)); + goto done; + } + isc_buffer_putuint16(msg, dns_rdatatype_soa); + isc_buffer_putuint16(msg, dns_rdataclass_in); + + while (ISC_TRUE) { + input.base += strlen(input.base) + 1; + if (input.base >= record->base + record->length) { + perf_log_warning("warning: incomplete update"); + goto done; + } + + ttl = 0; + rdtype = dns_rdatatype_any; + isc_buffer_init(&rdatabuf, rdataarray, sizeof(rdataarray)); + dns_rdata_init(&rdata); + rdlen = 0; + rdclass = dns_rdataclass_in; + is_update = ISC_FALSE; + + token.base = input.base; + token.length = strcspn(token.base, WHITESPACE); + str = input.base + token.length; + if (token_equals(&token, "send")) { + break; + } else if (token_equals(&token, "add")) { + result = read_update_line(ctx, &input, str, zname, + ISC_TRUE, + ISC_TRUE, ISC_TRUE, ISC_TRUE, + oname, &ttl, &rdtype, + &rdata, &rdatabuf); + rdclass = dns_rdataclass_in; + is_update = ISC_TRUE; + } else if (token_equals(&token, "delete")) { + result = read_update_line(ctx, &input, str, zname, + ISC_FALSE, + ISC_FALSE, ISC_TRUE, + ISC_FALSE, oname, &ttl, + &rdtype, &rdata, &rdatabuf); + if (isc_buffer_usedlength(&rdatabuf) > 0) + rdclass = dns_rdataclass_none; + else + rdclass = dns_rdataclass_any; + is_update = ISC_TRUE; + } else if (token_equals(&token, "require")) { + result = read_update_line(ctx, &input, str, zname, + ISC_FALSE, + ISC_FALSE, ISC_TRUE, + ISC_FALSE, oname, &ttl, + &rdtype, &rdata, &rdatabuf); + if (isc_buffer_usedlength(&rdatabuf) > 0) + rdclass = dns_rdataclass_in; + else + rdclass = dns_rdataclass_any; + is_update = ISC_FALSE; + } else if (token_equals(&token, "prohibit")) { + result = read_update_line(ctx, &input, str, zname, + ISC_FALSE, + ISC_FALSE, ISC_FALSE, + ISC_FALSE, oname, &ttl, + &rdtype, &rdata, &rdatabuf); + rdclass = dns_rdataclass_none; + is_update = ISC_FALSE; + } else { + perf_log_warning("invalid update command: %s", + input.base); + result = ISC_R_FAILURE; + } + + if (result != ISC_R_SUCCESS) + goto done; + + if (!is_update && updates > 0) { + perf_log_warning("prereqs must precede updates"); + result = ISC_R_FAILURE; + goto done; + } + + /* Render record */ + result = dns_name_towire(oname, &ctx->compress, msg); + if (result != ISC_R_SUCCESS) { + perf_log_warning("rendering record name: %s", + isc_result_totext(result)); + goto done; + } + if (isc_buffer_availablelength(msg) < 10) { + perf_log_warning("out of space in message buffer"); + result = ISC_R_NOSPACE; + goto done; + } + + isc_buffer_putuint16(msg, rdtype); + isc_buffer_putuint16(msg, rdclass); + isc_buffer_putuint32(msg, ttl); + rdlenbuf = *msg; + isc_buffer_putuint16(msg, 0); /* rdlen */ + rdlen = isc_buffer_usedlength(&rdatabuf); + if (rdlen > 0) { + result = dns_rdata_towire(&rdata, &ctx->compress, msg); + if (result != ISC_R_SUCCESS) { + perf_log_warning("rendering rdata: %s", + isc_result_totext(result)); + goto done; + } + rdlen = msg->used - rdlenbuf.used - 2; + isc_buffer_putuint16(&rdlenbuf, rdlen); + } + if (is_update) + updates++; + else + prereqs++; + } + + msgbase[7] = prereqs; /* ANCOUNT = number of prereqs */ + msgbase[9] = updates; /* AUCOUNT = number of updates */ + + result = ISC_R_SUCCESS; + + done: + return result; +} + +isc_result_t +perf_dns_buildrequest(perf_dnsctx_t *ctx, const isc_textregion_t *record, + isc_uint16_t qid, + isc_boolean_t edns, isc_boolean_t dnssec, + perf_dnstsigkey_t *tsigkey, isc_buffer_t *msg) +{ + unsigned int flags; + isc_result_t result; + + if (ctx != NULL) + flags = dns_opcode_update << 11; + else + flags = DNS_MESSAGEFLAG_RD; + + /* Create the DNS packet header */ + isc_buffer_putuint16(msg, qid); + isc_buffer_putuint16(msg, flags); /* flags */ + isc_buffer_putuint16(msg, 1); /* qdcount */ + isc_buffer_putuint16(msg, 0); /* ancount */ + isc_buffer_putuint16(msg, 0); /* aucount */ + isc_buffer_putuint16(msg, 0); /* arcount */ + + if (ctx != NULL) { + result = build_update(ctx, record, msg); + } else { + result = build_query(record, msg); + } + if (result != ISC_R_SUCCESS) + return (result); + + if (edns) { + result = add_edns(msg, dnssec); + if (result != ISC_R_SUCCESS) + return (result); + } + + if (tsigkey != NULL) { + result = add_tsig(msg, tsigkey); + if (result != ISC_R_SUCCESS) + return (result); + } + + return (ISC_R_SUCCESS); +} diff --git a/dns.h b/dns.h new file mode 100644 index 0000000..3ac98a4 --- /dev/null +++ b/dns.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include + +#ifndef PERF_DNS_H +#define PERF_DNS_H 1 + +#define MAX_UDP_PACKET 512 +#define MAX_EDNS_PACKET 4096 + +typedef struct perf_dnstsigkey perf_dnstsigkey_t; +typedef struct perf_dnsctx perf_dnsctx_t; + +extern const char *perf_dns_rcode_strings[]; + +perf_dnstsigkey_t * +perf_dns_parsetsigkey(const char *arg, isc_mem_t *mctx); + +void +perf_dns_destroytsigkey(perf_dnstsigkey_t **tsigkeyp); + +perf_dnsctx_t * +perf_dns_createctx(isc_boolean_t updates); + +void +perf_dns_destroyctx(perf_dnsctx_t **ctxp); + +isc_result_t +perf_dns_buildrequest(perf_dnsctx_t *ctx, const isc_textregion_t *record, + isc_uint16_t qid, + isc_boolean_t edns, isc_boolean_t dnssec, + perf_dnstsigkey_t *tsigkey, isc_buffer_t *msg); + +#endif diff --git a/dnsperf.1 b/dnsperf.1 new file mode 100644 index 0000000..5ae3649 --- /dev/null +++ b/dnsperf.1 @@ -0,0 +1,313 @@ +.\" Copyright (C) Nominum, Inc. +.\" +.\" All rights reserved. +.TH DNSPERF 1 "Dec 9, 2015" Nominum Nominum +.SH NAME +\%dnsperf - test the performance of a DNS server +.SH SYNOPSIS +.hy 0 +.ad l +\fBdnsperf\fR\ [\fB\-a\ \fIlocal_addr\fB\fR] +[\fB\-b\ \fIbufsize\fB\fR] +[\fB\-c\ \fIclients\fB\fR] +[\fB\-d\ \fIdatafile\fB\fR] +[\fB\-D\fR] +[\fB\-e\fR] +[\fB\-f\ \fIfamily\fB\fR] +[\fB\-h\fR] +[\fB\-l\ \fIlimit\fB\fR] +[\fB\-n\ \fIruns_through_file\fB\fR] +[\fB\-p\ \fIport\fB\fR] +[\fB\-q\ \fInum_queries\fB\fR] +[\fB\-Q\ \fImax_qps\fB\fR] +[\fB\-s\ \fIserver_addr\fB\fR] +[\fB\-S\ \fIstats_interval\fB\fR] +[\fB\-t\ \fItimeout\fB\fR] +[\fB\-T\ \fIthreads\fB\fR] +[\fB\-u\fR] +[\fB\-v\fR] +[\fB\-x\ \fIlocal_port\fB\fR] +[\fB\-y\ \fI[alg:]name:secret\fB\fR] +.ad +.hy +.SH DESCRIPTION +\fBdnsperf\fR is a DNS server performance testing tool. It is primarily +intended for measuring the performance of authoritative DNS servers, but it +can also be used for measuring caching server performance in a closed +laboratory environment. For testing caching servers resolving against the +live Internet, the \fBresperf\fR program is preferred. + +It is recommended that \fBdnsperf\fR and the name server under test be run +on separate machines, so that the CPU usage of \fBdnsperf\fR itself does not +slow down the name server. The two machines should be connected with a fast +network, preferably a dedicated Gigabit Ethernet segment. Testing through a +router or firewall is not advisable. +.SS "Configuring the name server" +If using \fBdnsperf\fR to test an authoritative server, the name server +under test should be set up to serve one or more zones similar in size and +number to what the server is expected to serve in production. + +Also, be sure to turn off recursion in the server's configuration (in BIND +8/9, specify "recursion no;" in the options block). In BIND 8, you should +also specify "fetch-glue no;"; otherwise the server may attempt to retrieve +glue information from the Internet during the test, slowing it down by an +unpredictable factor. +.SS "Constructing a query input file" +A \fBdnsperf\fR input file should contain a large and realistic set of +queries, on the order of ten thousand to a million. The input file contains +one line per query, consisting of a domain name and an RR type name +separated by a space. The class of the query is implicitly IN. + +When measuring the performance serving non-terminal zones such as the root +zone or TLDs, note that such servers spend most of their time providing +referral responses, not authoritative answers. Therefore, a realistic input +file might consist mostly of queries for type A for names *below*, not at, +the delegations present in the zone. For example, when testing the +performance of a server configured to be authoritative for the top-level +domain "fi.", which contains delegations for domains like "helsinki.fi" and +"turku.fi", the input file could contain lines like +.RS +.hy 0 + +.nf +www.turku.fi A +www.helsinki.fi A +.fi +.hy +.RE + +where the "www" prefix ensures that the server will respond with a referral. +Ideally, a realistic proportion of queries for nonexistent domains should be +mixed in with those for existing ones, and the lines of the input file +should be in a random order. +.SS "Constructing a dynamic update input file" +To test dynamic update performance, \fBdnsperf\fR is run with the \fB\-u\fR +option, and the input file is constructed of blocks of lines describing +dynamic update messages. The first line in a block contains the zone name: +.RS +.hy 0 + +.nf +example.com +.fi +.hy +.RE + +Subsequent lines contain prerequisites, if there are any. Prerequisites can +specify that a name may or may not exist, an rrset may or may not exist, or +an rrset exists and its rdata matches all specified rdata for that name and +type. The keywords "require" and "prohibit" are followed by the appropriate +information. All relative names are considered to be relative to the zone +name. The following lines show the 5 types of prerequisites. +.RS +.hy 0 + +.nf +require a +require a A +require a A 1.2.3.4 +prohibit x +prohibit x A +.fi +.hy +.RE + +Subsequent lines contain records to be added, records to be deleted, rrsets +to be deleted, or names to be deleted. The keywords "add" or "delete" are +followed by the appropriate information. All relative names are considered +to be relative to the zone name. The following lines show the 4 types of +updates. +.RS +.hy 0 + +.nf +add x 3600 A 10.1.2.3 +delete y A 10.1.2.3 +delete z A +delete w +.fi +.hy +.RE + +Each update message is terminated by a line containing the command: +.RS +.hy 0 + +.nf +send +.fi +.hy +.RE +.SS "Running the tests" +When running \fBdnsperf\fR, a data file (the \fB\-d\fR option) and server +(the \fB\-s\fR option) will normally be specified. The output of dnsperf is +mostly self-explanatory. Pay attention to the number of dropped packets +reported - when running the test over a local Ethernet connection, it should +be zero. If one or more packets has been dropped, there may be a problem +with the network connection. In that case, the results should be considered +suspect and the test repeated. +.SH OPTIONS + +\fB-a \fIlocal_addr\fB\fR +.br +.RS +Specifies the local address from which to send requests. The default is the +wildcard address. +.RE + +\fB-b \fIbufsize\fB\fR +.br +.RS +Sets the size of the socket's send and receive buffers, in kilobytes. If not +specified, the operating system's default is used. +.RE + +\fB-c \fIclients\fB\fR +.br +.RS +Act as multiple clients. Requests are sent from multiple sockets. The +default is to act as 1 client. +.RE + +\fB-d \fIdatafile\fB\fR +.br +.RS +Specifies the input data file. If not specified, \fBdnsperf\fR will read +from standard input. +.RE + +\fB-D\fR +.br +.RS +Sets the DO (DNSSEC OK) bit [RFC3225] in all packets sent. This also enables +EDNS0, which is required for DNSSEC. +.RE + +\fB-e\fR +.br +.RS +Enables EDNS0 [RFC2671], by adding an OPT record to all packets sent. +.RE + +\fB-f \fIfamily\fB\fR +.br +.RS +Specifies the address family used for sending DNS packets. The possible +values are "inet", "inet6", or "any". If "any" (the default value) is +specified, \fBdnsperf\fR will use whichever address family is appropriate +for the server it is sending packets to. +.RE + +\fB-h\fR +.br +.RS +Print a usage statement and exit. +.RE + +\fB-l \fIlimit\fB\fR +.br +.RS +Specifies a time limit for the run, in seconds. This may cause the input to +be read multiple times, or only some of the input to be read. The default +behavior is to read the input once, and have no specific time limit. +.RE + +\fB-n \fIruns_through_file\fB\fR +.br +.RS +Run through the input file at most this many times. If no time limit is set, +the file will be read exactly this number of times; if a time limit is set, +the file may be read fewer times. +.RE + +\fB-p \fIport\fB\fR +.br +.RS +Sets the port on which the DNS packets are sent. If not specified, the +standard DNS port (53) is used. +.RE + +\fB-q \fInum_queries\fB\fR +.br +.RS +Sets the maximum number of outstanding requests. When this value is reached, +\fBdnsperf\fR will not send any more requests until either responses are +received or requests time out. The default value is 100. +.RE + +\fB-Q \fImax_qps\fB\fR +.br +.RS +Limits the number of requests per second. There is no default limit. +.RE + +\fB-s \fIserver_addr\fB\fR +.br +.RS +Specifies the name or address of the server to which requests will be sent. +The default is the loopback address, 127.0.0.1. +.RE + +\fB-S \fIstats_interval\fB\fR +.br +.RS +If this parameter is specified, a count of the number of queries per second +during the interval will be printed out every stats_interval seconds. +.RE + +\fB-t \fItimeout\fB\fR +.br +.RS +Specifies the request timeout value, in seconds. \fBdnsperf\fR will no +longer wait for a response to a particular request after this many seconds +have elapsed. The default is 5 seconds. +.RE + +\fB-T \fIthreads\fB\fR +.br +.RS +Run multiple client threads. By default, \fBdnsperf\fR uses one thread for +sending requests and one thread for receiving responses. If this option is +specified, \fBdnsperf\fR will instead use N pairs of send/receive threads. +.RE + +\fB-u\fR +.br +.RS +Instructs \fBdnsperf\fR to send DNS dynamic update messages, rather than +queries. The format of the input file is different in this case; see the +"Constructing a dynamic update input file" section for more details. +.RE + +\fB-v\fR +.br +.RS +Enables verbose mode. The DNS RCODE of each response will be reported to +standard output when the response is received, as will the latency. If a +query times out, it will be reported with the special string "T" instead of +a normal DNS RCODE. If a query is interrupted, it will be reported with the +special string "I". +.RE + +\fB-x \fIlocal_port\fB\fR +.br +.RS +Specifies the local port from which to send requests. The default is the +wildcard port (0). + +If acting as multiple clients and the wildcard port is used, each client +will use a different random port. If a port is specified, the clients will +use a range of ports starting with the specified one. +.RE + +\fB-y \fI[alg:]name:secret\fB\fR +.br +.RS +Add a TSIG record [RFC2845] to all packets sent, using the specified TSIG +key algorithm, name and secret, where the algorithm defaults to hmac-md5 and +the secret is expressed as a base-64 encoded string. +.RE +.SH AUTHOR +Nominum, Inc. +.SH "SEE ALSO" +\fBresperf\fR(1) diff --git a/dnsperf.c b/dnsperf.c new file mode 100644 index 0000000..d4f2b32 --- /dev/null +++ b/dnsperf.c @@ -0,0 +1,1167 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +/*** + *** DNS Performance Testing Tool + *** + *** Version $Id: dnsperf.c 263303 2015-12-15 01:09:36Z bwelling $ + ***/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define ISC_BUFFER_USEINLINE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "net.h" +#include "datafile.h" +#include "dns.h" +#include "log.h" +#include "opt.h" +#include "os.h" +#include "util.h" +#include "version.h" + +#define DEFAULT_SERVER_NAME "127.0.0.1" +#define DEFAULT_SERVER_PORT 53 +#define DEFAULT_LOCAL_PORT 0 +#define DEFAULT_MAX_OUTSTANDING 100 +#define DEFAULT_TIMEOUT 5 + +#define TIMEOUT_CHECK_TIME 100000 + +#define MAX_INPUT_DATA (64 * 1024) + +#define MAX_SOCKETS 256 + +#define RECV_BATCH_SIZE 16 + +typedef struct { + int argc; + char **argv; + int family; + isc_uint32_t clients; + isc_uint32_t threads; + isc_uint32_t maxruns; + isc_uint64_t timelimit; + isc_sockaddr_t server_addr; + isc_sockaddr_t local_addr; + isc_uint64_t timeout; + isc_uint32_t bufsize; + isc_boolean_t edns; + isc_boolean_t dnssec; + perf_dnstsigkey_t *tsigkey; + isc_uint32_t max_outstanding; + isc_uint32_t max_qps; + isc_uint64_t stats_interval; + isc_boolean_t updates; + isc_boolean_t verbose; +} config_t; + +typedef struct { + isc_uint64_t start_time; + isc_uint64_t end_time; + isc_uint64_t stop_time; + struct timespec stop_time_ns; +} times_t; + +typedef struct { + isc_uint64_t rcodecounts[16]; + + isc_uint64_t num_sent; + isc_uint64_t num_interrupted; + isc_uint64_t num_timedout; + isc_uint64_t num_completed; + + isc_uint64_t total_request_size; + isc_uint64_t total_response_size; + + isc_uint64_t latency_sum; + isc_uint64_t latency_sum_squares; + isc_uint64_t latency_min; + isc_uint64_t latency_max; +} stats_t; + +typedef ISC_LIST(struct query_info) query_list; + +typedef struct query_info { + isc_uint64_t timestamp; + query_list *list; + char *desc; + int sock; + /* + * This link links the query into the list of outstanding + * queries or the list of available query IDs. + */ + ISC_LINK(struct query_info) link; +} query_info; + +#define NQIDS 65536 + +typedef struct { + query_info queries[NQIDS]; + query_list outstanding_queries; + query_list unused_queries; + + pthread_t sender; + pthread_t receiver; + + pthread_mutex_t lock; + pthread_cond_t cond; + + unsigned int nsocks; + int current_sock; + int *socks; + + perf_dnsctx_t *dnsctx; + + isc_boolean_t done_sending; + isc_uint64_t done_send_time; + + const config_t *config; + const times_t *times; + stats_t stats; + + isc_uint32_t max_outstanding; + isc_uint32_t max_qps; + + isc_uint64_t last_recv; +} threadinfo_t; + +static threadinfo_t *threads; + +static pthread_mutex_t start_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t start_cond = PTHREAD_COND_INITIALIZER; +static isc_boolean_t started; + +static isc_boolean_t interrupted = ISC_FALSE; + +static int threadpipe[2]; +static int mainpipe[2]; +static int intrpipe[2]; + +static isc_mem_t *mctx; + +static perf_datafile_t *input; + +static void +handle_sigint(int sig) +{ + (void)sig; + write(intrpipe[1], "", 1); +} + +static void +print_initial_status(const config_t *config) +{ + time_t now; + isc_netaddr_t addr; + char buf[ISC_NETADDR_FORMATSIZE]; + int i; + + printf("[Status] Command line: %s", + isc_file_basename(config->argv[0])); + for (i = 1; i < config->argc; i++) + printf(" %s", config->argv[i]); + printf("\n"); + + isc_netaddr_fromsockaddr(&addr, &config->server_addr); + isc_netaddr_format(&addr, buf, sizeof(buf)); + printf("[Status] Sending %s (to %s)\n", + config->updates ? "updates" : "queries", buf); + + now = time(NULL); + printf("[Status] Started at: %s", ctime(&now)); + + printf("[Status] Stopping after "); + if (config->timelimit) + printf("%u.%06u seconds", + (unsigned int)(config->timelimit / MILLION), + (unsigned int)(config->timelimit % MILLION)); + if (config->timelimit && config->maxruns) + printf(" or "); + if (config->maxruns) + printf("%u run%s through file", config->maxruns, + config->maxruns == 1 ? "" : "s"); + printf("\n"); +} + +static void +print_final_status(const config_t *config) +{ + const char *reason; + + if (interrupted) + reason = "interruption"; + else if (config->maxruns > 0 && + perf_datafile_nruns(input) == config->maxruns) + reason = "end of file"; + else + reason = "time limit"; + + printf("[Status] Testing complete (%s)\n", reason); + printf("\n"); +} + +static double +stddev(isc_uint64_t sum_of_squares, isc_uint64_t sum, isc_uint64_t total) +{ + double squared; + + squared = (double)sum * (double)sum; + return sqrt((sum_of_squares - (squared / total)) / (total - 1)); +} + +static void +print_statistics(const config_t *config, const times_t *times, stats_t *stats) +{ + const char *units; + isc_uint64_t run_time; + isc_boolean_t first_rcode; + isc_uint64_t latency_avg; + unsigned int i; + + units = config->updates ? "Updates" : "Queries"; + + run_time = times->end_time - times->start_time; + + printf("Statistics:\n\n"); + + printf(" %s sent: %" ISC_PRINT_QUADFORMAT "u\n", + units, stats->num_sent); + printf(" %s completed: %" ISC_PRINT_QUADFORMAT "u (%.2lf%%)\n", + units, stats->num_completed, + SAFE_DIV(100.0 * stats->num_completed, stats->num_sent)); + printf(" %s lost: %" ISC_PRINT_QUADFORMAT "u (%.2lf%%)\n", + units, stats->num_timedout, + SAFE_DIV(100.0 * stats->num_timedout, stats->num_sent)); + if (stats->num_interrupted > 0) + printf(" %s interrupted: %" ISC_PRINT_QUADFORMAT "u " + "(%.2lf%%)\n", + units, stats->num_interrupted, + SAFE_DIV(100.0 * stats->num_interrupted, + stats->num_sent)); + printf("\n"); + + printf(" Response codes: "); + first_rcode = ISC_TRUE; + for (i = 0; i < 16; i++) { + if (stats->rcodecounts[i] == 0) + continue; + if (first_rcode) + first_rcode = ISC_FALSE; + else + printf(", "); + printf("%s %" ISC_PRINT_QUADFORMAT "u (%.2lf%%)", + perf_dns_rcode_strings[i], stats->rcodecounts[i], + (stats->rcodecounts[i] * 100.0) / stats->num_completed); + } + printf("\n"); + + printf(" Average packet size: request %u, response %u\n", + (unsigned int)SAFE_DIV(stats->total_request_size, + stats->num_sent), + (unsigned int)SAFE_DIV(stats->total_response_size, + stats->num_completed)); + printf(" Run time (s): %u.%06u\n", + (unsigned int)(run_time / MILLION), + (unsigned int)(run_time % MILLION)); + printf(" %s per second: %.6lf\n", units, + SAFE_DIV(stats->num_completed, (((double)run_time) / MILLION))); + + printf("\n"); + + latency_avg = SAFE_DIV(stats->latency_sum, stats->num_completed); + printf(" Average Latency (s): %u.%06u (min %u.%06u, max %u.%06u)\n", + (unsigned int)(latency_avg / MILLION), + (unsigned int)(latency_avg % MILLION), + (unsigned int)(stats->latency_min / MILLION), + (unsigned int)(stats->latency_min % MILLION), + (unsigned int)(stats->latency_max / MILLION), + (unsigned int)(stats->latency_max % MILLION)); + if (stats->num_completed > 1) { + printf(" Latency StdDev (s): %f\n", + stddev(stats->latency_sum_squares, stats->latency_sum, + stats->num_completed) / MILLION); + } + + printf("\n"); +} + +static void +sum_stats(const config_t *config, stats_t *total) +{ + unsigned int i, j; + + memset(total, 0, sizeof(*total)); + + for (i = 0; i < config->threads; i++) { + stats_t *stats = &threads[i].stats; + + for (j = 0; j < 16; j++) + total->rcodecounts[j] += stats->rcodecounts[j]; + + total->num_sent += stats->num_sent; + total->num_interrupted += stats->num_interrupted; + total->num_timedout += stats->num_timedout; + total->num_completed += stats->num_completed; + + total->total_request_size += stats->total_request_size; + total->total_response_size += stats->total_response_size; + + total->latency_sum += stats->latency_sum; + total->latency_sum_squares += stats->latency_sum_squares; + total->latency_min += stats->latency_min; + total->latency_max += stats->latency_max; + } +} + +static char * +stringify(unsigned int value) +{ + static char buf[20]; + + snprintf(buf, sizeof(buf), "%u", value); + return buf; +} + +static void +setup(int argc, char **argv, config_t *config) +{ + const char *family = NULL; + const char *server_name = DEFAULT_SERVER_NAME; + in_port_t server_port = DEFAULT_SERVER_PORT; + const char *local_name = NULL; + in_port_t local_port = DEFAULT_LOCAL_PORT; + const char *filename = NULL; + const char *tsigkey = NULL; + isc_result_t result; + + result = isc_mem_create(0, 0, &mctx); + if (result != ISC_R_SUCCESS) + perf_log_fatal("creating memory context: %s", + isc_result_totext(result)); + + dns_result_register(); + + memset(config, 0, sizeof(*config)); + config->argc = argc; + config->argv = argv; + + config->family = AF_UNSPEC; + config->clients = 1; + config->threads = 1; + config->timeout = DEFAULT_TIMEOUT * MILLION; + config->max_outstanding = DEFAULT_MAX_OUTSTANDING; + + perf_opt_add('f', perf_opt_string, "family", + "address family of DNS transport, inet or inet6", "any", + &family); + perf_opt_add('s', perf_opt_string, "server_addr", + "the server to query", DEFAULT_SERVER_NAME, &server_name); + perf_opt_add('p', perf_opt_port, "port", + "the port on which to query the server", + stringify(DEFAULT_SERVER_PORT), &server_port); + perf_opt_add('a', perf_opt_string, "local_addr", + "the local address from which to send queries", NULL, + &local_name); + perf_opt_add('x', perf_opt_port, "local_port", + "the local port from which to send queries", + stringify(DEFAULT_LOCAL_PORT), &local_port); + perf_opt_add('d', perf_opt_string, "datafile", + "the input data file", "stdin", &filename); + perf_opt_add('c', perf_opt_uint, "clients", + "the number of clients to act as", NULL, + &config->clients); + perf_opt_add('T', perf_opt_uint, "threads", + "the number of threads to run", NULL, + &config->threads); + perf_opt_add('n', perf_opt_uint, "maxruns", + "run through input at most N times", NULL, + &config->maxruns); + perf_opt_add('l', perf_opt_timeval, "timelimit", + "run for at most this many seconds", NULL, + &config->timelimit); + perf_opt_add('b', perf_opt_uint, "buffer_size", + "socket send/receive buffer size in kilobytes", NULL, + &config->bufsize); + perf_opt_add('t', perf_opt_timeval, "timeout", + "the timeout for query completion in seconds", + stringify(DEFAULT_TIMEOUT), &config->timeout); + perf_opt_add('e', perf_opt_boolean, NULL, + "enable EDNS 0", NULL, &config->edns); + perf_opt_add('D', perf_opt_boolean, NULL, + "set the DNSSEC OK bit (implies EDNS)", NULL, + &config->dnssec); + perf_opt_add('y', perf_opt_string, "[alg:]name:secret", + "the TSIG algorithm, name and secret", NULL, + &tsigkey); + perf_opt_add('q', perf_opt_uint, "num_queries", + "the maximum number of queries outstanding", + stringify(DEFAULT_MAX_OUTSTANDING), + &config->max_outstanding); + perf_opt_add('Q', perf_opt_uint, "max_qps", + "limit the number of queries per second", NULL, + &config->max_qps); + perf_opt_add('S', perf_opt_timeval, "stats_interval", + "print qps statistics every N seconds", + NULL, &config->stats_interval); + perf_opt_add('u', perf_opt_boolean, NULL, + "send dynamic updates instead of queries", + NULL, &config->updates); + perf_opt_add('v', perf_opt_boolean, NULL, + "verbose: report each query to stdout", + NULL, &config->verbose); + + perf_opt_parse(argc, argv); + + if (family != NULL) + config->family = perf_net_parsefamily(family); + perf_net_parseserver(config->family, server_name, server_port, + &config->server_addr); + perf_net_parselocal(isc_sockaddr_pf(&config->server_addr), + local_name, local_port, &config->local_addr); + + input = perf_datafile_open(mctx, filename); + + if (config->maxruns == 0 && config->timelimit == 0) + config->maxruns = 1; + perf_datafile_setmaxruns(input, config->maxruns); + + if (config->dnssec) + config->edns = ISC_TRUE; + + if (tsigkey != NULL) + config->tsigkey = perf_dns_parsetsigkey(tsigkey, mctx); + + /* + * If we run more threads than max-qps, some threads will have + * ->max_qps set to 0, and be unlimited. + */ + if (config->max_qps > 0 && config->threads > config->max_qps) + config->threads = config->max_qps; + + /* + * We also can't run more threads than clients. + */ + if (config->threads > config->clients) + config->threads = config->clients; +} + +static void +cleanup(config_t *config) +{ + unsigned int i; + + perf_datafile_close(&input); + for (i = 0; i < 2; i++) { + close(threadpipe[i]); + close(mainpipe[i]); + close(intrpipe[i]); + } + if (config->tsigkey != NULL) + perf_dns_destroytsigkey(&config->tsigkey); + isc_mem_destroy(&mctx); +} + +typedef enum { + prepend_unused, + append_unused, + prepend_outstanding, +} query_move_op; + +static inline void +query_move(threadinfo_t *tinfo, query_info *q, query_move_op op) +{ + ISC_LIST_UNLINK(*q->list, q, link); + switch (op) { + case prepend_unused: + q->list = &tinfo->unused_queries; + ISC_LIST_PREPEND(tinfo->unused_queries, q, link); + break; + case append_unused: + q->list = &tinfo->unused_queries; + ISC_LIST_APPEND(tinfo->unused_queries, q, link); + break; + case prepend_outstanding: + q->list = &tinfo->outstanding_queries; + ISC_LIST_PREPEND(tinfo->outstanding_queries, q, link); + break; + } +} + +static inline isc_uint64_t +num_outstanding(const stats_t *stats) +{ + return stats->num_sent - stats->num_completed - stats->num_timedout; +} + +static void +wait_for_start(void) +{ + LOCK(&start_lock); + while (!started) + WAIT(&start_cond, &start_lock); + UNLOCK(&start_lock); +} + +static void * +do_send(void *arg) +{ + threadinfo_t *tinfo; + const config_t *config; + const times_t *times; + stats_t *stats; + unsigned int max_packet_size; + isc_buffer_t msg; + isc_uint64_t now, run_time, req_time; + char input_data[MAX_INPUT_DATA]; + isc_buffer_t lines; + isc_region_t used; + query_info *q; + int qid; + unsigned char packet_buffer[MAX_EDNS_PACKET]; + unsigned char *base; + unsigned int length; + int n; + isc_result_t result; + + tinfo = (threadinfo_t *) arg; + config = tinfo->config; + times = tinfo->times; + stats = &tinfo->stats; + max_packet_size = config->edns ? MAX_EDNS_PACKET : MAX_UDP_PACKET; + isc_buffer_init(&msg, packet_buffer, max_packet_size); + isc_buffer_init(&lines, input_data, sizeof(input_data)); + + wait_for_start(); + now = get_time(); + while (!interrupted && now < times->stop_time) { + /* Avoid flooding the network too quickly. */ + if (stats->num_sent < tinfo->max_outstanding && + stats->num_sent % 2 == 1) + { + if (stats->num_completed == 0) + usleep(1000); + else + sleep(0); + now = get_time(); + } + + /* Rate limiting */ + if (tinfo->max_qps > 0) { + run_time = now - times->start_time; + req_time = (MILLION * stats->num_sent) / + tinfo->max_qps; + if (req_time > run_time) { + usleep(req_time - run_time); + now = get_time(); + continue; + } + } + + LOCK(&tinfo->lock); + + /* Limit in-flight queries */ + if (num_outstanding(stats) >= tinfo->max_outstanding) { + TIMEDWAIT(&tinfo->cond, &tinfo->lock, + ×->stop_time_ns, NULL); + UNLOCK(&tinfo->lock); + now = get_time(); + continue; + } + + q = ISC_LIST_HEAD(tinfo->unused_queries); + query_move(tinfo, q, prepend_outstanding); + q->timestamp = ISC_UINT64_MAX; + q->sock = tinfo->socks[tinfo->current_sock++ % tinfo->nsocks]; + + UNLOCK(&tinfo->lock); + + isc_buffer_clear(&lines); + result = perf_datafile_next(input, &lines, config->updates); + if (result != ISC_R_SUCCESS) { + if (result == ISC_R_INVALIDFILE) + perf_log_fatal("input file contains no data"); + break; + } + + qid = q - tinfo->queries; + isc_buffer_usedregion(&lines, &used); + isc_buffer_clear(&msg); + result = perf_dns_buildrequest(tinfo->dnsctx, + (isc_textregion_t *) &used, + qid, config->edns, + config->dnssec, config->tsigkey, + &msg); + if (result != ISC_R_SUCCESS) { + LOCK(&tinfo->lock); + query_move(tinfo, q, prepend_unused); + UNLOCK(&tinfo->lock); + now = get_time(); + continue; + } + + base = isc_buffer_base(&msg); + length = isc_buffer_usedlength(&msg); + + now = get_time(); + if (config->verbose) { + q->desc = strdup(lines.base); + if (q->desc == NULL) + perf_log_fatal("out of memory"); + } + q->timestamp = now; + + stats->num_sent++; + + n = sendto(q->sock, base, length, 0, + &config->server_addr.type.sa, + config->server_addr.length); + if (n < 0 || (unsigned int) n != length) { + perf_log_warning("failed to send packet: %s", + strerror(errno)); + LOCK(&tinfo->lock); + query_move(tinfo, q, prepend_unused); + UNLOCK(&tinfo->lock); + stats->num_sent--; + continue; + } + + stats->total_request_size += length; + } + tinfo->done_send_time = get_time(); + tinfo->done_sending = ISC_TRUE; + write(mainpipe[1], "", 1); + return NULL; +} + +static void +process_timeouts(threadinfo_t *tinfo, isc_uint64_t now) +{ + struct query_info *q; + const config_t *config; + + config = tinfo->config; + + /* Avoid locking unless we need to. */ + q = ISC_LIST_TAIL(tinfo->outstanding_queries); + if (q == NULL || q->timestamp > now || + now - q->timestamp < config->timeout) + return; + + LOCK(&tinfo->lock); + + do { + query_move(tinfo, q, append_unused); + + tinfo->stats.num_timedout++; + + if (q->desc != NULL) { + perf_log_printf("> T %s", q->desc); + } else { + perf_log_printf("[Timeout] %s timed out: msg id %u", + config->updates ? "Update" : "Query", + (unsigned int)(q - tinfo->queries)); + } + q = ISC_LIST_TAIL(tinfo->outstanding_queries); + } while (q != NULL && q->timestamp < now && + now - q->timestamp >= config->timeout); + + UNLOCK(&tinfo->lock); +} + +typedef struct { + int sock; + isc_uint16_t qid; + isc_uint16_t rcode; + unsigned int size; + isc_uint64_t when; + isc_uint64_t sent; + isc_boolean_t unexpected; + isc_boolean_t short_response; + char *desc; +} received_query_t; + +static isc_boolean_t +recv_one(threadinfo_t *tinfo, int which_sock, + unsigned char *packet_buffer, unsigned int packet_size, + received_query_t *recvd, int *saved_errnop) +{ + isc_uint16_t *packet_header; + int s; + isc_uint64_t now; + int n; + + packet_header = (isc_uint16_t *) packet_buffer; + + s = tinfo->socks[which_sock]; + n = recv(s, packet_buffer, packet_size, 0); + now = get_time(); + if (n < 0) { + *saved_errnop = errno; + return ISC_FALSE; + } + recvd->sock = s; + recvd->qid = ntohs(packet_header[0]); + recvd->rcode = ntohs(packet_header[1]) & 0xF; + recvd->size = n; + recvd->when = now; + recvd->sent = 0; + recvd->unexpected = ISC_FALSE; + recvd->short_response = ISC_TF(n < 4); + recvd->desc = NULL; + return ISC_TRUE; +} + +static inline void +bit_set(unsigned char *bits, unsigned int bit) +{ + unsigned int shift, mask; + + shift = 7 - (bit % 8); + mask = 1 << shift; + + bits[bit / 8] |= mask; +} + +static inline isc_boolean_t +bit_check(unsigned char *bits, unsigned int bit) +{ + unsigned int shift; + + shift = 7 - (bit % 8); + + if ((bits[bit / 8] >> shift) & 0x01) + return ISC_TRUE; + return ISC_FALSE; +} + +static void * +do_recv(void *arg) +{ + threadinfo_t *tinfo; + stats_t *stats; + unsigned char packet_buffer[MAX_EDNS_PACKET]; + received_query_t recvd[RECV_BATCH_SIZE]; + unsigned int nrecvd; + int saved_errno; + unsigned char socketbits[MAX_SOCKETS / 8]; + isc_uint64_t now, latency; + query_info *q; + unsigned int current_socket, last_socket; + unsigned int i, j; + + tinfo = (threadinfo_t *) arg; + stats = &tinfo->stats; + + wait_for_start(); + now = get_time(); + last_socket = 0; + while (!interrupted) { + process_timeouts(tinfo, now); + + /* + * If we're done sending and either all responses have been + * received, stop. + */ + if (tinfo->done_sending && num_outstanding(stats) == 0) + break; + + /* + * Try to receive a few packets, so that we can process them + * atomically. + */ + saved_errno = 0; + memset(socketbits, 0, sizeof(socketbits)); + for (i = 0; i < RECV_BATCH_SIZE; i++) { + for (j = 0; j < tinfo->nsocks; j++) { + current_socket = (j + last_socket) % + tinfo->nsocks; + if (bit_check(socketbits, current_socket)) + continue; + if (recv_one(tinfo, current_socket, + packet_buffer, + sizeof(packet_buffer), + &recvd[i], &saved_errno)) + { + last_socket = (current_socket + 1); + break; + } + bit_set(socketbits, current_socket); + if (saved_errno != EAGAIN) + break; + } + if (j == tinfo->nsocks) + break; + } + nrecvd = i; + + /* Do all of the processing that requires the lock */ + LOCK(&tinfo->lock); + for (i = 0; i < nrecvd; i++) { + if (recvd[i].short_response) + continue; + + q = &tinfo->queries[recvd[i].qid]; + if (q->list != &tinfo->outstanding_queries || + q->timestamp == ISC_UINT64_MAX || + q->sock != recvd[i].sock) + { + recvd[i].unexpected = ISC_TRUE; + continue; + } + query_move(tinfo, q, append_unused); + recvd[i].sent = q->timestamp; + recvd[i].desc = q->desc; + q->desc = NULL; + } + SIGNAL(&tinfo->cond); + UNLOCK(&tinfo->lock); + + /* Now do the rest of the processing unlocked */ + for (i = 0; i < nrecvd; i++) { + if (recvd[i].short_response) { + perf_log_warning("received short response"); + continue; + } + if (recvd[i].unexpected) { + perf_log_warning("received a response with an " + "unexpected (maybe timed out) " + "id: %u", recvd[i].qid); + continue; + } + latency = recvd[i].when - recvd[i].sent; + if (recvd[i].desc != NULL) { + perf_log_printf( + "> %s %s %u.%06u", + perf_dns_rcode_strings[recvd[i].rcode], + recvd[i].desc, + (unsigned int)(latency / MILLION), + (unsigned int)(latency % MILLION)); + free(recvd[i].desc); + } + + stats->num_completed++; + stats->total_response_size += recvd[i].size; + stats->rcodecounts[recvd[i].rcode]++; + stats->latency_sum += latency; + stats->latency_sum_squares += (latency * latency); + if (latency < stats->latency_min || + stats->num_completed == 1) + stats->latency_min = latency; + if (latency > stats->latency_max) + stats->latency_max = latency; + } + + if (nrecvd > 0) + tinfo->last_recv = recvd[nrecvd - 1].when; + + /* + * If there was an error, handle it (by either ignoring it, + * blocking, or exiting). + */ + if (nrecvd < RECV_BATCH_SIZE) { + if (saved_errno == EINTR) { + continue; + } else if (saved_errno == EAGAIN) { + perf_os_waituntilanyreadable( + tinfo->socks, + tinfo->nsocks, + threadpipe[0], + TIMEOUT_CHECK_TIME); + now = get_time(); + continue; + } else { + perf_log_fatal("failed to receive packet: %s", + strerror(saved_errno)); + } + } + } + + return NULL; +} + +static void * +do_interval_stats(void *arg) +{ + threadinfo_t *tinfo; + stats_t total; + isc_uint64_t now; + isc_uint64_t last_interval_time; + isc_uint64_t last_completed; + isc_uint64_t interval_time; + isc_uint64_t num_completed; + double qps; + + tinfo = arg; + last_interval_time = tinfo->times->start_time; + last_completed = 0; + + wait_for_start(); + while (perf_os_waituntilreadable(threadpipe[0], threadpipe[0], + tinfo->config->stats_interval) == + ISC_R_TIMEDOUT) + { + now = get_time(); + sum_stats(tinfo->config, &total); + interval_time = now - last_interval_time; + num_completed = total.num_completed - last_completed; + qps = num_completed / (((double)interval_time) / MILLION); + perf_log_printf("%u.%06u: %.6lf", + (unsigned int)(now / MILLION), + (unsigned int)(now % MILLION), qps); + last_interval_time = now; + last_completed = total.num_completed; + } + + return NULL; +} + +static void +cancel_queries(threadinfo_t *tinfo) +{ + struct query_info *q; + + while (ISC_TRUE) { + q = ISC_LIST_TAIL(tinfo->outstanding_queries); + if (q == NULL) + break; + query_move(tinfo, q, append_unused); + + if (q->timestamp == ISC_UINT64_MAX) + continue; + + tinfo->stats.num_interrupted++; + if (q->desc != NULL) { + perf_log_printf("> I %s", q->desc); + free(q->desc); + q->desc = NULL; + } + } +} + +static isc_uint32_t +per_thread(isc_uint32_t total, isc_uint32_t nthreads, unsigned int offset) +{ + isc_uint32_t value; + + value = total / nthreads; + if (value % nthreads > offset) + value++; + return value; +} + +static void +threadinfo_init(threadinfo_t *tinfo, const config_t *config, + const times_t *times) +{ + unsigned int offset, socket_offset, i; + + memset(tinfo, 0, sizeof(*tinfo)); + MUTEX_INIT(&tinfo->lock); + COND_INIT(&tinfo->cond); + + ISC_LIST_INIT(tinfo->outstanding_queries); + ISC_LIST_INIT(tinfo->unused_queries); + for (i = 0; i < NQIDS; i++) { + ISC_LINK_INIT(&tinfo->queries[i], link); + ISC_LIST_APPEND(tinfo->unused_queries, + &tinfo->queries[i], link); + tinfo->queries[i].list = &tinfo->unused_queries; + } + + offset = tinfo - threads; + + tinfo->dnsctx = perf_dns_createctx(config->updates); + + tinfo->config = config; + tinfo->times = times; + + /* + * Compute per-thread limits based on global values. + */ + tinfo->max_outstanding = per_thread(config->max_outstanding, + config->threads, offset); + tinfo->max_qps = per_thread(config->max_qps, config->threads, offset); + tinfo->nsocks = per_thread(config->clients, config->threads, offset); + + /* + * We can't have more than 64k outstanding queries per thread. + */ + if (tinfo->max_outstanding > NQIDS) + tinfo->max_outstanding = NQIDS; + + if (tinfo->nsocks > MAX_SOCKETS) + tinfo->nsocks = MAX_SOCKETS; + + tinfo->socks = isc_mem_get(mctx, tinfo->nsocks * sizeof(int)); + if (tinfo->socks == NULL) + perf_log_fatal("out of memory"); + socket_offset = 0; + for (i = 0; i < offset; i++) + socket_offset += threads[i].nsocks; + for (i = 0; i < tinfo->nsocks; i++) + tinfo->socks[i] = perf_net_opensocket(&config->server_addr, + &config->local_addr, + socket_offset++, + config->bufsize); + tinfo->current_sock = 0; + + THREAD(&tinfo->receiver, do_recv, tinfo); + THREAD(&tinfo->sender, do_send, tinfo); +} + +static void +threadinfo_stop(threadinfo_t *tinfo) +{ + SIGNAL(&tinfo->cond); + JOIN(tinfo->sender, NULL); + JOIN(tinfo->receiver, NULL); +} + +static void +threadinfo_cleanup(threadinfo_t *tinfo, times_t *times) +{ + unsigned int i; + + if (interrupted) + cancel_queries(tinfo); + for (i = 0; i < tinfo->nsocks; i++) + close(tinfo->socks[i]); + isc_mem_put(mctx, tinfo->socks, tinfo->nsocks * sizeof(int)); + perf_dns_destroyctx(&tinfo->dnsctx); + if (tinfo->last_recv > times->end_time) + times->end_time = tinfo->last_recv; +} + +int +main(int argc, char **argv) +{ + config_t config; + times_t times; + stats_t total_stats; + threadinfo_t stats_thread; + unsigned int i; + isc_result_t result; + + printf("DNS Performance Testing Tool\n" + "Nominum Version " VERSION "\n\n"); + + setup(argc, argv, &config); + + if (pipe(threadpipe) < 0 || pipe(mainpipe) < 0 || + pipe(intrpipe) < 0) + perf_log_fatal("creating pipe"); + + perf_datafile_setpipefd(input, threadpipe[0]); + + perf_os_blocksignal(SIGINT, ISC_TRUE); + + print_initial_status(&config); + + threads = isc_mem_get(mctx, config.threads * sizeof(threadinfo_t)); + if (threads == NULL) + perf_log_fatal("out of memory"); + for (i = 0; i < config.threads; i++) + threadinfo_init(&threads[i], &config, ×); + if (config.stats_interval > 0) { + stats_thread.config = &config; + stats_thread.times = × + THREAD(&stats_thread.sender, do_interval_stats, &stats_thread); + } + + times.start_time = get_time(); + if (config.timelimit > 0) + times.stop_time = times.start_time + config.timelimit; + else + times.stop_time = ISC_UINT64_MAX; + times.stop_time_ns.tv_sec = times.stop_time / MILLION; + times.stop_time_ns.tv_nsec = (times.stop_time % MILLION) * 1000; + + LOCK(&start_lock); + started = ISC_TRUE; + BROADCAST(&start_cond); + UNLOCK(&start_lock); + + perf_os_handlesignal(SIGINT, handle_sigint); + perf_os_blocksignal(SIGINT, ISC_FALSE); + result = perf_os_waituntilreadable(mainpipe[0], intrpipe[0], + times.stop_time - times.start_time); + if (result == ISC_R_CANCELED) + interrupted = ISC_TRUE; + + times.end_time = get_time(); + + write(threadpipe[1], "", 1); + for (i = 0; i < config.threads; i++) + threadinfo_stop(&threads[i]); + if (config.stats_interval > 0) + JOIN(stats_thread.sender, NULL); + + for (i = 0; i < config.threads; i++) + threadinfo_cleanup(&threads[i], ×); + + print_final_status(&config); + + sum_stats(&config, &total_stats); + print_statistics(&config, ×, &total_stats); + + isc_mem_put(mctx, threads, config.threads * sizeof(threadinfo_t)); + cleanup(&config); + + return (0); +} diff --git a/doc/caching-dns-performance.pdf b/doc/caching-dns-performance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..613a45c086048521f2878467dd142fde111c1148 GIT binary patch literal 70898 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 G`u_l9jQvgk literal 0 HcmV?d00001 diff --git a/doc/dnsperf.pdf b/doc/dnsperf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89f1e1d82addfd5157173b3d58cbcdd1db44f09f GIT binary patch literal 204284 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 z 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%0AdsW305EwD} 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
8w0i5QurH99gjAr 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 $b@sY+spFLYfEA1D@S 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 literal 0 HcmV?d00001 diff --git a/doc/resperf.pdf b/doc/resperf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7383d2387554d76699b32105bb35cc71bc2996eb GIT binary patch literal 254854 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 +#include +#include +#include + +#include "log.h" +#include "util.h" + +pthread_mutex_t log_lock = PTHREAD_MUTEX_INITIALIZER; + +static void +vlog(FILE *stream, const char *prefix, const char *fmt, va_list args) +{ + LOCK(&log_lock); + fflush(stdout); + if (prefix != NULL) + fprintf(stream, "%s: ", prefix); + vfprintf(stream, fmt, args); + fprintf(stream, "\n"); + UNLOCK(&log_lock); +} + +void +perf_log_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vlog(stdout, NULL, fmt, args); +} + +void +perf_log_fatal(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vlog(stderr, "Error", fmt, args); + exit(1); +} + +void +perf_log_warning(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vlog(stderr, "Warning", fmt, args); +} diff --git a/log.h b/log.h new file mode 100644 index 0000000..d95df0c --- /dev/null +++ b/log.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include + +#ifndef PERF_LOG_H +#define PERF_LOG_H 1 + +void +perf_log_printf(const char *fmt, ...); + +void +perf_log_fatal(const char *fmt, ...); + +void +perf_log_warning(const char *fmt, ...); + +#endif diff --git a/net.c b/net.c new file mode 100644 index 0000000..8d31c2a --- /dev/null +++ b/net.c @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "log.h" +#include "net.h" +#include "opt.h" + +int +perf_net_parsefamily(const char *family) +{ + if (family == NULL || strcmp(family, "any") == 0) + return AF_UNSPEC; + else if (strcmp(family, "inet") == 0) + return AF_INET; +#ifdef AF_INET6 + else if (strcmp(family, "inet6") == 0) + return AF_INET6; +#endif + else { + fprintf(stderr, "invalid family %s\n", family); + perf_opt_usage(); + exit(1); + } +} + +void +perf_net_parseserver(int family, const char *name, unsigned int port, + isc_sockaddr_t *addr) +{ + isc_sockaddr_t addrs[8]; + int count, i; + isc_result_t result; + + if (port == 0) { + fprintf(stderr, "server port cannot be 0\n"); + perf_opt_usage(); + exit(1); + } + + count = 0; + result = bind9_getaddresses(name, port, addrs, 8, &count); + if (result == ISC_R_SUCCESS) { + for (i = 0; i < count; i++) { + if (isc_sockaddr_pf(&addrs[i]) == family || + family == AF_UNSPEC) + { + *addr = addrs[i]; + return; + } + } + } + + fprintf(stderr, "invalid server address %s\n", name); + perf_opt_usage(); + exit(1); +} + +void +perf_net_parselocal(int family, const char *name, unsigned int port, + isc_sockaddr_t *addr) +{ + struct in_addr in4a; + struct in6_addr in6a; + + if (name == NULL) { + isc_sockaddr_anyofpf(addr, family); + isc_sockaddr_setport(addr, port); + } else if (inet_pton(AF_INET, name, &in4a) == 1) { + isc_sockaddr_fromin(addr, &in4a, port); + } else if (inet_pton(AF_INET6, name, &in6a) == 1) { + isc_sockaddr_fromin6(addr, &in6a, port); + } else { + fprintf(stderr, "invalid local address %s\n", name); + perf_opt_usage(); + exit(1); + } +} + +int +perf_net_opensocket(const isc_sockaddr_t *server, const isc_sockaddr_t *local, + unsigned int offset, int bufsize) +{ + int family; + int sock; + isc_sockaddr_t tmp; + int port; + int ret; + int flags; + + family = isc_sockaddr_pf(server); + + if (isc_sockaddr_pf(local) != family) + perf_log_fatal("server and local addresses have " + "different families"); + + sock = socket(family, SOCK_DGRAM, 0); + if (sock == -1) + perf_log_fatal("Error: socket: %s\n", strerror(errno)); + +#if defined(AF_INET6) && defined(IPV6_V6ONLY) + if (family == AF_INET6) { + int on = 1; + + if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, + &on, sizeof(on)) == -1) { + perf_log_warning("setsockopt(IPV6_V6ONLY) failed"); + } + } +#endif + + tmp = *local; + port = isc_sockaddr_getport(&tmp); + if (port != 0 && offset != 0) { + port += offset; + if (port >= 0xFFFF) + perf_log_fatal("port %d out of range", port); + isc_sockaddr_setport(&tmp, port); + } + + if (bind(sock, &tmp.type.sa, tmp.length) == -1) + perf_log_fatal("bind: %s\n", strerror(errno)); + + if (bufsize > 0) { + bufsize *= 1024; + + ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, + &bufsize, sizeof(bufsize)); + if (ret < 0) + perf_log_warning("setsockbuf(SO_RCVBUF) failed"); + + ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, + &bufsize, sizeof(bufsize)); + if (ret < 0) + perf_log_warning("setsockbuf(SO_SNDBUF) failed"); + } + + flags = fcntl(sock, F_GETFL, 0); + if (flags < 0) + perf_log_fatal("fcntl(F_GETFL)"); + ret = fcntl(sock, F_SETFL, flags | O_NONBLOCK); + if (ret < 0) + perf_log_fatal("fcntl(F_SETFL)"); + + return sock; +} diff --git a/net.h b/net.h new file mode 100644 index 0000000..1ea0d4f --- /dev/null +++ b/net.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#ifndef PERF_NET_H +#define PERF_NET_H 1 + +int +perf_net_parsefamily(const char *family); + +void +perf_net_parseserver(int family, const char *name, unsigned int port, + isc_sockaddr_t *addr); + +void +perf_net_parselocal(int family, const char *name, unsigned int port, + isc_sockaddr_t *addr); + +int +perf_net_opensocket(const isc_sockaddr_t *server, const isc_sockaddr_t *local, + unsigned int offset, int bufsize); + +#endif diff --git a/opt.c b/opt.c new file mode 100644 index 0000000..7fe46ba --- /dev/null +++ b/opt.c @@ -0,0 +1,240 @@ +/* + * Copyright (C) 2012 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "log.h" +#include "opt.h" +#include "util.h" + +#define MAX_OPTS 64 +#define LINE_LENGTH 80 + +typedef struct { + char c; + perf_opttype_t type; + const char *desc; + const char *help; + const char *defval; + char defvalbuf[32]; + union { + void *valp; + char **stringp; + isc_boolean_t *boolp; + unsigned int *uintp; + isc_uint64_t *uint64p; + double *doublep; + in_port_t *portp; + } u; +} opt_t; + +static opt_t opts[MAX_OPTS]; +static unsigned int nopts; +static char optstr[MAX_OPTS * 2 + 2]; +static const char *progname; + +void +perf_opt_add(char c, perf_opttype_t type, const char *desc, const char *help, + const char *defval, void *valp) +{ + opt_t *opt; + char s[3]; + + if (nopts == MAX_OPTS) + perf_log_fatal("too many defined options"); + opt = &opts[nopts++]; + opt->c = c; + opt->type = type; + opt->desc = desc; + opt->help = help; + if (defval != NULL) { + strncpy(opt->defvalbuf, defval, sizeof(opt->defvalbuf)); + opt->defval = opt->defvalbuf; + } else { + opt->defval = NULL; + } + opt->u.valp = valp; + + sprintf(s, "%c%s", c, (type == perf_opt_boolean ? "" : ":")); + strcat(optstr, s); +} + +void +perf_opt_usage(void) +{ + unsigned int prefix_len, position, arg_len, i, j; + + prefix_len = fprintf(stderr, "Usage: %s", progname); + position = prefix_len; + for (i = 0; i < nopts; i++) { + arg_len = 6; + if (opts[i].desc != NULL) + arg_len += strlen(opts[i].desc) + 1; + if (LINE_LENGTH - position - 1 < arg_len) { + fprintf(stderr, "\n"); + for (j = 0; j < prefix_len; j++) + fprintf(stderr, " "); + position = prefix_len; + } + fprintf(stderr, " [-%c", opts[i].c); + if (opts[i].desc != NULL) + fprintf(stderr, " %s", opts[i].desc); + fprintf(stderr, "]"); + position += arg_len; + } + fprintf(stderr, "\n"); + + for (i = 0; i < nopts; i++) { + fprintf(stderr, " -%c %s", opts[i].c, opts[i].help); + if (opts[i].defval) + fprintf(stderr, " (default: %s)", opts[i].defval); + fprintf(stderr, "\n"); + } +} + +static isc_uint32_t +parse_uint(const char *desc, const char *str, + unsigned int min, unsigned int max) +{ + isc_uint32_t val; + isc_result_t result; + + val = 0; + result = isc_parse_uint32(&val, str, 10); + if (result != ISC_R_SUCCESS || val < min || val > max) { + fprintf(stderr, "invalid %s: %s\n", desc, str); + perf_opt_usage(); + exit(1); + } + return val; +} + +static isc_uint64_t +parse_timeval(const char *desc, const char *str) +{ + const char *s; + char c; + isc_boolean_t seen_dot = ISC_FALSE; + + s = str; + while (*s != 0) { + c = *s++; + if (c == '.') { + if (seen_dot) + goto fail; + seen_dot = ISC_TRUE; + } else if (c < '0' || c > '9') { + goto fail; + } + } + + return MILLION * atof(str); + fail: + fprintf(stderr, "invalid %s: %s\n", desc, str); + perf_opt_usage(); + exit(1); +} + +static double +parse_double(const char *desc, const char *str) { + char c; + int index = 0; + isc_boolean_t seen_dot = ISC_FALSE; + + while (str[index] != 0) { + c = str[index]; + if (c == '.') { + if (seen_dot) + goto fail; + seen_dot = ISC_TRUE; + } else if (c < '0' || c > '9') { + goto fail; + } + index++; + } + + return atof(str); + fail: + fprintf(stderr, "invalid %s: %s\n", desc, str); + perf_opt_usage(); + exit(1); +} + +void +perf_opt_parse(int argc, char **argv) +{ + int c; + opt_t *opt; + unsigned int i; + + progname = isc_file_basename(argv[0]); + + perf_opt_add('h', perf_opt_boolean, NULL, "print this help", + NULL, NULL); + + while ((c = getopt(argc, argv, optstr)) != -1) { + for (i = 0; i < nopts; i++) { + if (opts[i].c == c) + break; + } + if (i == nopts) { + perf_opt_usage(); + exit(1); + } + if (c == 'h') { + perf_opt_usage(); + exit(0); + } + opt = &opts[i]; + switch (opt->type) { + case perf_opt_string: + *opt->u.stringp = optarg; + break; + case perf_opt_boolean: + *opt->u.boolp = ISC_TRUE; + break; + case perf_opt_uint: + *opt->u.uintp = parse_uint(opt->desc, optarg, + 1, 0xFFFFFFFF); + break; + case perf_opt_timeval: + *opt->u.uint64p = parse_timeval(opt->desc, optarg); + break; + case perf_opt_double: + *opt->u.doublep = parse_double(opt->desc, optarg); + break; + case perf_opt_port: + *opt->u.portp = parse_uint(opt->desc, optarg, + 0, 0xFFFF); + break; + } + } + if (optind != argc) { + fprintf(stderr, "unexpected argument %s\n", argv[optind]); + perf_opt_usage(); + exit(1); + } +} diff --git a/opt.h b/opt.h new file mode 100644 index 0000000..45dced3 --- /dev/null +++ b/opt.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2012 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#ifndef PERF_OPT_H +#define PERF_OPT_H 1 + +typedef enum { + perf_opt_string, + perf_opt_boolean, + perf_opt_uint, + perf_opt_timeval, + perf_opt_double, + perf_opt_port, +} perf_opttype_t; + +void +perf_opt_add(char c, perf_opttype_t type, const char *desc, const char *help, + const char *defval, void *valp); + +void +perf_opt_usage(void); + +void +perf_opt_parse(int argc, char **argv); + +#endif diff --git a/os.c b/os.c new file mode 100644 index 0000000..99234b4 --- /dev/null +++ b/os.c @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2011 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include +#include +#include + +#include + +#include +#include + +#include "log.h" +#include "os.h" +#include "util.h" + +void +perf_os_blocksignal(int sig, isc_boolean_t block) +{ + sigset_t sset; + int op; + + op = block ? SIG_BLOCK : SIG_UNBLOCK; + + if (sigemptyset(&sset) < 0 || + sigaddset(&sset, sig) < 0 || + pthread_sigmask(op, &sset, NULL) < 0) + perf_log_fatal("pthread_sigmask: %s", strerror(errno)); +} + +void +perf_os_handlesignal(int sig, void (*handler)(int)) +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = handler; + + if (sigfillset(&sa.sa_mask) < 0 || + sigaction(sig, &sa, NULL) < 0) + perf_log_fatal("sigaction: %s", strerror(errno)); +} + +isc_result_t +perf_os_waituntilreadable(int fd, int pipe_fd, isc_int64_t timeout) +{ + fd_set read_fds; + int maxfd; + struct timeval tv, *tvp; + int n; + + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + FD_SET(pipe_fd, &read_fds); + maxfd = pipe_fd > fd ? pipe_fd : fd; + if (timeout < 0) { + tvp = NULL; + } else { + tv.tv_sec = timeout / MILLION; + tv.tv_usec = timeout % MILLION; + tvp = &tv; + } + n = select(maxfd + 1, &read_fds, NULL, NULL, tvp); + if (n < 0) { + if (errno != EINTR) + perf_log_fatal("select() failed"); + return (ISC_R_CANCELED); + } else if (FD_ISSET(fd, &read_fds)) { + return (ISC_R_SUCCESS); + } else if (FD_ISSET(pipe_fd, &read_fds)) { + return (ISC_R_CANCELED); + } else { + return (ISC_R_TIMEDOUT); + } +} + +isc_result_t +perf_os_waituntilanyreadable(int *fds, unsigned int nfds, int pipe_fd, + isc_int64_t timeout) +{ + fd_set read_fds; + unsigned int i; + int maxfd; + struct timeval tv, *tvp; + int n; + + FD_ZERO(&read_fds); + maxfd = 0; + for (i = 0; i < nfds; i++) { + FD_SET(fds[i], &read_fds); + if (fds[i] > maxfd) + maxfd = fds[i]; + } + FD_SET(pipe_fd, &read_fds); + if (pipe_fd > maxfd) + maxfd = pipe_fd; + + if (timeout < 0) { + tvp = NULL; + } else { + tv.tv_sec = timeout / MILLION; + tv.tv_usec = timeout % MILLION; + tvp = &tv; + } + n = select(maxfd + 1, &read_fds, NULL, NULL, tvp); + if (n < 0) { + if (errno != EINTR) + perf_log_fatal("select() failed"); + return (ISC_R_CANCELED); + } else if (n == 0) { + return (ISC_R_TIMEDOUT); + } else if (FD_ISSET(pipe_fd, &read_fds)) { + return (ISC_R_CANCELED); + } else { + return (ISC_R_SUCCESS); + } +} diff --git a/os.h b/os.h new file mode 100644 index 0000000..6a75f4d --- /dev/null +++ b/os.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2011 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#ifndef PERF_OS_H +#define PERF_OS_H 1 + +void +perf_os_blocksignal(int sig, isc_boolean_t block); + +void +perf_os_handlesignal(int sig, void (*handler)(int)); + +isc_result_t +perf_os_waituntilreadable(int fd, int pipe_fd, isc_int64_t timeout); + +isc_result_t +perf_os_waituntilanyreadable(int *fds, unsigned int nfds, int pipe_fd, + isc_int64_t timeout); + +#endif diff --git a/resperf-report b/resperf-report new file mode 100755 index 0000000..46f49b9 --- /dev/null +++ b/resperf-report @@ -0,0 +1,96 @@ +#!/bin/sh +# +# Driver script to run resperf and generate an HTML report of +# the results, with graphs. +# + +# Program locations - change these if not in $PATH +resperf=resperf +gnuplot=gnuplot + +# The gnuplot terminal type. This determines the image format for the +# plots; "png" or "gif" will both work as long as the corresponding +# terminal support is compiled into your copy of gnuplot. +terminal=png + +# Create a unique ID for this report +id=`date '+%Y%m%d-%H%M'` + +# Set up file names +reportfile="$id.html" +outputfile="$id.output" +plotfile="$id.gnuplot" +rate_graph="$id.rate.$terminal" +latency_graph="$id.latency.$terminal" + +# Run the test +$resperf -P "$plotfile" "$@" >"$outputfile" 2>&1 || + { echo "`basename $0`: error running resperf:" >&2; + cat $outputfile >&2; + exit 1; + } + +# Create plots + +if + $gnuplot <&2; exit 1; +fi + +if + $gnuplot <&2; exit 1; +fi + +# Generate the report + +exec >"$reportfile" + +cat < +

Resperf report $id

+

Resperf output

+
+EOF
+cat "$outputfile"
+cat <
+EOF
+
+cat <Plots
+

+ + +

+ +EOF + +echo "Done, report is in $reportfile" >&2 + diff --git a/resperf.1 b/resperf.1 new file mode 100644 index 0000000..b5dc8e1 --- /dev/null +++ b/resperf.1 @@ -0,0 +1,598 @@ +.\" Copyright (C) Nominum, Inc. +.\" +.\" All rights reserved. +.TH RESPERF 1 "Dec 9, 2015" Nominum Nominum +.SH NAME +\%resperf - test the resolution performance of a caching DNS server +.SH SYNOPSIS +.hy 0 +.ad l +\fBresperf\-report\fR\ [\fB\-a\ \fIlocal_addr\fB\fR] +[\fB\-d\ \fIdatafile\fB\fR] +[\fB\-s\ \fIserver_addr\fB\fR] +[\fB\-p\ \fIport\fB\fR] +[\fB\-x\ \fIlocal_port\fB\fR] +[\fB\-t\ \fItimeout\fB\fR] +[\fB\-b\ \fIbufsize\fB\fR] +[\fB\-f\ \fIfamily\fB\fR] +[\fB\-e\fR] +[\fB\-D\fR] +[\fB\-y\ \fI[alg:]name:secret\fB\fR] +[\fB\-h\fR] +[\fB\-i\ \fIinterval\fB\fR] +[\fB\-m\ \fImax_qps\fB\fR] +[\fB\-r\ \fIrampup_time\fB\fR] +[\fB\-c\ \fIconstant_traffic_time\fB\fR] +[\fB\-L\ \fImax_loss\fB\fR] +[\fB\-C\ \fIclients\fB\fR] +[\fB\-q\ \fImax_outstanding\fB\fR] +.ad +.hy +.hy 0 +.ad l + +\fBresperf\fR\ [\fB\-a\ \fIlocal_addr\fB\fR] +[\fB\-d\ \fIdatafile\fB\fR] +[\fB\-s\ \fIserver_addr\fB\fR] +[\fB\-p\ \fIport\fB\fR] +[\fB\-x\ \fIlocal_port\fB\fR] +[\fB\-t\ \fItimeout\fB\fR] +[\fB\-b\ \fIbufsize\fB\fR] +[\fB\-f\ \fIfamily\fB\fR] +[\fB\-e\fR] +[\fB\-D\fR] +[\fB\-y\ \fI[alg:]name:secret\fB\fR] +[\fB\-h\fR] +[\fB\-i\ \fIinterval\fB\fR] +[\fB\-m\ \fImax_qps\fB\fR] +[\fB\-P\ \fIplot_data_file\fB\fR] +[\fB\-r\ \fIrampup_time\fB\fR] +[\fB\-c\ \fIconstant_traffic_time\fB\fR] +[\fB\-L\ \fImax_loss\fB\fR] +[\fB\-C\ \fIclients\fB\fR] +[\fB\-q\ \fImax_outstanding\fB\fR] +.ad +.hy +.SH DESCRIPTION +\fBresperf\fR is a companion tool to \fBdnsperf\fR. \fBdnsperf\fR was +primarily designed for benchmarking authoritative servers, and it does not +work well with caching servers that are talking to the live Internet. One +reason for this is that dnsperf uses a "self-pacing" approach, which is +based on the assumption that you can keep the server 100% busy simply by +sending it a small burst of back-to-back queries to fill up network buffers, +and then send a new query whenever you get a response back. This approach +works well for authoritative servers that process queries in order and one +at a time; it also works pretty well for a caching server in a closed +laboratory environment talking to a simulated Internet that's all on the +same LAN. Unfortunately, it does not work well with a caching server talking +to the actual Internet, which may need to work on thousands of queries in +parallel to achieve its maximum throughput. There have been numerous +attempts to use dnsperf (or its predecessor, queryperf) for benchmarking +live caching servers, usually with poor results. Therefore, a separate tool +designed specifically for caching servers is needed. +.SS "How resperf works" +Unlike the "self-pacing" approach of dnsperf, resperf works by sending DNS +queries at a controlled, steadily increasing rate. By default, resperf will +send traffic for 60 seconds, linearly increasing the amount of traffic from +zero to 100,000 queries per second. + +During the test, resperf listens for responses from the server and keeps +track of response rates, failure rates, and latencies. It will also continue +listening for responses for an additional 40 seconds after it has stopped +sending traffic, so that there is time for the server to respond to the last +queries sent. This time period was chosen to be longer than the overall +query timeout of both Nominum Vantio and current versions of BIND. + +If the test is successful, the query rate will at some point exceed the +capacity of the server and queries will be dropped, causing the response +rate to stop growing or even decrease as the query rate increases. + +The result of the test is a set of measurements of the query rate, response +rate, failure response rate, and average query latency as functions of time. +.SS "What you will need" +Benchmarking a live caching server is serious business. A fast caching +server like Nominum Vantio running on a XEON server, resolving a mix of +cacheable and non-cacheable queries typical of ISP customer traffic, is +capable of resolving over 100,000 queries per second. In the process, it +will send more than 40,000 queries per second to authoritative servers on +the Internet, and receive responses to most of them. Assuming an average +request size of 50 bytes and a response size of 150 bytes, this amounts to +some 16 Mbps of outgoing and 48 Mbps of incoming traffic. If your Internet +connection can't handle the bandwidth, you will end up measuring the speed +of the connection, not the server, and may saturate the connection causing a +degradation in service for other users. + +Make sure there is no stateful firewall between the server and the Internet, +because most of them can't handle the amount of UDP traffic the test will +generate and will end up dropping packets, skewing the test results. Some +will even lock up or crash. + +You should run resperf on a machine separate from the server under test, on +the same LAN. Preferably, this should be a Gigabit Ethernet network. The +machine running resperf should be at least as fast as the machine being +tested; otherwise, it may end up being the bottleneck. + +There should be no other applications running on the machine running +resperf. Performance testing at the traffic levels involved is essentially a +hard real-time application - consider the fact that at a query rate of +100,000 queries per second, if resperf gets delayed by just 1/100 of a +second, 1000 incoming UDP packets will arrive in the meantime. This is more +than most operating systems will buffer, which means packets will be +dropped. + +Because the granularity of the timers provided by operating systems is +typically too coarse to accurately schedule packet transmissions at +sub-millisecond intervals, resperf will busy-wait between packet +transmissions, constantly polling for responses in the meantime. Therefore, +it is normal for resperf to consume 100% CPU during the whole test run, even +during periods where query rates are relatively low. + +You will also need a set of test queries in the \fBdnsperf\fR file format. +See the \fBdnsperf\fR man page for instructions on how to construct this +query file. To make the test as realistic as possible, the queries should be +derived from recorded production client DNS traffic, without removing +duplicate queries or other filtering. With the default settings, resperf +will use up to 3 million queries in each test run. + +If the caching server to be tested has a configurable limit on the number of +simultaneous resolutions, like the \fBmax\-recursive\-clients\fR statement +in Nominum Vantio or the \fBrecursive\-clients\fR option in BIND 9, you will +probably have to increase it. As a starting point, we recommend a value of +10000 for Nominum Vantio and 100000 for BIND 9. Should the limit be reached, +it will show up in the plots as an increase in the number of failure +responses. + +The server being tested should be restarted at the beginning of each test to +make sure it is starting with an empty cache. If the cache already contains +data from a previous test run that used the same set of queries, almost all +queries will be answered from the cache, yielding inflated performance +numbers. + +To use the \fBresperf\-report\fR script, you need to have \fBgnuplot\fR +installed. Make sure your installed version of \fBgnuplot\fR supports the +png terminal driver. If your \fBgnuplot\fR doesn't support png but does +support gif, you can change the line saying terminal=png in the +\fBresperf\-report\fR script to terminal=gif. +.SS "Running the test" +Resperf is typically invoked via the \fBresperf\-report\fR script, which +will run \fBresperf\fR with its output redirected to a file and then +automatically generate an illustrated report in HTML format. Command line +arguments given to resperf-report will be passed on unchanged to resperf. + +When running resperf-report, you will need to specify at least the server IP +address and the query data file. A typical invocation will look like +.RS +.hy 0 + +.nf +resperf\-report \-s 10.0.0.2 \-d queryfile +.fi +.hy +.RE + +With default settings, the test run will take at most 100 seconds (60 +seconds of ramping up traffic and then 40 seconds of waiting for responses), +but in practice, the 60-second traffic phase will usually be cut short. To +be precise, resperf can transition from the traffic-sending phase to the +waiting-for-responses phase in three different ways: +.IP \(bu 2 +Running for the full allotted time and successfully reaching the maximum +query rate (by default, 60 seconds and 100,000 qps, respectively). Since +this is a very high query rate, this will rarely happen (with today's +hardware); one of the other two conditions listed below will usually occur +first. +.IP \(bu 2 +Exceeding 65,536 outstanding queries. This often happens as a result of +(successfully) exceeding the capacity of the server being tested, causing +the excess queries to be dropped. The limit of 65,536 queries comes from the +number of possible values for the ID field in the DNS packet. Resperf needs +to allocate a unique ID for each outstanding query, and is therefore unable +to send further queries if the set of possible IDs is exhausted. +.IP \(bu 2 +When resperf finds itself unable to send queries fast enough. Resperf will +notice if it is falling behind in its scheduled query transmissions, and if +this backlog reaches 1000 queries, it will print a message like "Fell behind +by 1000 queries" (or whatever the actual number is at the time) and stop +sending traffic. +.PP +Regardless of which of the above conditions caused the traffic-sending phase +of the test to end, you should examine the resulting plots to make sure the +server's response rate is flattening out toward the end of the test. If it +is not, then you are not loading the server enough. If you are getting the +"Fell behind" message, make sure that the machine running resperf is fast +enough and has no other applications running. + +You should also monitor the CPU usage of the server under test. It should +reach close to 100% CPU at the point of maximum traffic; if it does not, you +most likely have a bottleneck in some other part of your test setup, for +example, your external Internet connection. + +The report generated by \fBresperf\-report\fR will be stored with a unique +file name based on the current date and time, e.g., +\fI20060812-1550.html\fR. The PNG images of the plots and other auxiliary +files will be stored in separate files beginning with the same date-time +string. To view the report, simply open the \fI.html\fR file in a web +browser. + +If you need to copy the report to a separate machine for viewing, make sure +to copy the .png files along with the .html file (or simply copy all the +files, e.g., using scp 20060812-1550.* host:directory/). +.SS "Interpreting the report" +The \fI.html\fR file produced by \fBresperf\-report\fR consists of two +sections. The first section, "Resperf output", contains output from the +\fBresperf\fR program such as progress messages, a summary of the command +line arguments, and summary statistics. The second section, "Plots", +contains two plots generated by \fBgnuplot\fR: "Query/response/failure rate" +and "Latency". + +The "Query/response/failure rate" plot contains three graphs. The "Queries +sent per second" graph shows the amount of traffic being sent to the server; +this should be very close to a straight diagonal line, reflecting the linear +ramp-up of traffic. + +The "Total responses received per second" graph shows how many of the +queries received a response from the server. All responses are counted, +whether successful (NOERROR or NXDOMAIN) or not (e.g., SERVFAIL). + +The "Failure responses received per second" graph shows how many of the +queries received a failure response. A response is considered to be a +failure if its RCODE is neither NOERROR nor NXDOMAIN. + +By visually inspecting the graphs, you can get an idea of how the server +behaves under increasing load. The "Total responses received per second" +graph will initially closely follow the "Queries sent per second" graph +(often rendering it invisible in the plot as the two graphs are plotted on +top of one another), but when the load exceeds the server's capacity, the +"Total responses received per second" graph may diverge from the "Queries +sent per second" graph and flatten out, indicating that some of the queries +are being dropped. + +The "Failure responses received per second" graph will normally show a +roughly linear ramp close to the bottom of the plot with some random +fluctuation, since typical query traffic will contain some small percentage +of failing queries randomly interspersed with the successful ones. As the +total traffic increases, the number of failures will increase +proportionally. + +If the "Failure responses received per second" graph turns sharply upwards, +this can be another indication that the load has exceeded the server's +capacity. This will happen if the server reacts to overload by sending +SERVFAIL responses rather than by dropping queries. Since Nominum Vantio and +BIND 9 will both respond with SERVFAIL when they exceed their +\fBmax\-recursive\-clients\fR or \fBrecursive\-clients\fR limit, +respectively, a sudden increase in the number of failures could mean that +the limit needs to be increased. + +The "Latency" plot contains a single graph marked "Average latency". This +shows how the latency varies during the course of the test. Typically, the +latency graph will exhibit a downwards trend because the cache hit rate +improves as ever more responses are cached during the test, and the latency +for a cache hit is much smaller than for a cache miss. The latency graph is +provided as an aid in determining the point where the server gets +overloaded, which can be seen as a sharp upwards turn in the graph. The +latency graph is not intended for making absolute latency measurements or +comparisons between servers; the latencies shown in the graph are not +representative of production latencies due to the initially empty cache and +the deliberate overloading of the server towards the end of the test. + +Note that all measurements are displayed on the plot at the horizontal +position corresponding to the point in time when the query was sent, not +when the response (if any) was received. This makes it it easy to compare +the query and response rates; for example, if no queries are dropped, the +query and response graphs will be identical. As another example, if the plot +shows 10% failure responses at t=5 seconds, this means that 10% of the +queries sent at t=5 seconds eventually failed, not that 10% of the responses +received at t=5 seconds were failures. +.SS "Determining the server's maximum throughput" +Often, the goal of running \fBresperf\fR is to determine the server's +maximum throughput, in other words, the number of queries per second it is +capable of handling. This is not always an easy task, because as a server is +driven into overload, the service it provides may deteriorate gradually, and +this deterioration can manifest itself either as queries being dropped, as +an increase in the number of SERVFAIL responses, or an increase in latency. +The maximum throughput may be defined as the highest level of traffic at +which the server still provides an acceptable level of service, but that +means you first need to decide what an acceptable level of service means in +terms of packet drop percentage, SERVFAIL percentage, and latency. + +The summary statistics in the "Resperf output" section of the report +contains a "Maximum throughput" value which by default is determined from +the maximum rate at which the server was able to return responses, without +regard to the number of queries being dropped or failing at that point. This +method of throughput measurement has the advantage of simplicity, but it may +or may not be appropriate for your needs; the reported value should always +be validated by a visual inspection of the graphs to ensure that service has +not already deteriorated unacceptably before the maximum response rate is +reached. It may also be helpful to look at the "Lost at that point" value in +the summary statistics; this indicates the percentage of the queries that +was being dropped at the point in the test when the maximum throughput was +reached. + +Alternatively, you can make resperf report the throughput at the point in +the test where the percentage of queries dropped exceeds a given limit (or +the maximum as above if the limit is never exceeded). This can be a more +realistic indication of how much the server can be loaded while still +providing an acceptable level of service. This is done using the \fB\-L\fR +command line option; for example, specifying \fB\-L 10\fR makes resperf +report the highest throughput reached before the server starts dropping more +than 10% of the queries. + +There is no corresponding way of automatically constraining results based on +the number of failed queries, because unlike dropped queries, resolution +failures will occur even when the the server is not overloaded, and the +number of such failures is heavily dependent on the query data and network +conditions. Therefore, the plots should be manually inspected to ensure that +there is not an abnormal number of failures. +.SH "GENERATING CONSTANT TRAFFIC" +In addition to ramping up traffic linearly, \fBresperf\fR also has the +capability to send a constant stream of traffic. This can be useful when +using \fBresperf\fR for tasks other than performance measurement; for +example, it can be used to "soak test" a server by subjecting it to a +sustained load for an extended period of time. + +To generate a constant traffic load, use the \fB\-c\fR command line option, +together with the \fB\-m\fR option which specifies the desired constant +query rate. For example, to send 10000 queries per second for an hour, use +\fB\-m 10000 \-c 3600\fR. This will include the usual 30-second gradual +ramp-up of traffic at the beginning, which may be useful to avoid initially +overwhelming a server that is starting with an empty cache. To start the +onslaught of traffic instantly, use \fB\-m 10000 \-c 3600 \-r 0\fR. + +To be precise, \fBresperf\fR will do a linear ramp-up of traffic from 0 to +\fB\-m\fR queries per second over a period of \fB\-r\fR seconds, followed by +a plateau of steady traffic at \fB\-m\fR queries per second lasting for +\fB\-c\fR seconds, followed by waiting for responses for an extra 40 +seconds. Either the ramp-up or the plateau can be suppressed by supplying a +duration of zero seconds with \fB\-r 0\fR and \fB\-c 0\fR, respectively. The +latter is the default. + +Sending traffic at high rates for hours on end will of course require very +large amounts of input data. Also, a long-running test will generate a large +amount of plot data, which is kept in memory for the duration of the test. +To reduce the memory usage and the size of the plot file, consider +increasing the interval between measurements from the default of 0.5 seconds +using the \fB\-i\fR option in long-running tests. + +When using \fBresperf\fR for long-running tests, it is important that the +traffic rate specified using the \fB\-m\fR is one that both \fBresperf\fR +itself and the server under test can sustain. Otherwise, the test is likely +to be cut short as a result of either running out of query IDs (because of +large numbers of dropped queries) or of resperf falling behind its +transmission schedule. +.SH OPTIONS +Because the \fBresperf\-report\fR script passes its command line options +directly to the \fBresperf\fR programs, they both accept the same set of +options, with one exception: \fBresperf\-report\fR automatically adds an +appropriate \fB\-P\fR to the \fBresperf\fR command line, and therefore does +not itself take a \fB\-P\fR option. + +\fB-d \fIdatafile\fB\fR +.br +.RS +Specifies the input data file. If not specified, \fBresperf\fR will read +from standard input. +.RE + +\fB-s \fIserver_addr\fB\fR +.br +.RS +Specifies the name or address of the server to which requests will be sent. +The default is the loopback address, 127.0.0.1. +.RE + +\fB-p \fIport\fB\fR +.br +.RS +Sets the port on which the DNS packets are sent. If not specified, the +standard DNS port (53) is used. +.RE + +\fB-a \fIlocal_addr\fB\fR +.br +.RS +Specifies the local address from which to send requests. The default is the +wildcard address. +.RE + +\fB-x \fIlocal_port\fB\fR +.br +.RS +Specifies the local port from which to send requests. The default is the +wildcard port (0). + +If acting as multiple clients and the wildcard port is used, each client +will use a different random port. If a port is specified, the clients will +use a range of ports starting with the specified one. +.RE + +\fB-t \fItimeout\fB\fR +.br +.RS +Specifies the request timeout value, in seconds. \fBresperf\fR will no +longer wait for a response to a particular request after this many seconds +have elapsed. The default is 45 seconds. + +\fBresperf\fR times out unanswered requests in order to reclaim query IDs so +that the query ID space will not be exhausted in a long-running test, such +as when "soak testing" a server for an day with \fB\-m 10000 \-c 86400\fR. +The timeouts and the ability to tune them are of little use in the more +typical use case of a performance test lasting only a minute or two. + +The default timeout of 45 seconds was chosen to be longer than the query +timeout of current caching servers. Note that this is longer than the +corresponding default in \fBdnsperf\fR, because caching servers can take +many orders of magnitude longer to answer a query than authoritative servers +do. + +If a short timeout is used, there is a possibility that \fBresperf\fR will +receive a response after the corresponding request has timed out; in this +case, a message like Warning: Received a response with an unexpected id: 141 +will be printed. +.RE + +\fB-b \fIbufsize\fB\fR +.br +.RS +Sets the size of the socket's send and receive buffers, in kilobytes. If not +specified, the operating system's default is used. +.RE + +\fB-f \fIfamily\fB\fR +.br +.RS +Specifies the address family used for sending DNS packets. The possible +values are "inet", "inet6", or "any". If "any" (the default value) is +specified, \fBresperf\fR will use whichever address family is appropriate +for the server it is sending packets to. +.RE + +\fB-e\fR +.br +.RS +Enables EDNS0 [RFC2671], by adding an OPT record to all packets sent. +.RE + +\fB-D\fR +.br +.RS +Sets the DO (DNSSEC OK) bit [RFC3225] in all packets sent. This also enables +EDNS0, which is required for DNSSEC. +.RE + +\fB-y \fI[alg:]name:secret\fB\fR +.br +.RS +Add a TSIG record [RFC2845] to all packets sent, using the specified TSIG +key algorithm, name and secret, where the algorithm defaults to hmac-md5 and +the secret is expressed as a base-64 encoded string. +.RE + +\fB-h\fR +.br +.RS +Print a usage statement and exit. +.RE + +\fB-i \fIinterval\fB\fR +.br +.RS +Specifies the time interval between data points in the plot file. The +default is 0.5 seconds. +.RE + +\fB-m \fImax_qps\fB\fR +.br +.RS +Specifies the target maximum query rate (in queries per second). This should +be higher than the expected maximum throughput of the server being tested. +Traffic will be ramped up at a linearly increasing rate until this value is +reached, or until one of the other conditions described in the section +"Running the test" occurs. The default is 100000 queries per second. +.RE + +\fB-P \fIplot_data_file\fB\fR +.br +.RS +Specifies the name of the plot data file. The default is +\fIresperf.gnuplot\fR. +.RE + +\fB-r \fIrampup_time\fB\fR +.br +.RS +Specifies the length of time over which traffic will be ramped up. The +default is 60 seconds. +.RE + +\fB-c \fIconstant_traffic_time\fB\fR +.br +.RS +Specifies the length of time for which traffic will be sent at a constant +rate following the initial ramp-up. The default is 0 seconds, meaning no +sending of traffic at a constant rate will be done. +.RE + +\fB-L \fImax_loss\fB\fR +.br +.RS +Specifies the maximum acceptable query loss percentage for purposes of +determining the maximum throughput value. The default is 100%, meaning that +\fBresperf\fR will measure the maximum throughput without regard to query +loss. +.RE + +\fB-C \fIclients\fB\fR +.br +.RS +Act as multiple clients. Requests are sent from multiple sockets. The +default is to act as 1 client. +.RE + +\fB-q \fImax_outstanding\fB\fR +.br +.RS +Sets the maximum number of outstanding requests. \fBresperf\fR will stop +ramping up traffic when this many queries are outstanding. The default is +64k, and the limit is 64k per client. +.RE +.SH "THE PLOT DATA FILE" +The plot data file is written by the \fBresperf\fR program and contains the +data to be plotted using \fBgnuplot\fR. When running \fBresperf\fR via the +\fBresperf\-report\fR script, there is no need for the user to deal with +this file directly, but its format and contents are documented here for +completeness and in case you wish to run \fBresperf\fR directly and use its +output for purposes other than viewing it with \fBgnuplot\fR. + +The first line of the file is a comment identifying the fields. It may be +recognized as a comment by its leading hash sign (#). + +Subsequent lines contain the actual plot data. For purposes of generating +the plot data file, the test run is divided into time intervals of 0.5 +seconds (or some other length of time specified with the \fB\-i\fR command +line option). Each line corresponds to one such interval, and contains the +following values as floating-point numbers: + +\fBTime\fR +.br +.RS +The midpoint of this time interval, in seconds since the beginning of the +run +.RE + +\fBTarget queries per second\fR +.br +.RS +The number of queries per second scheduled to be sent in this time interval +.RE + +\fBActual queries per second\fR +.br +.RS +The number of queries per second actually sent in this time interval +.RE + +\fBResponses per second\fR +.br +.RS +The number of responses received corresponding to queries sent in this time +interval, divided by the length of the interval +.RE + +\fBFailures per second\fR +.br +.RS +The number of responses received corresponding to queries sent in this time +interval and having an RCODE other than NOERROR or NXDOMAIN, divided by the +length of the interval +.RE + +\fBAverage latency\fR +.br +.RS +The average time between sending the query and receiving a response, for +queries sent in this time interval +.RE +.SH AUTHOR +Nominum, Inc. +.SH "SEE ALSO" +\fBdnsperf\fR(1) diff --git a/resperf.c b/resperf.c new file mode 100644 index 0000000..4dfbb22 --- /dev/null +++ b/resperf.c @@ -0,0 +1,745 @@ +/* + * Copyright (C) 2000, 2001 Nominum, Inc. + * + * 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. + */ + +/* + * Copyright (C) 2004 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +/*** + *** DNS Resolution Performance Testing Tool + *** + *** Version $Id: resperf.c 263304 2015-12-15 01:14:10Z bwelling $ + ***/ + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "datafile.h" +#include "dns.h" +#include "log.h" +#include "net.h" +#include "opt.h" +#include "util.h" +#include "version.h" + +/* + * Global stuff + */ + +#define DEFAULT_SERVER_NAME "127.0.0.1" +#define DEFAULT_SERVER_PORT 53 +#define DEFAULT_LOCAL_PORT 0 +#define DEFAULT_SOCKET_BUFFER 32 +#define DEFAULT_TIMEOUT 45 +#define DEFAULT_MAX_OUTSTANDING (64 * 1024) + +#define MAX_INPUT_DATA (4 * 1024) + +struct query_info; + +typedef ISC_LIST(struct query_info) query_list; + +typedef struct query_info { + isc_uint64_t sent_timestamp; + /* + * This link links the query into the list of outstanding + * queries or the list of available query IDs. + */ + ISC_LINK(struct query_info) link; + /* + * The list this query is on. + */ + query_list *list; +} query_info; + +static query_list outstanding_list; +static query_list instanding_list; + +static query_info *queries; + +static isc_mem_t *mctx; + +static isc_sockaddr_t server_addr; +static isc_sockaddr_t local_addr; +static unsigned int nsocks; +static int *socks; + +static isc_uint64_t query_timeout; +static isc_boolean_t edns; +static isc_boolean_t dnssec; + +static perf_datafile_t *input; + +/* The target traffic level at the end of the ramp-up */ +double max_qps = 100000.0; + +/* The time period over which we ramp up traffic */ +#define DEFAULT_RAMP_TIME 60 +static isc_uint64_t ramp_time; + +/* How long to send constant traffic after the initial ramp-up */ +#define DEFAULT_SUSTAIN_TIME 0 +static isc_uint64_t sustain_time; + +/* How long to wait for responses after sending traffic */ +static isc_uint64_t wait_time = 40 * MILLION; + +/* Total duration of the traffic-sending part of the test */ +static isc_uint64_t traffic_time; + +/* Total duration of the test */ +static isc_uint64_t end_time; + +/* Interval between plot data points, in microseconds */ +#define DEFAULT_BUCKET_INTERVAL 0.5 +static isc_uint64_t bucket_interval; + +/* The number of plot data points */ +static int n_buckets; + +/* The plot data file */ +static const char *plotfile = "resperf.gnuplot"; + +/* The largest acceptable query loss when reporting max throughput */ +static double max_loss_percent = 100.0; + +/* The maximum number of outstanding queries */ +static unsigned int max_outstanding; + +static isc_uint64_t num_queries_sent; +static isc_uint64_t num_queries_outstanding; +static isc_uint64_t num_responses_received; +static isc_uint64_t num_queries_timed_out; +static isc_uint64_t rcodecounts[16]; + +static isc_uint64_t time_now; +static isc_uint64_t time_of_program_start; +static isc_uint64_t time_of_end_of_run; + +/* + * The last plot data point containing actual data; this can + * be less than than (n_buckets - 1) if the traffic sending + * phase is cut short + */ +static int last_bucket_used; + +/* + * The statistics for queries sent during one bucket_interval + * of the traffic sending phase. + */ +typedef struct { + int queries; + int responses; + int failures; + double latency_sum; +} ramp_bucket; + +/* Pointer to array of n_buckets ramp_bucket structures */ +static ramp_bucket *buckets; + +enum phase { + /* + * The ramp-up phase: we are steadily increasing traffic. + */ + PHASE_RAMP, + /* + * The sustain phase: we are sending traffic at a constant + * rate. + */ + PHASE_SUSTAIN, + /* + * The wait phase: we have stopped sending queries and are + * just waiting for any remaining responses. + */ + PHASE_WAIT +}; +static enum phase phase = PHASE_RAMP; + +/* The time when the sustain/wait phase began */ +static isc_uint64_t sustain_phase_began, wait_phase_began; + +static perf_dnstsigkey_t *tsigkey; + +static char * +stringify(double value, int precision) +{ + static char buf[20]; + + snprintf(buf, sizeof(buf), "%.*f", precision, value); + return buf; +} + +static void +setup(int argc, char **argv) +{ + const char *family = NULL; + const char *server_name = DEFAULT_SERVER_NAME; + in_port_t server_port = DEFAULT_SERVER_PORT; + const char *local_name = NULL; + in_port_t local_port = DEFAULT_LOCAL_PORT; + const char *filename = NULL; + const char *tsigkey_str = NULL; + int sock_family; + unsigned int bufsize; + unsigned int i; + isc_result_t result; + + result = isc_mem_create(0, 0, &mctx); + if (result != ISC_R_SUCCESS) + perf_log_fatal("creating memory context: %s", + isc_result_totext(result)); + + dns_result_register(); + + sock_family = AF_UNSPEC; + server_port = DEFAULT_SERVER_PORT; + local_port = DEFAULT_LOCAL_PORT; + bufsize = DEFAULT_SOCKET_BUFFER; + query_timeout = DEFAULT_TIMEOUT * MILLION; + ramp_time = DEFAULT_RAMP_TIME * MILLION; + sustain_time = DEFAULT_SUSTAIN_TIME * MILLION; + bucket_interval = DEFAULT_BUCKET_INTERVAL * MILLION; + max_outstanding = DEFAULT_MAX_OUTSTANDING; + nsocks = 1; + + perf_opt_add('f', perf_opt_string, "family", + "address family of DNS transport, inet or inet6", "any", + &family); + perf_opt_add('s', perf_opt_string, "server_addr", + "the server to query", DEFAULT_SERVER_NAME, &server_name); + perf_opt_add('p', perf_opt_port, "port", + "the port on which to query the server", + stringify(DEFAULT_SERVER_PORT, 0), &server_port); + perf_opt_add('a', perf_opt_string, "local_addr", + "the local address from which to send queries", NULL, + &local_name); + perf_opt_add('x', perf_opt_port, "local_port", + "the local port from which to send queries", + stringify(DEFAULT_LOCAL_PORT, 0), &local_port); + perf_opt_add('d', perf_opt_string, "datafile", + "the input data file", "stdin", &filename); + perf_opt_add('t', perf_opt_timeval, "timeout", + "the timeout for query completion in seconds", + stringify(DEFAULT_TIMEOUT, 0), &query_timeout); + perf_opt_add('b', perf_opt_uint, "buffer_size", + "socket send/receive buffer size in kilobytes", NULL, + &bufsize); + perf_opt_add('e', perf_opt_boolean, NULL, + "enable EDNS 0", NULL, &edns); + perf_opt_add('D', perf_opt_boolean, NULL, + "set the DNSSEC OK bit (implies EDNS)", NULL, &dnssec); + perf_opt_add('y', perf_opt_string, "[alg:]name:secret", + "the TSIG algorithm, name and secret", NULL, + &tsigkey_str); + perf_opt_add('i', perf_opt_timeval, "plot_interval", + "the time interval between plot data points, in seconds", + stringify(DEFAULT_BUCKET_INTERVAL, 1), &bucket_interval); + perf_opt_add('m', perf_opt_double, "max_qps", + "the maximum number of queries per second", + stringify(max_qps, 0), &max_qps); + perf_opt_add('P', perf_opt_string, "plotfile", + "the name of the plot data file", plotfile, &plotfile); + perf_opt_add('r', perf_opt_timeval, "ramp_time", + "the ramp-up time in seconds", + stringify(DEFAULT_RAMP_TIME, 0), &ramp_time); + perf_opt_add('c', perf_opt_timeval, "constant_traffic_time", + "how long to send constant traffic, in seconds", + stringify(DEFAULT_SUSTAIN_TIME, 0), &sustain_time); + perf_opt_add('L', perf_opt_double, "max_query_loss", + "the maximum acceptable query loss, in percent", + stringify(max_loss_percent, 0), &max_loss_percent); + perf_opt_add('C', perf_opt_uint, "clients", + "the number of clients to act as", NULL, + &nsocks); + perf_opt_add('q', perf_opt_uint, "num_outstanding", + "the maximum number of queries outstanding", + stringify(DEFAULT_MAX_OUTSTANDING, 0), &max_outstanding); + + perf_opt_parse(argc, argv); + + if (max_outstanding > nsocks * DEFAULT_MAX_OUTSTANDING) + perf_log_fatal("number of outstanding packets (%u) must not " + "be more than 64K per client", max_outstanding); + + if (ramp_time + sustain_time == 0) + perf_log_fatal("rampup_time and constant_traffic_time must not " + "both be 0"); + + ISC_LIST_INIT(outstanding_list); + ISC_LIST_INIT(instanding_list); + queries = isc_mem_get(mctx, max_outstanding * sizeof(query_info)); + if (queries == NULL) + perf_log_fatal("out of memory"); + for (i = 0; i < max_outstanding; i++) { + ISC_LINK_INIT(&queries[i], link); + ISC_LIST_APPEND(instanding_list, &queries[i], link); + queries[i].list = &instanding_list; + } + + + if (family != NULL) + sock_family = perf_net_parsefamily(family); + perf_net_parseserver(sock_family, server_name, server_port, + &server_addr); + perf_net_parselocal(isc_sockaddr_pf(&server_addr), + local_name, local_port, &local_addr); + + input = perf_datafile_open(mctx, filename); + + if (dnssec) + edns = ISC_TRUE; + + if (tsigkey_str != NULL) + tsigkey = perf_dns_parsetsigkey(tsigkey_str, mctx); + + socks = isc_mem_get(mctx, nsocks * sizeof(int)); + if (socks == NULL) + perf_log_fatal("out of memory"); + for (i = 0; i < nsocks; i++) + socks[i] = perf_net_opensocket(&server_addr, &local_addr, i, + bufsize); + +} + +static void +cleanup(void) +{ + unsigned int i; + + perf_datafile_close(&input); + for (i = 0; i < nsocks; i++) + (void) close(socks[i]); + isc_mem_put(mctx, socks, nsocks * sizeof(int)); + isc_mem_put(mctx, queries, max_outstanding * sizeof(query_info)); + isc_mem_put(mctx, buckets, n_buckets * sizeof(ramp_bucket)); +} + +/* Find the ramp_bucket for queries sent at time "when" */ + +static ramp_bucket * +find_bucket(isc_uint64_t when) { + isc_uint64_t sent_at = when - time_of_program_start; + int i = (int) ((n_buckets * sent_at) / traffic_time); + /* + * Guard against array bounds violations due to roundoff + * errors or scheduling jitter + */ + if (i < 0) + i = 0; + if (i > n_buckets - 1) + i = n_buckets - 1; + return &buckets[i]; +} + +/* + * print_statistics: + * Print out statistics based on the results of the test + */ +static void +print_statistics(void) { + int i; + double max_throughput; + double loss_at_max_throughput; + isc_boolean_t first_rcode; + isc_uint64_t run_time = time_of_end_of_run - time_of_program_start; + + printf("\nStatistics:\n\n"); + + printf(" Queries sent: %" ISC_PRINT_QUADFORMAT "u\n", + num_queries_sent); + printf(" Queries completed: %" ISC_PRINT_QUADFORMAT "u\n", + num_responses_received); + printf(" Queries lost: %" ISC_PRINT_QUADFORMAT "u\n", + num_queries_sent - num_responses_received); + printf(" Response codes: "); + first_rcode = ISC_TRUE; + for (i = 0; i < 16; i++) { + if (rcodecounts[i] == 0) + continue; + if (first_rcode) + first_rcode = ISC_FALSE; + else + printf(", "); + printf("%s %" ISC_PRINT_QUADFORMAT "u (%.2lf%%)", + perf_dns_rcode_strings[i], rcodecounts[i], + (rcodecounts[i] * 100.0) / num_responses_received); + } + printf("\n"); + printf(" Run time (s): %u.%06u\n", + (unsigned int)(run_time / MILLION), + (unsigned int)(run_time % MILLION)); + + /* Find the maximum throughput, subject to the -L option */ + max_throughput = 0.0; + loss_at_max_throughput = 0.0; + for (i = 0; i <= last_bucket_used; i++) { + ramp_bucket *b = &buckets[i]; + double responses_per_sec = + b->responses / (bucket_interval / (double) MILLION); + double loss = b->queries ? + (b->queries - b->responses) / (double) b->queries : 0.0; + double loss_percent = loss * 100.0; + if (loss_percent > max_loss_percent) + break; + if (responses_per_sec > max_throughput) { + max_throughput = responses_per_sec; + loss_at_max_throughput = loss_percent; + } + } + printf(" Maximum throughput: %.6lf qps\n", max_throughput); + printf(" Lost at that point: %.2f%%\n", loss_at_max_throughput); +} + +static ramp_bucket * +init_buckets(int n) { + ramp_bucket *p; + int i; + + p = isc_mem_get(mctx, n * sizeof(*p)); + if (p == NULL) + perf_log_fatal("out of memory"); + for (i = 0; i < n; i++) { + p[i].queries = p[i].responses = p[i].failures = 0; + p[i].latency_sum = 0.0; + } + return p; +} + +/* + * Send a query based on a line of input. + * Return ISC_R_NOMORE if we ran out of query IDs. + */ +static isc_result_t +do_one_line(isc_buffer_t *lines, isc_buffer_t *msg) { + query_info *q; + unsigned int qid; + unsigned int sock; + isc_region_t used; + unsigned char *base; + unsigned int length; + isc_result_t result; + + isc_buffer_clear(lines); + result = perf_datafile_next(input, lines, ISC_FALSE); + if (result != ISC_R_SUCCESS) + perf_log_fatal("ran out of query data"); + isc_buffer_usedregion(lines, &used); + + q = ISC_LIST_HEAD(instanding_list); + if (! q) + return (ISC_R_NOMORE); + qid = (q - queries) / nsocks; + sock = (q - queries) % nsocks; + + isc_buffer_clear(msg); + result = perf_dns_buildrequest(NULL, (isc_textregion_t *) &used, + qid, edns, dnssec, tsigkey, msg); + if (result != ISC_R_SUCCESS) + return (result); + + q->sent_timestamp = time_now; + + base = isc_buffer_base(msg); + length = isc_buffer_usedlength(msg); + if (sendto(socks[sock], base, length, 0, + &server_addr.type.sa, + server_addr.length) < 1) + { + perf_log_warning("failed to send packet: %s", + strerror(errno)); + return (ISC_R_FAILURE); + } + + ISC_LIST_UNLINK(instanding_list, q, link); + ISC_LIST_PREPEND(outstanding_list, q, link); + q->list = &outstanding_list; + + num_queries_sent++; + num_queries_outstanding++; + + return ISC_R_SUCCESS; +} + +static void +enter_sustain_phase(void) { + phase = PHASE_SUSTAIN; + if (sustain_time != 0.0) + printf("[Status] Ramp-up done, sending constant traffic\n"); + sustain_phase_began = time_now; +} + +static void +enter_wait_phase(void) { + phase = PHASE_WAIT; + printf("[Status] Waiting for more responses\n"); + wait_phase_began = time_now; +} + +/* + * try_process_response: + * + * Receive from the given socket & process an individual response packet. + * Remove it from the list of open queries (status[]) and decrement the + * number of outstanding queries if it matches an open query. + */ +static void +try_process_response(unsigned int sockindex) { + unsigned char packet_buffer[MAX_EDNS_PACKET]; + isc_uint16_t *packet_header; + isc_uint16_t qid, rcode; + query_info *q; + double latency; + ramp_bucket *b; + int n; + + packet_header = (isc_uint16_t *) packet_buffer; + n = recvfrom(socks[sockindex], packet_buffer, sizeof(packet_buffer), + 0, NULL, NULL); + if (n < 0) { + if (errno == EAGAIN || errno == EINTR) { + return; + } else { + perf_log_fatal("failed to receive packet: %s", + strerror(errno)); + } + } else if (n < 4) { + perf_log_warning("received short response"); + return; + } + + qid = ntohs(packet_header[0]); + rcode = ntohs(packet_header[1]) & 0xF; + + q = &queries[qid * nsocks + sockindex]; + if (q->list != &outstanding_list) { + perf_log_warning("received a response with an " + "unexpected id: %u", qid); + return; + } + + ISC_LIST_UNLINK(outstanding_list, q, link); + ISC_LIST_APPEND(instanding_list, q, link); + q->list = &instanding_list; + + num_queries_outstanding--; + + latency = (time_now - q->sent_timestamp) / (double)MILLION; + b = find_bucket(q->sent_timestamp); + b->responses++; + if (!(rcode == dns_rcode_noerror || rcode == dns_rcode_nxdomain)) + b->failures++; + b->latency_sum += latency; + num_responses_received++; + rcodecounts[rcode]++; +} + +static void +retire_old_queries(void) +{ + query_info *q; + + while (ISC_TRUE) { + q = ISC_LIST_TAIL(outstanding_list); + if (q == NULL || + (time_now - q->sent_timestamp) < query_timeout) + break; + ISC_LIST_UNLINK(outstanding_list, q, link); + ISC_LIST_APPEND(instanding_list, q, link); + q->list = &instanding_list; + + num_queries_outstanding--; + num_queries_timed_out++; + } +} + +static inline int +num_scheduled(isc_uint64_t time_since_start) +{ + if (phase == PHASE_RAMP) { + return 0.5 * max_qps * + (double)time_since_start * time_since_start / + (ramp_time * MILLION); + } else { /* PHASE_SUSTAIN */ + return 0.5 * max_qps * (ramp_time / (double)MILLION) + + max_qps * + (time_since_start - ramp_time) / (double)MILLION; + } +} + +int +main(int argc, char **argv) { + int i; + FILE *plotf; + isc_buffer_t lines, msg; + char input_data[MAX_INPUT_DATA]; + unsigned char outpacket_buffer[MAX_EDNS_PACKET]; + unsigned int max_packet_size; + unsigned int current_sock; + isc_result_t result; + + printf("DNS Resolution Performance Testing Tool\n" + "Nominum Version " VERSION "\n\n"); + + setup(argc, argv); + + isc_buffer_init(&lines, input_data, sizeof(input_data)); + + max_packet_size = edns ? MAX_EDNS_PACKET : MAX_UDP_PACKET; + isc_buffer_init(&msg, outpacket_buffer, max_packet_size); + + traffic_time = ramp_time + sustain_time; + end_time = traffic_time + wait_time; + + n_buckets = (traffic_time + bucket_interval - 1) / bucket_interval; + buckets = init_buckets(n_buckets); + + time_now = get_time(); + time_of_program_start = time_now; + + printf("[Status] Command line: %s", isc_file_basename(argv[0])); + for (i = 1; i < argc; i++) { + printf(" %s", argv[i]); + } + printf("\n"); + + printf("[Status] Sending\n"); + + current_sock = 0; + for (;;) { + int should_send; + isc_uint64_t time_since_start = time_now - + time_of_program_start; + switch (phase) { + case PHASE_RAMP: + if (time_since_start >= ramp_time) + enter_sustain_phase(); + break; + case PHASE_SUSTAIN: + if (time_since_start >= traffic_time) + enter_wait_phase(); + break; + case PHASE_WAIT: + if (time_since_start >= end_time || + ISC_LIST_EMPTY(outstanding_list)) + goto end_loop; + break; + } + if (phase != PHASE_WAIT) { + should_send = num_scheduled(time_since_start) - + num_queries_sent; + if (should_send >= 1000) { + printf("[Status] Fell behind by %d queries, " + "ending test at %.0f qps\n", + should_send, + (max_qps * time_since_start) / + ramp_time); + enter_wait_phase(); + } + if (should_send > 0) { + result = do_one_line(&lines, &msg); + if (result == ISC_R_SUCCESS) + find_bucket(time_now)->queries++; + if (result == ISC_R_NOMORE) { + printf("[Status] Reached %u outstanding queries\n", + max_outstanding); + enter_wait_phase(); + } + } + } + try_process_response(current_sock++); + current_sock = current_sock % nsocks; + retire_old_queries(); + time_now = get_time(); + } + end_loop: + time_now = get_time(); + time_of_end_of_run = time_now; + + printf("[Status] Testing complete\n"); + + plotf = fopen(plotfile, "w"); + if (! plotf) { + perf_log_fatal("could not open %s: %s", plotfile, + strerror(errno)); + } + + /* Print column headers */ + fprintf(plotf, "# time target_qps actual_qps " + "responses_per_sec failures_per_sec " + "avg_latency\n"); + + /* Don't print unused buckets */ + last_bucket_used = find_bucket(wait_phase_began) - buckets; + + /* Don't print a partial bucket at the end */ + if (last_bucket_used > 0) + --last_bucket_used; + + for (i = 0; i <= last_bucket_used; i++) { + double t = (i + 0.5) * traffic_time / + (n_buckets * (double)MILLION); + double ramp_dtime = ramp_time / (double)MILLION; + double target_qps = + t <= ramp_dtime ? (t / ramp_dtime) * max_qps : max_qps; + double latency = buckets[i].responses ? + buckets[i].latency_sum / buckets[i].responses : 0; + double interval = bucket_interval / (double) MILLION; + fprintf(plotf, "%7.3f %8.2f %8.2f %8.2f %8.2f %8.6f\n", + t, + target_qps, + buckets[i].queries / interval, + buckets[i].responses / interval, + buckets[i].failures / interval, + latency); + } + + fclose(plotf); + print_statistics(); + cleanup(); + + return 0; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..fdaa8eb --- /dev/null +++ b/util.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2012 - 2015 Nominum, Inc. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation 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 NOMINUM DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM 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. + */ + +#include +#include + +#include + +#include + +#include "log.h" + +#ifndef PERF_UTIL_H +#define PERF_UTIL_H 1 + +#define MILLION ((isc_uint64_t) 1000000) + +#define THREAD(thread, start, arg) do { \ + int __n = pthread_create((thread), NULL, (start), (arg)); \ + if (__n != 0) \ + perf_log_fatal("pthread_create failed: %s", \ + strerror(__n)); \ + } while (0) + +#define JOIN(thread, valuep) do { \ + int __n = pthread_join((thread), (valuep)); \ + if (__n != 0) \ + perf_log_fatal("pthread_join failed: %s", \ + strerror(__n)); \ + } while (0) + +#define MUTEX_INIT(mutex) do { \ + int __n = pthread_mutex_init((mutex), NULL); \ + if (__n != 0) \ + perf_log_fatal("pthread_mutex_init failed: %s", \ + strerror(__n)); \ + } while (0) + +#define MUTEX_DESTROY(mutex) do { \ + int __n = pthread_mutex_destroy((mutex)); \ + if (__n != 0) \ + perf_log_fatal("pthread_mutex_destroy failed: %s", \ + strerror(__n)); \ + } while (0) + +#define LOCK(mutex) do { \ + int __n = pthread_mutex_lock((mutex)); \ + if (__n != 0) \ + perf_log_fatal("pthread_mutex_lock failed: %s", \ + strerror(__n)); \ + } while (0) + +#define UNLOCK(mutex) do { \ + int __n = pthread_mutex_unlock((mutex)); \ + if (__n != 0) \ + perf_log_fatal("pthread_mutex_unlock failed: %s", \ + strerror(__n)); \ + } while (0) + +#define COND_INIT(cond) do { \ + int __n = pthread_cond_init((cond), NULL); \ + if (__n != 0) \ + perf_log_fatal("pthread_cond_init failed: %s", \ + strerror(__n)); \ + } while (0) + +#define SIGNAL(cond) do { \ + int __n = pthread_cond_signal((cond)); \ + if (__n != 0) \ + perf_log_fatal("pthread_cond_signal failed: %s", \ + strerror(__n)); \ + } while (0) + +#define BROADCAST(cond) do { \ + int __n = pthread_cond_broadcast((cond)); \ + if (__n != 0) \ + perf_log_fatal("pthread_cond_broadcast failed: %s", \ + strerror(__n)); \ + } while (0) + +#define WAIT(cond, mutex) do { \ + int __n = pthread_cond_wait((cond), (mutex)); \ + if (__n != 0) \ + perf_log_fatal("pthread_cond_wait failed: %s", \ + strerror(__n)); \ + } while (0) + +#define TIMEDWAIT(cond, mutex, when, timedout) do { \ + int __n = pthread_cond_timedwait((cond), (mutex), (when)); \ + isc_boolean_t *res = (timedout); \ + if (__n != 0 && __n != ETIMEDOUT) \ + perf_log_fatal("pthread_cond_timedwait failed: %s", \ + strerror(__n)); \ + if (res != NULL) \ + *res = ISC_TF(__n != 0); \ + } while (0) + +static __inline__ isc_uint64_t +get_time(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * MILLION + tv.tv_usec; +} + +#define SAFE_DIV(n, d) ( (d) == 0 ? 0 : (n) / (d) ) + +#endif diff --git a/version.h b/version.h new file mode 100644 index 0000000..d39fa0c --- /dev/null +++ b/version.h @@ -0,0 +1,5 @@ +#ifndef VERSION_H + +#define VERSION "2.1.0.0" + +#endif