Initial checking from Debian source pound_2.6-6+deb8u1
authorWerner Koch <wk@gnupg.org>
Mon, 30 Jan 2017 08:33:28 +0000 (09:33 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 30 Jan 2017 08:33:28 +0000 (09:33 +0100)
43 files changed:
CHANGELOG [new file with mode: 0644]
FAQ [new file with mode: 0755]
GPL.txt [new file with mode: 0755]
Makefile.in [new file with mode: 0755]
README [new file with mode: 0755]
config.c [new file with mode: 0755]
config.guess [new file with mode: 0755]
config.h.in [new file with mode: 0755]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/dirs [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/examples [new file with mode: 0644]
debian/init.d [new file with mode: 0644]
debian/patches/0001-anti_beast.patch [new file with mode: 0644]
debian/patches/0002-xss_redirect_fix.patch [new file with mode: 0644]
debian/patches/0003-tls_compression_disable.patch [new file with mode: 0644]
debian/patches/0004-add_http_patch_support.patch [new file with mode: 0644]
debian/patches/0005-wait_on_semaphore_fix.patch [new file with mode: 0644]
debian/patches/0006-add_mkcalendar_support.patch [new file with mode: 0644]
debian/patches/0007-anti_poodle.patch [new file with mode: 0644]
debian/patches/0008-disable_client_initiated_renegotiation.patch [new file with mode: 0644]
debian/patches/series [new file with mode: 0644]
debian/postinst [new file with mode: 0644]
debian/postrm [new file with mode: 0644]
debian/pound.cfg [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/source/format [new file with mode: 0644]
debian/watch [new file with mode: 0644]
http.c [new file with mode: 0755]
install-sh [new file with mode: 0755]
pound.8 [new file with mode: 0755]
pound.c [new file with mode: 0755]
pound.h [new file with mode: 0755]
poundctl.8 [new file with mode: 0755]
poundctl.c [new file with mode: 0755]
svc.c [new file with mode: 0755]
z2_2_5_1.py [new file with mode: 0755]
z2_2_6_1.py [new file with mode: 0755]

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644 (file)
index 0000000..061317f
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,810 @@
+------------------------------------------------------------------------
+r74 | roseg | 2011-12-28 14:57:45 +0100 (Wed, 28 Dec 2011) | 10 lines
+
+Release 2.6
+
+Enhancements:
+    - allow multiple AddHeader directives
+
+Bug fixes:
+    - fixed memory leak in config/AddHeader
+    - removed call to AC_FUNC_MALLOC for AIX compatability
+    - workaround for AIX getaddrinfo() bug
+
+------------------------------------------------------------------------
+r73 | roseg | 2011-06-24 17:59:41 +0200 (Fri, 24 Jun 2011) | 7 lines
+
+Release 2.6f
+
+Enhancements:
+
+Bug fixes:
+    - fixed memory leak in DH (patch by Edvin Torok via Patrizio Tassone)
+
+------------------------------------------------------------------------
+r72 | roseg | 2011-04-25 11:10:45 +0200 (Mon, 25 Apr 2011) | 8 lines
+
+Release 2.6e
+
+Enhancements:
+
+Bug fixes:
+    - fixed problem in SNI certificate storage
+    - changed long to long long for support of requests larger than 2GB
+
+------------------------------------------------------------------------
+r71 | roseg | 2011-04-11 15:59:05 +0200 (Mon, 11 Apr 2011) | 9 lines
+
+Release 2.6d
+
+Enhancements:
+    - added parsing for certificate CN
+
+Bug fixes:
+    - fixed problem in task enqueing
+    - fixed small problem in Makefile
+
+------------------------------------------------------------------------
+r70 | roseg | 2010-12-27 17:54:18 +0100 (Mon, 27 Dec 2010) | 14 lines
+
+Release 2.6c
+
+Enhancements:
+    - added support for OpenSSL 1.0
+    - added some more detailed error logging
+
+Bug fixes:
+    - fix for RewriteLocation
+    - fix for HTTPS back-ends
+    - fix for RPC support
+    - fix for possible request smuggling by using multiple headers
+
+Many thanks to Frank Schmirler and Ruben Kerkhof for the contributed patches
+
+------------------------------------------------------------------------
+r69 | roseg | 2010-09-25 16:49:49 +0200 (Sat, 25 Sep 2010) | 7 lines
+
+Release 2.6b
+
+Enhancements:
+    - pre-defined number of threads for better performance on small hardware
+
+Bug fixes:
+
+------------------------------------------------------------------------
+r68 | roseg | 2010-06-23 19:18:39 +0200 (Wed, 23 Jun 2010) | 15 lines
+
+Release 2.6a
+
+Stable release 2.5.1
+
+Enhancements:
+    - support for SNI via multiple Cert directives (thanks to Joe Gooch)
+    - translate hexadecimal characters in URL for pattern matching
+    - added support for a "Disabled" directive in the configuration
+
+Bug fixes:
+    - keep sessions for disabled back-ends, continue using them until the time-out
+    - fixed memory leak in session removal
+    - user IgnoreCase for CheckURL too
+    - fixed some issues with OpenSolaris build (thanks to Spradling Cloyce)
+
+------------------------------------------------------------------------
+r67 | roseg | 2010-02-02 12:49:00 +0100 (Tue, 02 Feb 2010) | 9 lines
+
+Release 2.5
+
+Enhancements:
+
+Bug fixes:
+  - fixed XML format to avoid problems with brain-dead parsers
+  - fixed Redirect to accept "/" as a path, so that "Redirect http://x/" is
+    considered an absolute path, but "Redirect http://x" is not
+
+------------------------------------------------------------------------
+r66 | roseg | 2010-01-04 17:20:55 +0100 (Mon, 04 Jan 2010) | 7 lines
+
+Release 2.5e
+
+Enhancements:
+  - added support for symbolic host names in poundctl
+
+Bug fixes:
+
+------------------------------------------------------------------------
+r65 | roseg | 2009-12-07 17:01:21 +0100 (Mon, 07 Dec 2009) | 9 lines
+
+Release 2.5d
+
+Enhancements:
+  - added support for --disable-pcreposix, --disable--tcmalloc, --disable-hoard in configuration script
+
+Bug fixes:
+  - fixed problem with long input lines in http.c
+  - if libpcreposix is present, then pcreposix.h must also be present
+
+------------------------------------------------------------------------
+r64 | roseg | 2009-09-21 13:16:57 +0200 (Mon, 21 Sep 2009) | 8 lines
+
+Release 2.5c
+
+Enhancements:
+  - added support for HTTPS backends
+
+Bug fixes:
+  - fixed problem with sub-patterns in session parameters
+
+------------------------------------------------------------------------
+r63 | roseg | 2009-08-19 17:44:07 +0200 (Wed, 19 Aug 2009) | 10 lines
+
+Release 2.5b
+
+Enhancements:
+  - support for ConnTO directive
+  - support for IgnoreCase directive
+
+Bug fixes:
+  - fixed problem in conf_fgets (\n confuses the regexp)
+  - changed RSA ephemeral keys regeneration default time (every 30 minutes)
+
+------------------------------------------------------------------------
+r62 | roseg | 2009-08-06 17:23:30 +0200 (Thu, 06 Aug 2009) | 9 lines
+
+Release 2.5a
+
+Enhancements:
+  - support for include directive
+
+Bug fixes:
+  - fixed generation of ephemeral RSA keys (avoid premature locking)
+  - added pre-generated DH parameters
+
+------------------------------------------------------------------------
+r61 | roseg | 2009-06-29 17:53:55 +0200 (Mon, 29 Jun 2009) | 13 lines
+
+Release 2.4.5
+
+Stable release 2.4.5
+
+Enhancements:
+    - log back-end killed/disabled/enabled (thanks to Joe Gooch and Jon Garvin)
+    - kill a BE on connection failure only if it has no HAport defined (thanks to Albert); the request may still fail!
+
+Bug fixes:
+    - fixed parantheses problems in need_rewrite (thanks to SBR)
+    - added call to free_headers in http.c (thanks to SBR)
+    - fixed maximal path length in UNIX domain sockets (thanks to Ricardo Gameiro)
+
+------------------------------------------------------------------------
+r60 | roseg | 2009-01-14 17:39:52 +0100 (Wed, 14 Jan 2009) | 18 lines
+
+Release 2.4.4
+
+Stable release 2.4.4
+
+Enhancements:
+    - added support for UNSUBSCRIBE and NOTIFY in xHTTP 3 and 4
+    - added support for BPROPFIND in xHTTP 4
+    - on SSL connections always pass the cipher used to the back-end (thanks to Magnus Sandin)
+
+Bug fixes:
+    - save and restore errno value in cur_time() (thanks to Albert)
+    - fixed problem in timer thread (thanks to Albert)
+    - added shutdown for failed socket connection (thanks to Albert)
+    - fixed problem with CC containing spaces in Makefile.in (thanks to Elan Ruusamäe)
+    - increased MAXBUF to default 4096
+    - increased T_RSA default to 30 minutes
+    - fixed a problem with Unix sockets back-ends (thanks to Ricardo Gameiro)
+
+------------------------------------------------------------------------
+r59 | roseg | 2008-05-31 12:25:41 +0200 (Sat, 31 May 2008) | 11 lines
+
+Release 2.4.3
+
+Stable release 2.4.3
+
+Enhancements:
+
+Bug fixes:
+  - fixed problem in session access time updating (thanks to Piotr Jakubowski)
+  - fixed problem in session removal (thanks to Doriam Mori)
+  - fixed problem in Redirect logging (thanks to Albert)
+
+------------------------------------------------------------------------
+r58 | roseg | 2008-04-24 16:31:28 +0200 (Thu, 24 Apr 2008) | 13 lines
+
+Release 2.4.2
+
+Stable release 2.4.2
+
+Enhancements:
+
+Bug fixes:
+  - fixed problem with session TTL -1 (thanks to Scott Royston for pointing it out)
+  - fixed problem with back-end killing on failed connect
+  - fixed a small problem in the poundctl XML output (thanks to johnlr for the fix)
+  - added hints in call to getaddrinfo() (for Solaris 10 support)
+  - fixed redirection problem (missing slash in Location/Content-location)
+
+------------------------------------------------------------------------
+r57 | roseg | 2008-04-05 11:45:41 +0200 (Sat, 05 Apr 2008) | 12 lines
+
+Release 2.4.1
+
+Stable release 2.4.1
+
+Enhancements:
+  - added cache control for errors (thanks to Pavel Merdin for the suggestion)
+
+Bug fixes:
+  - fixed problem with double slash in header rewriting (thanks to Cédric P.)
+  - remove sched_policy to avoid problems on systems with poor support for it
+  - fixed memory corruption problem with HAport
+
+------------------------------------------------------------------------
+r56 | roseg | 2008-02-11 12:53:51 +0100 (Mon, 11 Feb 2008) | 4 lines
+
+Release 2.4
+
+Stable release 2.4
+
+------------------------------------------------------------------------
+r55 | roseg | 2007-12-27 12:54:32 +0100 (Thu, 27 Dec 2007) | 7 lines
+
+Release 2.4f
+
+Enhancements:
+
+Bug fixes:
+  - fixed back-end enable/disable (priority computing)
+
+------------------------------------------------------------------------
+r54 | roseg | 2007-11-29 18:16:36 +0100 (Thu, 29 Nov 2007) | 12 lines
+
+Enhancements:
+  - added PARM session type. Old PARM is now URL
+  - allow AddHeader for HTTP listeners as well
+  - allow -1 for session (all types) TTL. Will hash the key to a fixed value
+  - Redirect takes an optional code parameter (301, 302/default or 307)
+  - new config param to allow printing the SSL certificate in a single line
+  - new config param to control the maximal size of the input line
+  - added better error messages for SSL loading problems
+
+Bug fixes:
+  - if the same cookie is defined more than once use LAST definition
+
+------------------------------------------------------------------------
+r53 | roseg | 2007-08-15 18:26:58 +0200 (Wed, 15 Aug 2007) | 10 lines
+
+Release 2.4d
+
+Enhancements:
+  - moved to GPLv3
+  - now using lh_hash for the session tables
+
+Bug fixes:
+  - allow case-sensitive matching for URLs
+  - fixed memory leak in DNS searches
+
+------------------------------------------------------------------------
+r52 | roseg | 2007-07-04 15:29:27 +0200 (Wed, 04 Jul 2007) | 10 lines
+
+Release 2.4c
+
+Enhancements:
+  - added XML output for poundctl
+  - added more detailed error messages
+
+Bug fixes:
+  - fixed problems with extra-long lines
+  - fixed problems with chunked encoding
+
+------------------------------------------------------------------------
+r51 | roseg | 2007-05-18 10:35:02 +0200 (Fri, 18 May 2007) | 11 lines
+
+Release 2.4b
+
+Enhancements:
+  - cleaned resurrection code
+  - added RR threads scheduling
+
+Bug fixes:
+  - fixed problem long lines (thanks to Rune Saetre)
+  - fixed pcreposix autoconf for systems that also require pcre
+  - fixed problem with IP session handling
+
+------------------------------------------------------------------------
+r49 | roseg | 2007-04-30 15:01:17 +0200 (Mon, 30 Apr 2007) | 11 lines
+
+Release 2.4a
+
+Enhancements:
+  - added display of configuration switches
+  - added grace period for shutdown (based on an idea from Rune Saetre)
+  - added support for IPv6 (but host caching was removed)
+
+Bug fixes:
+  - fixed test for owner/group (BSD portability)
+  - fixed problem with premature opening of control socket
+
+------------------------------------------------------------------------
+r46 | roseg | 2007-04-11 15:00:11 +0200 (Wed, 11 Apr 2007) | 8 lines
+
+Release 2.3
+
+Enhancements:
+  - added display of configuration switches
+  - added grace period for shutdown (based on an idea from Rune Saetre)
+
+Bug fixes:
+
+------------------------------------------------------------------------
+r45 | roseg | 2007-04-04 18:15:53 +0200 (Wed, 04 Apr 2007) | 8 lines
+
+Release 2.2.8
+
+Enhancements:
+  - more tweaking of the dynamic rescaling code
+  - more information in poundctl printout
+
+Bug fixes:
+
+------------------------------------------------------------------------
+r44 | roseg | 2007-03-12 18:12:14 +0100 (Mon, 12 Mar 2007) | 8 lines
+
+Release 2.2.7
+
+Enhancements:
+  - dynamic scaling is now a configuration directive (DynScale)
+  - added vhost to LogLevel 5
+
+Bug fixes:
+
+------------------------------------------------------------------------
+r43 | roseg | 2007-03-02 10:30:01 +0100 (Fri, 02 Mar 2007) | 11 lines
+
+Release 2.2.6
+
+Enhancements:
+  - added transaction time to LogLevel 5
+  - added priority display for poundctl
+
+Bug fixes:
+  - fixed problem when adding session via poundctl
+  - fixed problem in session dump to poundctl
+  - fixed problem in kill_be call to t_clean
+
+------------------------------------------------------------------------
+r42 | roseg | 2007-02-19 18:19:22 +0100 (Mon, 19 Feb 2007) | 7 lines
+
+Release 2.2.5
+
+Enhancements:
+
+Bug fixes:
+  - fixed problem with sessions (BACKEND copying)
+
+------------------------------------------------------------------------
+r41 | roseg | 2007-02-10 15:26:42 +0100 (Sat, 10 Feb 2007) | 14 lines
+
+Release 2.2.4
+
+Enhancements:
+  - modular tree library
+  - consolidated all timed functions into a single thread
+  - added gethostbyname cache
+  - added LogLevel 5 - same as 4 but with service name and back-end information (thanks to Joe Gooch for the suggestion)
+  - added session creation and removal to poundctl
+
+Bug fixes:
+  - added LOG_NDELAY to openlog()
+  - accept and immediately close connections to disabled listeners (thanks to Joe Gooch for the suggestion)
+  - fixed problem with -1 values in poundctl
+
+------------------------------------------------------------------------
+r40 | roseg | 2007-01-19 21:29:07 +0100 (Fri, 19 Jan 2007) | 5 lines
+
+Release 2.2.3
+
+Bug fixes:
+  - fixed problems in bad 2.2 release
+
+------------------------------------------------------------------------
+r39 | roseg | 2007-01-15 18:17:48 +0100 (Mon, 15 Jan 2007) | 13 lines
+
+Release 2.2.2
+
+Enhancements:
+  - changes in the dynamic rescaling
+  - doubled the session key size (for those people with insanely long cookies)
+  - added LogFacility - for logging to stdout/stderr
+  - added optional Service names
+
+Bug fixes:
+  - fixed bug in multiple HeadRemove matching
+  - fixed problem with extra large session keys
+  - fixed problem for OpenBSD accept (blocks all threads)
+
+------------------------------------------------------------------------
+r38 | roseg | 2007-01-03 18:25:30 +0100 (Wed, 03 Jan 2007) | 13 lines
+
+Release 2.2.1
+
+Enhancements:
+  - allow specific Listeners to override the gloabl LogLevel value
+  - allow a default Client value to be defined at the global level
+  - allow a default TimeOut value to be defined at the global level
+  - added compile-time flags for file owner and group
+
+Bug fixes:
+  - fixed some problems in the installation procedure
+  - fixed problem in SSL session string
+  - added protocol check in need_rewrite
+
+------------------------------------------------------------------------
+r37 | roseg | 2006-12-16 10:18:38 +0100 (Sat, 16 Dec 2006) | 45 lines
+
+Release 2.2
+
+Enhancements:
+  - added the host to LogLevel 2 (if available)
+  - added support for tcmalloc (from the Google perftools package)
+
+Bug fixes:
+  - fixed problem with the initialisation of host_mut
+
+*****************************
+Cumulative changes since 2.1:
+*****************************
+
+Enhancements:
+  - added dynamic rescaling of back-end priorities, compile-time flag to enable/disable it
+  - added support for emergency back-ends
+  - the program poundctl(8) is now available, added the Control configuration directive
+  - SESS_IP now behaves like other session types (no longer sticky)
+  - added RewriteLocation 2: rewrite location if it points to same address, but ignore port
+  - Redirect uses the original request path
+  - added RewriteDestination configuration flag to enable rewriting the Destination header
+  - removed msdav compile-time configuration flag and MSDAV configuration flag, extended xHTTP to allow for
+    WebDAV, MS-DAV and MS-RPC
+  - added CRLlist directive, split CRL from CA
+  - Error replies are sent as pure HTML
+  - split error messages into:
+    - LOG_ERR: errors (mostly fatal)
+    - LOG_WARNING: errors (non-fatal)
+    - LOG_NOTICE: problems
+    - LOG_INFO: extra information
+  - time to serve the requests is logged in LogLevel 2
+  - added the (virtual) host to LogLevel 2 (if available)
+  - added line numbers to config error messages
+  - added TCP_NODELAY for faster response times
+  - added support for tcmalloc (from the Google perftools package)
+
+Bug fixes:
+  - fixed problem in str_be (evident mostly in LogLevel 2)
+  - added 'const' wherever necessary
+  - check for errors in mutex handling
+  - fixed the verb pattern in HTTPS listeners
+  - content is now ignored only on HEAD requests
+  - fixed problems with autoconf on some systems
+  - fixed problem with the initialisation of host_mut
+
+------------------------------------------------------------------------
+r36 | roseg | 2006-12-09 09:39:23 +0100 (Sat, 09 Dec 2006) | 6 lines
+
+Release 2.1.8
+
+Bug fixes:
+  - fixed another small problem with autoconf on some systems
+  - added support for systems that don't define SOL_TCP
+
+------------------------------------------------------------------------
+r35 | roseg | 2006-12-06 18:32:16 +0100 (Wed, 06 Dec 2006) | 10 lines
+
+Release 2.1.7
+
+Enhancements:
+  - added TCP_NODELAY for faster response times
+  - added compile-time flag to enable/disable dynamic priorities rescaling
+
+Bug fixes:
+  - fixed problems with autoconf on some systems
+  - fixed error in control function (be instead of svc)
+
+------------------------------------------------------------------------
+r34 | roseg | 2006-11-04 11:28:53 +0100 (Sat, 04 Nov 2006) | 9 lines
+
+Release 2.1.6
+
+Enhancements:
+  - Redirect uses the original request path
+
+Bug fixes:
+  - improved dynamic priorities calculation
+  - fixed problem with Emergency back-ends
+
+------------------------------------------------------------------------
+r33 | roseg | 2006-10-23 09:24:28 +0200 (Mon, 23 Oct 2006) | 12 lines
+
+Release 2.1.5
+
+Enhancements:
+  - added line numbers to config error messages
+  - added dynamic rescaling of back-end priorities
+  - added support for emergency back-ends
+  - the program poundctl(8) is now available
+  - added the Control configuration directive
+
+Bug fixes:
+  - improved owner/group detection for install
+
+------------------------------------------------------------------------
+r32 | roseg | 2006-10-14 16:39:29 +0200 (Sat, 14 Oct 2006) | 6 lines
+
+Release 2.1.4
+
+Bug fixes:
+  - content is now ignored only on HEAD requests
+  - added CRLlist directive, split CRL from CA
+
+------------------------------------------------------------------------
+r31 | roseg | 2006-09-21 18:41:15 +0200 (Thu, 21 Sep 2006) | 6 lines
+
+Release 2.1.3
+
+Bug fixes:
+  - fixed the verb pattern in HTTPS listeners
+  - removed the spurious printf in cur_time
+
+------------------------------------------------------------------------
+r30 | roseg | 2006-09-18 18:12:16 +0200 (Mon, 18 Sep 2006) | 18 lines
+
+Release 2.1.2
+
+Enhancements:
+  - Error replies are sent as pure HTML
+  - split error messages into:
+    - LOG_ERR: errors (mostly fatal)
+    - LOG_WARNING: errors (non-fatal)
+    - LOG_NOTICE: problems
+    - LOG_INFO: extra information
+  - removed msdav compile-time configuration flag
+  - removed MSDAV configuration flag
+  - extended xHTTP to allow for WebDAV, MS-DAV and MS-RPC
+  - added RewriteDestination configuration flag to enable rewriting the Destination header
+  - time to serve the requests is logged in LogLevel 2
+
+Bug fixes:
+  - fixed (again) the RewriteRedirect 2 mode
+
+------------------------------------------------------------------------
+r29 | roseg | 2006-09-11 18:35:22 +0200 (Mon, 11 Sep 2006) | 11 lines
+
+Release 2.1.1
+
+Enhancements:
+  - SESS_IP now behaves like other session types (no longer sticky)
+  - added RewriteLocation 2: rewrite location if it points to same address, but ignore port
+
+Bug fixes:
+  - fixed problem in str_be (evident mostly in LogLevel 2)
+  - added 'const' wherever necessary
+  - check for errors in mutex handling
+
+------------------------------------------------------------------------
+r27 | roseg | 2006-08-05 11:35:52 +0200 (Sat, 05 Aug 2006) | 24 lines
+
+Release 2.1
+
+Enhancements:
+  - support for pcre library (if available) for much better performance
+  - support for hoard library (if available) for much better performance
+  - rewrite Location and Content-location headers for all responses
+  - improved detection of when is a rewrite necessary
+  - renamed Change30x to RewriteLocation. Default: on
+
+Bug fixes:
+  - fixed small problem in the upd_session() code
+  - declared init_RSAgen() as void everywhere
+  - moved to SESS_xxx tokens to avoid Solaris name conflict
+  - added #ifdef's for LOG_FTP and LOG_AUTHPRIV
+  - fixed problem in URL checking
+  - fixed problem in session tracking-code and session updating
+  - fixed LogLevel 3 to show that the v_host is unknown
+  - fixed headers checking in match_service
+  - fixed problem in ClientCert directive handling
+  - fixed potential memory leak in AUTH decoding
+  - allow OPTIONS WebDAV request to have content
+  - replaced inet_ntoa with inet_ntop where available
+  - removed all static buffers
+
+------------------------------------------------------------------------
+r25 | roseg | 2006-02-01 10:00:42 +0100 (Wed, 01 Feb 2006) | 14 lines
+
+Release 2.0
+
+Enhancements:
+    - new configuration file syntax, offering significant improvements.
+    - the ability to define listener-specific back-ends. In most cases
+      this should eliminate the need for multiple Pound instances.
+    - a new type of back-end: the redirector allows you to respond with
+      a redirect without involving any back-end server.
+    - most "secondary" properties (such as error messages, client
+      time-out, etc.) are now private to listeners.
+    - HAport has an optional address, different from the main back-end
+    - added a -V flag for version
+    - session keeping on a specific Header
+
+------------------------------------------------------------------------
+r21 | roseg | 2006-02-01 14:27:19 +0100 (Wed, 01 Feb 2006) | 15 lines
+
+Release 1.10
+
+Enhancements:
+    added NoDaemon configuration directive (replaces compile-time switch)
+    added LogFacility configuration directive (replaces compile-time switch)
+    added user name logging
+
+Bug fixes:
+    fixed problem with the poll() code
+    fixed problem with empty list in gethostbyname()
+    added call to setsid() if daemon
+    conflicting headers are removed (Content-length - Transfer-encoding)
+
+Last release in the 1.x series.
+
+------------------------------------------------------------------------
+r19 | roseg | 2005-06-01 15:27:19 +0200 (Wed, 01 Jun 2005) | 18 lines
+
+Release 1.9
+
+Enhancements:
+- Added the VerifyList configuration flag (CA root certs + CRL)
+- CRL checking code
+- RewriteRedirect 2 - ignores port value for host matching
+- Added -c flag (check-only mode)
+- Added -v flag (verbose mode)
+- Added -p flag for pid file name
+
+Bug fixes:
+- fixed a potential buffer overflow problem (in checking the Host header)
+- added call to SSL_library_init
+- added a check for MSIE before forcing SSL shutdown
+- X-SSL-Cipher header is added only if HTTPSHeaders is non-zero
+- added code for shorter linger on badly closed connections (IE work-around)
+- fixed the locking for session checking (mutex_lock/unlock)
+
+------------------------------------------------------------------------
+r17 | roseg | 2004-11-04 14:27:19 +0100 (Thu, 04 Nov 2004) | 23 lines
+
+Release 1.8
+
+Changes:
+- added support for non-blocking connect(2)
+- added support for 414 - Request URI too long
+- added RedirectRewrite directive - to prevent redirect changes
+- added support for NoHTTPS11 value 2 (for MSIE clients only)
+- added support for HTTPSHeaders 3 (no verify)
+
+Problems fixed:
+- fixed bug if multiple listening ports/addresses
+- fixed memory leak in SSL
+- flush stdout (if used) after each log message
+- assumes only 304, 305 and 306 codes to have no content
+- fixed problem with delays in 302 without content
+- fixed problem with time-outs in HTTPS
+
+Enhancements:
+- improved threads detection code in autoconf
+- added supervisor process disable configuration flag
+- tweak for the Location rewriting code (only look at current GROUP)
+- improved print-out for client certificate information
+
+------------------------------------------------------------------------
+r15 | roseg | 2004-03-24 14:27:19 +0100 (Wed, 24 Mar 2004) | 12 lines
+
+Release 1.7
+
+Fixed bug in X-SSL-CIPHER description
+Changed README to stx format for consistency
+Addedd X-SSL-certificate with full client certificate
+Improved the response times on HTTP/0.9 (content without Content-length)
+Improved response granularity on above - using unbuffered BIO now
+Fixed problem with IE/SSL (SSL_set_shutdown)
+Avoid error messages on premature EOF from client
+Fixed HeadRemove code so all headers are checked without exception
+Improved autoconf detection
+
+------------------------------------------------------------------------
+r13 | roseg | 2003-11-30 14:27:19 +0100 (Sun, 30 Nov 2003) | 15 lines
+
+Release 1.6
+
+Callback for RSA ephemeral keys:
+    - generated in a separate thread
+    - used if required (IE 5.0?)
+New X-SSL-cipher header encryption level/method
+Added CheckURL parameter in config file
+    - perform syntax check only if value 1 (default 0)
+Allow for empty query/param strings in URL syntax
+Additional SSL engine loading code
+Added parameter for CA certificates
+    - CA list is sent to client
+Verify client certificates up to given depth
+Fixed vulnerability in syslog handling
+
+------------------------------------------------------------------------
+r11 | roseg | 2003-10-14 15:27:19 +0200 (Tue, 14 Oct 2003) | 19 lines
+
+Release 1.5
+
+Session by Basic Authentication:
+    Session BASIC parameter added
+Syntax checking of request.
+User-defined request character set(s):
+    Parameters CSsegment, CSparameter, CSqid, CSqval
+Request size limit:
+    Parameter MaxRequest
+Single log function rather than #ifdefs.
+Added LogLevel 4 (same as 3 but without the virtual host info).
+Added HeadRemove directive (allows to delete a header from requests).
+Location rewriting on redirect:
+    if  the request contains a Header directive
+        and the response is codes 301, 302, 303, 307
+        and the Location in the response is to a known host
+    then the Location header in the response will be rewritten to point
+        to the Pound protocol/port itself
+
+------------------------------------------------------------------------
+r9 | roseg | 2003-04-24 15:27:19 +0200 (Thu, 24 Apr 2003) | 12 lines
+
+Release 1.4
+
+Added 'Server' configuration directive
+Fixed problem with HTTPSHeaders 0 "..." - the desired header is written even if HTTPSHeaders is 0
+Added the ability of loading a certificate chain.
+Added compatability with OpenSSL 0.9.7
+Added user-definable error pages.
+Added compile-time flags to run in foreground and to log to stderr.
+Opens separate pid files per-process.
+Improved autoconf.
+Some SSL speed optimisations.
+
+------------------------------------------------------------------------
+r7 | roseg | 2003-02-19 14:27:19 +0100 (Wed, 19 Feb 2003) | 10 lines
+
+Release 1.3
+
+Added support for OpenSSL Engine (crypto hardware)
+Added support for Subversion WebDAV
+Added support for mandatory client certificates
+Added X-SSL-serial header for SSL connections
+Fixed problem with BIO_pending in is_readable
+Fixed problem with multi-threading in OpenSSL
+Improved autoconf
+
+------------------------------------------------------------------------
+r5 | roseg | 2003-01-20 14:27:19 +0100 (Mon, 20 Jan 2003) | 5 lines
+
+Release 1.2
+
+Better handling of "100 Continue" responses
+Fixed problem with allowed character set for requests
+
+------------------------------------------------------------------------
+r3 | roseg | 2003-01-09 14:27:19 +0100 (Thu, 09 Jan 2003) | 9 lines
+
+Better auto-conf detection
+LogLevel 3 for Apache-like log (Combined Log Format)
+Don't ask client for certificate if no SSL headers required
+Added handling for 'Connection: closed' header
+Added monitor process to restart worker process if crashed
+Added possibility to listen on all interfaces
+Fixed HeadDeny code
+Fixed problem with threads on *BSD
+
+------------------------------------------------------------------------
+r1 | roseg | 2002-10-31 14:27:19 +0100 (Thu, 31 Oct 2002) | 1 line
+
+Initial import
+------------------------------------------------------------------------
diff --git a/FAQ b/FAQ
new file mode 100755 (executable)
index 0000000..3c31544
--- /dev/null
+++ b/FAQ
@@ -0,0 +1,395 @@
+FREQUENTLY ASKED QUESTIONS
+
+1. General
+==========
+
+1.1 Will Pound run my Web application?
+
+    No. Pound is a proxy, not a Web server - it does not deliver content by
+    itself. It is just the middle-man between a client and a server.
+
+1.2 Will Pound make my server go faster?
+
+    No. Pound is just a proxy - no caching of any kind takes place. Pound
+    IS able to distribute requests between several back-end servers, thus
+    allowing for faster overall response times, but it won't speed-up a
+    single Web sever.
+
+1.3 Will Pound make my server more secure?
+
+    Probably yes. Pound has its own checks on the validity of HTTP requests
+    and often catches malicious requests that are used to attack Web servers.
+
+1.4 Can I use Pound to change/rewrite/redirect requests?
+
+    No. Pound tries to be as transparent as possible - ideally a client
+    should not be aware that there is anything between itself and the actual
+    Web server. A limited form of redirect is available - see the man page.
+
+1.5 Can I use Pound to deny certain requests?
+
+    Yes. Pound has a rather good mechanism for classifying requests and it
+    can deny/reject certain requests based on URL and/or header content.
+
+
+2. Configuration, Compilation and Installation
+==============================================
+
+2.1 I try to compile and it fails on "needs OpenSSL with thread support"
+
+    Pound is a multi-threaded program and it needs an OpenSSL library
+    compiled with thread support (optional in the OpenSSL configuration and
+    absent in some default installations, such as *BSD). If your default
+    library does not support threads you must install a thread-enabled
+    version.
+
+2.2 Pound compiles correctly but crashes on *BSD
+
+    On some of the newer versions of *BSD (FreeBSD 5.x, OpenBSD 3.x) the
+    Pound autoconf may not correctly recognize the threading library. Add
+    manually to the generated Makefile the option -DNEED_STACK in the
+    CFLAGS.
+
+2.3 I want to run Pound with daemon-tools but it goes to background
+
+    You need to configure Pound for non-daemon operations: add "Daemon 0"
+    to the config file.
+
+2.4 Pound runs OK but some normal requests are rejected with "bad URL"
+
+    Pound checks the requested URLs quite thoroughly and rejects malformed
+    or illegal URLs - or at least illegal according to the RFCs. See the
+    man page for details.
+
+2.5 Pound runs OK but I get a "pthread_create" error message
+
+    You may be hitting the system limit on the number of processes. On
+    systems that implement threads as processes (as Linux does) you should
+    make sure that the Pound process has permission to start a sufficient
+    number of processes.
+
+    In some rare cases you may be running into the system limit on the
+    number of threads. Check your system details for the value of
+    PTHREAD_THREADS_MAX. If needed you must recompile the threads library
+    with a higher value.
+
+2.6 What resources does Pound need/use?
+
+    That depends very much on your system. On some systems, such as Linux
+    and System V (AIX, HP-UX, etc), threads are implemented as processes,
+    which means you must allow enough processes to run. On other systems,
+    such as *BSD, where threads are implemented in user space (in-process),
+    you should make sure that Pound can use sufficient memory for all the
+    threads and that the process is allowed to use enough file descriptors
+    (2 per active connection). Finally, on systems that implement threads
+    natively, such as Solaris, you need to make sure that enough threads
+    and open file descriptors are allowed.
+
+2.7 Is NPTL supported?
+
+    Theoretically Pound will work with any POSIX-compliant threads package.
+    In practice some of the newer NPTL implementations still have some
+    bugs. At least on Linux running Pound with LD_ASSUME_KERNEL=2.4.19
+    may be helpful.
+
+
+3. Virtual Hosts
+================
+
+3.1 How do I redirect specific virtual hosts to specific back-ends?
+
+    Make the virtual host mandatory in the UrlGroup. For example, to have
+    all requests to www.a.com go to 192.168.0.10 and all requests for
+    www.b.com go to 192.168.0.20, define
+
+        Service
+            HeadRequire "Host:.*www.a.com.*"
+            BackEnd
+                Address 192.168.0.10
+                Port    80
+            End
+        End
+
+        Service
+            HeadRequire "Host:.*www.b.com.*"
+            BackEnd
+                Address 192.168.0.20
+                Port    80
+            End
+        End
+
+    in your config file.
+
+3.2 How do I redirect requests to specific back-ends based on the client
+    address?
+
+    You can do it easier via the packet filter you use. If you insist on
+    having Pound do it use a combination of port redirection and separate
+    instances of Pound for each port. For example, assume you want intranet
+    clients (on 192.168.100.0/24) to use the server at 192.168.1.10 and
+    external clients go to 192.168.1.20. Do the following:
+
+        - redirect requests from 192.168.100.0/24 to port 8080
+
+            pf: rdr on rl0 from 192.168.100.0/24 to 192.168.100.1 port 80 \
+                -> localhost port 8080
+
+            netfilter: iptables -t nat -A PREROUTING -p tcp \
+                -s 192.168.100.0/24 --dport 80 -i eth0 -j DNAT \
+                --to localhost:8080
+
+        - redirect requests from anywhere else to port 8081
+
+            pf: rdr on rl0 from any to 192.168.100.1 port 80 \
+                -> localhost port 8081
+
+            netfilter: iptables -t nat -A PREROUTING -p tcp \
+                --dport 80 -i eth0 -j DNAT --to localhost:8081
+
+        - have a Pound listener on port 8080 and sending the
+          requests to 192.168.1.10
+
+        - have a Pound listener on port 8081 and sending the
+          requests to 192.168.1.20
+
+3.3 What happens when my server replies with a redirect?
+
+    Depending on configuration, Pound can watch for redirect replies from back-ends
+    and change them to the correct address. In order for this to happen the
+    following conditions must be met:
+
+    - Pound has "Check30x 1"
+    - the back-end replies with a redirect. The address of that URL resolves to
+      the same address as the one Pound is listening on or the address of the
+      back-end itself.
+
+    This feature is commonly used when Pound serves as a HTTPS wrapper,
+    as the backend redirect to "Location: http://x.y.com" is rewritten as
+    "Location: https://x.y.com".
+
+
+4. HTTPS
+========
+
+4.1 Can I have Pound force HTTPS connections to certain URLs/back-ends?
+
+    Yes - define a Service with a Redirect back-end.
+
+4.2 How can I do virtual hosting with HTTPS?
+
+    The simple answer is that neither you, nor anybody else can, due to a
+    limitation of the HTTPS protocol. In its simplest form an HTTPS (SSL)
+    connection goes through the following stages:
+
+    - negotiation: the client contacts the server, receives a certificate
+      from it, and negotiates the protocol details (cipher parameters, etc).
+
+    - authentication: the client checks that the certificate received matches
+      the server it wanted and validates that the certificate is correct as
+      attested by some certificate authority.
+
+    - request/response: normal HTTP, encrypted in transit.
+
+    As you can see the certificate is sent before any request was received.
+    Unfortunately, the first request specifies the virtual host that the
+    client would like to talk to - and it may not match the server name in
+    the certificate.
+
+4.3 Pound does not start with message "can't read private key"
+
+    The file you specify in the ListenHTTPS directive must contain both the
+    server certificate and the private key to it in PEM format. See the man
+    page for SSL_CTX_use_PrivateKey_file(3) for details.
+
+4.4 How can a back-end know that the connection is via HTTPS?
+
+    Pound can add a header for incoming requests indicating that they were
+    received via HTTPS. See the details on AddHeader in the man page.
+
+4.5 HTTPS connections fail when Pound runs chrooted
+
+    The OpenSSL library requires access to /dev/urandom for its random seed.
+    The normal device is not accessible in a jail root. You should add a
+    link to the device to make it accessible. On Linux this would be:
+
+        mknod /var/pound/dev/urandom c 1 9
+
+    assuming that /var/pound is the root jail.
+
+4.6 How can I force a back-end to generate the correct URL with HTTPS
+
+    There is no simple answer to this question - each server and application
+    have their own way of doing things. If your server does not use absolute
+    paths then all is well - things will run out of the box. However if some
+    frames, images, links or a base tag are generated with an absolute path
+    you must find a way to force the generation with https://.
+
+4.7 How can I find out about the client certificate in my application?
+
+    For requests via HTTPS connections Pound can add the details of the
+    client certificate as headers to each and every request it passes to
+    the back-end. See the details on HTTPSHeaders in the man page.
+
+4.8 Can Pound use my crypto accelerator hardware?
+
+    Pound supports the OpenSSL engine architecture. If your crypto card is
+    supported by OpenSSL then it is supported by Pound. See the SSLEngine
+    directive in the man page.
+
+4.9 Can Pound use HTTPS back-end servers?
+
+    Yes, but that is not always a very good idea. Such a setup would essentially
+    make Pound into a "man-in-the-middle" program. Even worse, the certificates
+    on the back-end would become meaningless - they are seen only by Pound.
+
+
+5. Session tracking
+===================
+
+5.1 Can I have session tracking based on URL and/or Cookie?
+
+    Pound can track sessions based on client IP address, a cookie, an URL
+    parameter or BasicAuthentication. These options are mutually exclusive -
+    only one of them can be used per UrlGroup.
+
+5.2 When does a session expire?
+
+    A session is kept for the specified number of seconds. If during this
+    time no new request was received the session is discarded.
+
+5.3 Does Pound create/track its own sessions?
+
+    No. Pound does not add anything to the requests or the responses - it
+    uses the tokens generated by the back-end servers exclusively.
+
+
+6. Logging
+==========
+
+6.1 Can I use Webalizer on Pound log files?
+
+    Yes. If you use LogLevel 3 or 4 Pound uses one of the standard log
+    formats that are recognized by applications such as Webalizer. You will
+    have to remove the time-stamp generated by the syslog - see cut(1) for
+    details.
+
+6.2 How do I log the original client address in the back-end log?
+
+    Pound adds the X-Forwarded-for header with the original client address
+    to every request. Use it for your logs on the back-end servers.
+
+6.3 How can I separate the Pound log from other syslog messages?
+
+    If you use the syslog facility you can configure it to send the pound
+    messages to a separate file. You may want to separate by severity as
+    well - normal log messages use LOG_INFO, everything else is not request
+    information. See syslogd(8) for details on how to configure it.
+
+6.4 How can I separate error messages from normal log messages?
+
+    If you use syslog: normal requests are logged at LOG_INFO, everything
+    else is higher.
+
+    If you run without syslog: normal request logging to stdout, everything
+    else to stderr.
+
+6.5 Why does Pound not log anything when chrooted?
+
+    On some systems you need access to /dev/log in order to use the syslog(8)
+    facility. Create/link the device as needed in the root jail you use.
+
+6.6 Why can't Pound log directly to a file?
+
+    This is a security requirement. As things stand, Pound does not write at
+    all to the disk. The existing tools - such as syslog - allow all the
+    flexibility one could wish for.
+
+    If you absolutely must you can try the patches from Shinji Tanaka (see
+    http://www.hatena-inc.co.jp/~stanaka/pound/ for details).
+
+
+7. WebDAV
+=========
+
+7.1 I compiled Pound with DAV support but it still rejects the requests
+
+    You also need to define "WebDAV 1" in your config file, and (depending on
+    your server or application) "xHTTP 1" as well.
+
+7.3 Can I use Pound as a front-end for Subversion?
+
+    Yes. You may have some problems with using it via HTTPS, but HTTP should
+    work.
+
+
+8. Zope
+=======
+
+8.1 What configurations is Pound most helpful for?
+
+    If you have several servers running on top of a ZEO server, Pound will
+    allow you to load-balance between them (BTW, this was the original
+    motivation for developing Pound). Pound also makes for a very good,
+    light-weight front-end for a single Zope - exposing the Zope Web-server
+    directly on the big, bad Internet is not a very good idea.
+
+8.2 Can I have virtual hosts in Zope without Apache?
+
+    Yes. Despite persistent rumors, the Virtual Host Monster works perfectly
+    well on its own (dark incantations at midnight under the shade of the
+    cross-shaped oak branch are NOT required). All you need to do is to
+    add a VHM in the Zope root, click on the Mappings tab and add whatever
+    hosts you need.
+
+8.3 Can I have HTTPS for Zope?
+
+    Yes. Pound will happily pass SSL requests to Zope. You have three possible
+    methods to force Zope to generate responses with the https:// prefix:
+
+    - if all you need is a specific area to be accessible only through HTTPS
+      you can add a SiteRoot with the correct name.
+
+    - alternately the Pound distribution includes patches for z2.py that
+      include a new -y flag for a "https://" port.
+
+    - finally, for version 2.7 or later you can set it in zope.conf.
+
+8.4 Can I force HTTPS for certain areas in Zope?
+
+    Yes. Add a check for the SSL-specific headers in the dtml_header or
+    whatever equivalent you use. See the details on HTTPSHeaders in the man
+    page.
+
+
+9. Miscellaneous/MS
+===================
+
+9.1 IE fails to connect to Pound via HTTPS
+
+    Define the ciphers to be
+    
+        "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
+
+    in the config file. We have had reports of IE problems with other
+    ciphers.
+
+9.2 IE has big delays in getting replies from Pound
+
+    Try a shorter Client timeout. IE uses exactly 4 sockets, and as long as
+    they stay open it won't do anything else. A short Client value will
+    force the socket(s) to be closed earlier, thus avoiding annoying waits.
+
+9.3 I try to run MS OWA and Pound rejects the requests
+
+    Make sure you configured Pound with --enable-msdav. Make sure you
+    included "WebDAV 1" in the config file. Pray that MS would adhere to
+    some known standard. Repeat as necessary.
+
+9.4 How can I force OWA to accept HTTPS requests?
+
+    Make sure to define
+
+        AddHeader   "Front-End-Https: on"
+
+    in the config file. This will force OWA to generate the responses with
+    the correct protocol.
diff --git a/GPL.txt b/GPL.txt
new file mode 100755 (executable)
index 0000000..94a9ed0
--- /dev/null
+++ b/GPL.txt
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Makefile.in b/Makefile.in
new file mode 100755 (executable)
index 0000000..5723651
--- /dev/null
@@ -0,0 +1,84 @@
+# Pound - the reverse-proxy load-balancer
+# Copyright (C) 2002-2010 Apsis GmbH
+#
+# This file is part of Pound.
+#
+# Pound is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# Pound is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# Contact information:
+# Apsis GmbH
+# P.O.Box
+# 8707 Uetikon am See
+# Switzerland
+# EMail: roseg@apsis.ch
+
+CC=@PTHREAD_CC@
+VERSION="@PACKAGE_VERSION@"
+C_SSL="@C_SSL@"
+C_T_RSA="@C_T_RSA@"
+C_MAXBUF="@C_MAXBUF@"
+C_OWNER="@C_OWNER@"
+C_GROUP="@C_GROUP@"
+C_SUPER="@C_SUPER@"
+C_CERT1L="@C_CERT1L@"
+
+CFLAGS=-DF_CONF=\"$(F_CONF)\" -DVERSION=\"${VERSION}\" -DC_SSL=\"${C_SSL}\" -DC_T_RSA=\"${C_T_RSA}\" \
+       -DC_MAXBUF=\"${C_MAXBUF}\" -DC_OWNER=\"${C_OWNER}\" -DC_GROUP=\"${C_GROUP}\" \
+    -DC_SUPER=\"${C_SUPER}\" -DC_CERT1L=\"${C_CERT1L}\" @CFLAGS@ @PTHREAD_CFLAGS@ @CPPFLAGS@
+LIBS=@LIBS@ @PTHREAD_LIBS@
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+
+# Configuration file default; if none, look at config.c for default!
+F_CONF=@sysconfdir@/pound.cfg
+
+OBJS=pound.o http.o config.o svc.o
+
+all:   pound poundctl pound.8
+
+pound: $(OBJS)
+               ${CC} @LDFLAGS@ -o pound $(OBJS) $(LIBS)
+
+poundctl:      poundctl.o
+               ${CC} @LDFLAGS@ -o poundctl poundctl.o $(LIBS)
+
+dh512.h:
+               openssl dhparam -5 -C -noout 512 > dh512.h
+
+dh1024.h:
+               openssl dhparam -5 -C -noout 1024 > dh1024.h
+
+$(OBJS) poundctl.o:    pound.h config.h
+
+svc.o:         svc.c dh512.h dh1024.h
+               ${CC} ${CFLAGS} -c -o svc.o svc.c
+
+install:       all
+               @INSTALL@ -d ${DESTDIR}@sbindir@
+               @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 555 pound ${DESTDIR}@sbindir@/pound
+               @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 555 poundctl ${DESTDIR}@sbindir@/poundctl
+               @INSTALL@ -d ${DESTDIR}@mandir@/man8
+               @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 644 pound.8 ${DESTDIR}@mandir@/man8/pound.8
+               @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 644 poundctl.8 ${DESTDIR}@mandir@/man8/poundctl.8
+
+clean:
+               rm -f pound $(OBJS) poundctl poundctl.o
+               rm -f dh512.h dh1024.h
+
+distclean:     clean
+               -rm -f config.h config.log config.status Makefile
+
+uninstall:
+               -rm -f @sbindir@/pound @sbindir@/poundctl @mandir@/man8/pound.8 @mandir@/cat8/pound.8 @mandir@/man8/poundctl.8 @mandir@/cat8/poundctl.8
diff --git a/README b/README
new file mode 100755 (executable)
index 0000000..f65e65f
--- /dev/null
+++ b/README
@@ -0,0 +1,908 @@
+POUND - REVERSE-PROXY AND LOAD-BALANCER
+
+    The Pound program is a reverse proxy, load balancer and
+    HTTPS front-end for Web server(s). Pound was developed
+    to enable distributing the load among several Web-servers
+    and to allow for a convenient SSL wrapper for those Web
+    servers that do not offer it natively. Pound is distributed
+    under the GPL - no warranty, it's free to use, copy and
+    give away.
+
+
+WHAT POUND IS:
+
+    1.  a reverse-proxy: it passes requests from client
+        browsers to one or more back-end servers.
+
+    2.  a load balancer: it will distribute the requests from
+        the client browsers among several back-end servers,
+        while keeping session information.
+
+    3.  an SSL wrapper: Pound will decrypt HTTPS requests
+        from client browsers and pass them as plain HTTP
+        to the back-end servers.
+
+    4.  an HTTP/HTTPS sanitizer: Pound will verify requests
+        for correctness and accept only well-formed ones.
+
+    5.  a fail over-server: should a back-end server fail,
+        Pound will take note of the fact and stop passing
+        requests to it until it recovers.
+
+    6.  a request redirector: requests may be distributed
+        among servers according to the requested URL.
+
+    Pound is a very small program, easily audited for security
+    problems. It can run as setuid/setgid and/or in a chroot
+    jail. Pound does not access the hard-disk at all (except
+    for reading certificate file(s) on start, if required)
+    and should thus pose no security threat to any machine.
+
+
+WHAT POUND IS NOT:
+
+    1.  Pound is not a Web server: by itself, Pound serves no
+        content - it contacts the back-end server(s) for that
+        purpose.
+
+    2.  Pound is not a Web accelerator: no caching is done -
+        every request is passed "as is" to a back-end server.
+
+
+STATUS
+
+    As of release 1.0 Pound is declared to be production-quality code.
+
+    Quite a few people have reported using Pound successfully in production
+    environments. The largest volume reported to date is a site with an
+    average of about 30M requests per day, peaking at over 600 requests/sec.
+
+    Pound was successfully used in production with a variety of Web servers,
+    including Apache, IIS, Zope, WebLogic, Jakarta/Tomcat, iPlanet, etc. In
+    general Pound passes requests and responses back and forth unchanged,
+    so we have no reason to think that any web server would be incompatible.
+
+    Client browsers that were tested:
+
+    - IE 5.0/5.5 (Windows) HTTP/HTTPS
+
+    - Netscape 4.7 (Windows/Linux) HTTP/HTTPS
+
+    - Mozilla (Windows/Linux) HTTP/HTTPS
+
+    - Konqueror (Linux) HTTP/HTTPS
+
+    - Galleon (Linux) HTTP/HTTPS
+
+    - Opera (Linux/Windows) HTTP/HTTPS
+
+    - Lynx (Linux) HTTP
+
+    Given that Pound is in production and no problems were reported, we have
+    no reason to believe that other browsers would present a problem. A few
+    issues were observed with problematic SSL implementations, most notably
+    with Opera 6, but these should be OK in the present version.
+
+
+INSTALLATION
+
+    Probably the easiest way to install Pound is to use a pre-compiled package
+    if you can find one. While Apsis offers no such packages, they are available
+    for quite a few systems (Suse, Debian and derivatives such as Ubuntu), as
+    well as some private packages:
+
+    - RPMs for RedHat are available at http://www.invoca.ch/pub/packages/pound/
+
+    - A nice FreeBSD live-CD distribution is available at http://www.targeted.org as
+    http://www.targeted.org/files/fbsd62_pound23.iso.gz, including a Pound binary.
+
+    Failing that you should install from sources:
+
+    1.  Pound was tested on Linux, Solaris and OpenBSD, but
+        it should work unchanged on just about any modern
+        Unix-like system. You will require at least OpenSSL and
+        libpthread. The PCRE package is strongly recommended.
+
+        Warning: as Pound is a multi-threaded program it requires
+        a version of OpenSSL with thread support. This is normally
+        the case on Linux and Solaris (for example) but not on *BSD.
+        If your system has the wrong library please download, compile
+        and install OpenSSL (from http://www.openssl.org).
+
+        If the PCRE package is available Pound will link against it.
+        This will provide a significant performance boost.
+
+    2.  Download the current version of Pound-current file and unpack
+        it. The archive is signed.
+        My signature is available at http://www.apsis.ch/pound/roseg.asc.
+        Alternately see below for stable versions.
+
+        Unpack. Do the usual thing:
+
+            ./configure
+
+    3.  The following options are available for the configure script:
+
+        --with-ssl=ssl_dir -- OpenSSL home directory (default: system defined).
+
+        --disable-super -- disable supervisor process (default: enabled)
+
+        --with-t_rsa=nnn   -- timeout of the RSA ephemeral keys regeneration
+        (default: 1800 seconds).
+
+        --with-owner=owner -- name of installed binaries owner (default is
+        system-dependent).
+
+        --with-group=group -- name of installed binaries group (default is
+        system-dependent).
+
+    4.  Check that the resulting Makefile is correct and possibly
+        adjust flags as needed on your system. Compile:
+
+            make
+
+    5.  If it works, you may want to do some testing before installing.
+
+    6.  Install the executable somewhere (it's likely that
+        /usr/local/sbin would make a good choice), as well
+        as the manual page (pound.8 -> /usr/local/man/man8).
+        The supplied Makefile will do it for you.
+
+    7.  Make sure Pound gets started on boot. Read the man
+        page for available options and examples.
+
+
+COPYRIGHT
+
+    Pound is copyrighted by Apsis GmbH and is distributed under
+    the terms of the GNU Public License with the additional
+    exemption that compiling, linking, and/or using OpenSSL is
+    allowed. Basically, this means that you can use it free of
+    charge, copy it, distribute it (provided the copyright is
+    maintained and the full package is distributed), modify it,
+    or line a bird-cage with it.
+
+    We would be happy to hear from you if you use it and
+    suggestions and improvements are gladly accepted.
+
+
+CONTACT
+
+    Robert Segall, roseg@apsis.ch
+
+    Apsis GmbH, http://www.apsis.ch
+
+    P O Box
+
+    CH-8707 Uetikon am See
+
+    Switzerland
+
+    +41-44-920 4904
+
+
+MAILING LIST
+
+    Pound has its own mailing list now: please send a message with
+    the subject "subscribe" to pound@apsis.ch in order to
+    subscribe. You will receive confirmation and instructions in
+    the reply.
+
+    All messages are available and indexed (searcheable) in the
+    archive http://www.apsis.ch/pound/pound_list.
+
+    The mailing list is the primary support forum for Pound - please
+    post there any questions you may have. The developpers' address is
+    given here for information purposes only.
+
+
+
+ZOPE
+
+    A special note for Zope users: the original intent on
+    developing Pound was to allow distributing the load
+    among several Zope servers running on top of ZEO. This
+    it does.
+
+    A special problem arises when you try using Pound as an
+    SSL wrapper: Zope assumes that the requests are made via
+    HTTP and insists on prepending 'http://' to the (correct)
+    address in the replies, including in the <base> tag and
+    the absolute URLs it generates (for images for example).
+    This is clearly an undesirable behavior.
+
+    For older Zope versions (prior to 2.7): a modified z2.py (as
+    well as a patch) is included in the distribution. The main
+    difference is that this z2.py allows starting an additional
+    HTTP server via the -y flag that sets the environment
+    HTTPS variable - thus correcting the problem. That means
+    that in order to use Pound as an SSL wrapper you need to:
+
+    - start Zope (modify the 'start' file) as:
+
+        python -X -w 8080 -y 8443 ...
+
+    For Zope 2.7 or later the same effect can be achieved via suitable
+    modifications to zope.conf.
+
+
+
+VIRTUAL HOSTS (IN GENERAL)
+
+    Some people asked about the possibility of redirecting requests to back-ends
+    as per some virtual hosts definition. While I believe this is not Pound's
+    job, it can be done. As of version 0.10, Pound supports filtering requests
+    based not only on the request URL, but also on the presence or absence of
+    certain headers.
+
+    Let's assume that you have internal server 192.168.0.10 that is supposed to
+    serve the needs of virtual host www.server0.com and 192.168.0.11 that serves
+    www.server1.com.  You want Pound to listen on address 1.2.3.4 and separate
+    the requests to each host.  The config file would look something like this:
+
+        ListenHTTP
+            Address 1.2.3.4
+            Port    80
+
+            Service
+                HeadRequire "Host: .*www.server0.com.*"
+
+                BackEnd
+                    Address 192.168.0.10
+                    Port    80
+                End
+            End
+
+            Service
+                HeadRequire "Host: .*www.server1.com.*"
+
+                BackEnd
+                    Address 192.168.0.11
+                    Port    80
+                End
+            End
+        End
+
+    (add whatever else is necessary) or, if you want even safer filtering:
+
+        ListenHTTP
+            Address 1.2.3.4
+            Port    80
+
+            Service
+                HeadRequire "Host: .*www.server0.com.*"
+                HeadDeny    "Host: .*www.server1.com.*"
+
+                BackEnd
+                    Address 192.168.0.10
+                    Port    80
+                End
+            End
+
+            Service
+                HeadRequire "Host: .*www.server1.com.*"
+                HeadDeny    "Host: .*www.server0.com.*"
+
+                BackEnd
+                    Address 192.168.0.11
+                    Port    80
+                End
+            End
+        End
+
+    This is NOT recommended (I personally believe that virtual hosts should be
+    implemented in the back-end servers - putting this in a proxy
+    is a major security kludge) but it works.
+
+
+
+VIRTUAL HOSTS AND HTTPS
+
+    Quite often we get inquiries about Pound's ability to do virtual hosting
+    with HTTPS. In order to lay this matter to rest, let me say:
+
+        HTTPS does not allow virtual hosting!
+
+    This is not a limitation of Pound, but of HTTPS - no Web server or proxy
+    are able to do it due to the nature of the beast.
+
+    In order to see why this is the case we need to look at the way HTTPS works.
+    Basically there are three stages in any HTTPS connection:
+
+    1.  Connection negotiation - the client (your browser) and the server (Web
+        server or proxy) negotiate the basic parameters: ciphers to use, session
+        key, etc.
+
+    2.  Connection authentication: at the very least the server presents the
+        client with a certificate that says "I am server www.encrypted.com - and
+        certificate.authority.org will verify that". The client may also present
+        a certificate of its own at this stage.
+
+    3.  Request/response cycle: normal HTTP is sent (through the encrypted
+        channel) back and forth.
+
+    The vital point to notice here is that connection authentication takes place
+    BEFORE any request was issued.
+
+    On the other hand, the way virtual hosting works is for the client to
+    specify in the request to which server it would like to talk. This is
+    accomplished via a Host header:
+
+        GET /index.html HTTP/1.1
+        Host: http://www.virthost.com
+
+    Combining the two we get to an impasse: on connection setup the server will
+    reply with the certificate for "www.realhost.com", but the request is really
+    for "www.virthost.com" - and most browsers will scream blue murder (as well
+    they should) if the two do not match.
+
+    There is a new twist on this however: some of the newer browsers will accept
+    so-called "wild-card certificates". This is a specially crafted certificate
+    that is not issued to a host, but rather to a domain. The result is that
+    on setting-up a new SSL connection, the server replies not with "I am
+    www.encrypted.com", but with "I am *.encrypted.com". If the browser is
+    capable of processing this type of certificate then the connection is
+    set up and normal HTTPS (with www.encrypted.com or special.encrypted.com or
+    even some.other.server.encrypted.com or whatever other name matches) proceeds
+    as usual. Pound supports these certificates and you can use virtual hosts in
+    the normal way.
+
+    Update June 2010: starting with the 2.6 series, Pound has SNI support, if your
+    OpenSSL version supports it. Basically you supply Pound with several certificates,
+    one for each virtual host (wild card certificates - as described above - are
+    allowed). On connecting the client signals to which server it wants to talk,
+    and Pound searches among its certificates which would fit. Not all versions
+    of OpenSSL and not all clients support this mode, but if available it allows
+    for virtual hosts over HTTPS.
+
+    An additional option is to use a semi-official TLS extension, the so called
+    alternate subject name. If your version of OpenSSL supports it you may specify
+    in one certificate several alternate server names. This requires support for a
+    special TLS feature, and nor all clients accept it.
+
+
+
+VIRTUAL HOSTS IN ZOPE
+
+    For reasons I can't quite grasp, it seems that a lot of Zope
+    users are convinced that virtual hosts are only possible through
+    the Apache/VHM combination and that it requires some kind of
+    magic incantation at midnight in order to work (I won't even
+    start on the virgin sacrifices).
+
+    The simple fact is that VHM and the Apache VirtualHost directives
+    (as well as various tricks through mod_rewrite and mod_proxy) are
+    (almost) mutually exclusive: they perform exactly the same
+    functions and, leaving aside the logging issues, are used
+    independently of each other.  Let me repeat that: you may use the
+    VHM without Apache - just click on the VHM mappings tab and add
+    whatever virtual host you wish. From this moment on any request
+    to that host will be mapped back and forth by Zope to the required
+    URL. This works weather you access Zope directly or via any number
+    of proxies on the way, Pound included.
+
+    To test: add a new host name to your /etc/hosts file, making it an
+    alias for localhost - something like::
+
+        127.0.0.1 localhost www.testhost.mine
+
+    Add a mapping in VHM from www.testhost.mine to some Zope folder
+    (Examples is already there). Point your browser to http://localhost
+    and you get the normal Zope start page; point it to
+    http://www.testhost.mine and you'll see the Examples starting page.
+    All requests are mapped correctly, and the URLs in the pages (such
+    as base or absoluteURL) are translated correctly in the response.
+
+
+SESSIONS
+
+    Pound has the ability to keep track of sessions between a client
+    browser and a back-end server. Unfortunately, HTTP is defined as
+    a stateless protocol, which complicates matters: many schemes have
+    been invented to allow keeping track of sessions, none of which works
+    perfectly. Even worse, sessions are critical in order to allow
+    web-based applications to function correctly - it is vital that once
+    a session is established all subsequent requests from the same browser
+    be directed to the same back-end server.
+
+    Six possible ways of detecting a session have been implemented in
+    Pound (hopefully the most useful ones): by client address, by Basic
+    authentication (user id/password), by URL parameter, by cookie, by
+    HTTP parameter and by header value.
+
+    - by client address: in this scheme Pound directs all requests from
+      the same client IP address to the same back-end server. Put the
+      lines
+      
+      Session
+        Type    IP
+        TTL     300
+      End
+      
+      in the configuration file to achieve this effect. The value indicates
+      what period of inactivity is allowed before the session is discarded.
+
+    - by Basic Authentication: in this scheme Pound directs all requests from
+      the same user (as identified in the Basic Authentication header) to the
+      same back-end server. Put the lines
+
+      Session
+        Type    Basic
+        TTL     300
+      End
+      
+      in configuration file to achieve this effect. The value indicates what
+      period of inactivity is allowed before the session is discarded.
+
+      WARNING: given the constraints of the HTTP protocol it may very well be
+      that the authenticated request will go to a different back-end server than
+      the one originally requesting it. Make sure all your servers support
+      the same authentication scheme!
+
+    - by URL parameter: quite often session information is passed through URL
+      parameters (the browser is pointed to something like http://xxx?id=123).
+      Put the lines
+
+      Session
+        Type    URL
+        ID      "id"
+        TTL     300
+      End
+
+      to support this scheme and the sessions will be tracked based on the value
+      of the "id" parameter.
+
+    - by cookie value: applications that use this method pass a certain cookie
+      back and forth. Add the lines
+      
+      Session
+        Type    Cookie
+        ID      "sess"
+        TTL     300
+      End
+
+      to your configuration file - the sessions will be tracked by the value of
+      the "sess" cookie.
+
+    - by HTTP parameter value: applications that use this method pass an HTTP
+      parameter (http://x.y/z;parameter) back and forth. Add the lines
+      
+      Session
+        Type    PARM
+        TTL     300
+      End
+
+      to your configuration file - the sessions will be tracked by the value of
+      the parameter.
+
+    - by header value: applications that use this method pass a certain header
+      back and forth. Add the lines
+      
+      Session
+        Type    Header
+        ID      "X-sess"
+        TTL     300
+      End
+
+      to your configuration file - the sessions will be tracked by the value of
+      the "X-sess" header.
+
+    Please note the following restrictions on session tracking:
+
+    - session tracking is always associated with a certain Service. Thus each
+      group may have other methods and parameters.
+
+    - there is no default session: if you have not defined any sessions no
+      session tracking will be done.
+
+    - only one session definition is allowed per Service. If your application
+      has alternative methods for sessions you will have to define a separate
+      Service for each method.
+
+    A note on cookie injection: some applications have no session-tracking mechanism at
+    all but would still like to have the client always directed to the same back-end
+    time after time. Some reverse proxies use a mechanism called "cookie injection" in
+    order to achieve this: a cookie is added to the back-end responses and tracked by the
+    reverse proxy.
+
+    Pound was designed to be as transparent as possible, and this mechanism is not
+    supported. If you really need this sort of persistent mapping use the client address
+    session mechanism (Session Type IP), which achieves the same result without
+    changing the contents in any way.
+
+
+REQUEST LOGGING
+
+    As a general rule, Pound passes all headers as they arrive from the client
+    browser to the back-end server(s). There are two exceptions to this rule:
+    Pound may add information about the SSL client certificate (as described
+    below), and it will add an X-Forwarded-For header. The general format is:
+
+        X-Forwarded-for: client-IP-address
+
+    The back-end server(s) may use this extra information in order to create
+    their log-files with the real client address (otherwise all requests will
+    appear to originate from Pound itself, which is rather useless).
+
+    In addition, Pound logs requests and replies to the system log. This is
+    controlled by the LogLevel configuration variable (0 - no logging,
+    1 - normal log, 2 - full log, 3 - Apache combined log format, 4 - Apache
+    combined log format without virtual host).
+
+    By default the messages go to the LOG_DAEMON facility, but you can change
+    this in the configuration file. If you don't want to, you can just do a:
+
+        fgrep pound /var/log/messages
+
+    to get all the messages generated by Pound.
+
+
+HTTPS CERTIFICATES
+
+    If a client browser connects via HTTPS and if it presents a
+    certificate and if HTTPSHeaders is set, Pound will obtain the
+    certificate data and add the following HTTP headers to the
+    request it makes to the server:
+
+    - X-SSL-Subject: information about the certificate owner
+
+    - X-SSL-Issuer: information about the certificate issuer (CA)
+
+    - X-SSL-notBefore: begin validity date for the certificate
+
+    - X-SSL-notAfter: end validity date for the certificate
+
+    - X-SSL-serial: certificate serial number (in decimal)
+
+    - X-SSL-cipher: the cipher currently in use
+
+    - X-SSL-certificate: the full client certificate (multi-line)
+
+    It is the application's responsibility to actually use these
+    headers - Pound just passes this information without checking
+    it in any way (except for signature and encryption correctness).
+
+    Please note that this mechanism allows forgeries: a client may
+    (maliciously) send these headers to Pound in order to masquerade
+    as an SSL client with a specific certificate. If this is a problem
+    for your application make sure to deny these requests. Add:
+
+        HeadDeny "X-SSL-Subject:.*"
+        HeadDeny "X-SSL-Issuer:.*"
+        HeadDeny "X-SSL-notBefore:.*"
+        HeadDeny "X-SSL-notAfter:.*"
+        HeadDeny "X-SSL-serial:.*"
+        HeadDeny "X-SSL-cipher:.*"
+
+    within the Service(s).
+
+
+THREADS AND LIMITS
+
+    A few people ran into problems when installing Pound because of the
+    various threading models and how they interact with system-imposed
+    limits. Please keep in mind the following requirements:
+
+    - on most System V derived Unices (of which Linux up to 2.4 is one),
+      a thread is a process. This means that when doing a 'ps' you will see
+      as many processes with the name 'pound' as there are active threads.
+      Each such process uses only two file descriptors, but the system needs
+      to support the required number of processes, both in total and per
+      user (possibly also per process group). In bash, this is 'ulimit -u',
+      in csh this is 'limit maxproc'.
+
+    - on BSD style systems all threads run in the same process space. Do
+      a ps and you see a single 'pound' process. The process needs two
+      file descriptors per active request (bash: 'ulimit -n', csh
+      'limit maxfiles'/'limit openfiles').
+
+    - on most systems the thread library comes with a built-in limit on the
+      maximal number of concurrent threads allowed - on older systems it usually
+      is 1024, on newer systems quite a bit higher. In very
+      rare cases (very high load and long response times) you may run into
+      this limitation - the symptom is log messages saying "can't create
+      thread". Your only solution is to recompile the system threads library
+      (and possibly the kernel itself) with a higher limit.
+
+    Please note that your kernel needs to be configured to support the
+    required resources - the above are just the shell commands.
+
+SIMILAR SYSTEMS
+
+    Quite a few people asked "What is wrong with Apache/Squid/
+    stunnel/your_favorite? Do we really need another proxy
+    system?". The simple answer is that there is nothing wrong -
+    they are all excellent systems that do their jobs very well.
+    The reasoning behind Pound is however slightly different:
+
+    - In my experience, a load-balancer may easily become a
+      bottle-neck in itself. If you have a heavily loaded site,
+      there are few things more depressing than seeing your
+      "load-balancer" slow down the entire network. This means that
+      the load-balancer should be kept as light-weight as possible.
+
+    - Security: auditing a large system for security issues is a
+      major undertaking for anybody (ask Bill Gates about it). This
+      implies that in order to avoid introducing new vulnerabilities
+      into a system (after all, your installation is only as secure
+      as its weakest component) the proxy/load-balancer should be
+      kept as small as possible.
+
+    - Protection: I assume Pound will be the only component exposed
+      to the Internet - your back-end servers will run in a protected
+      network behind it. This means that Pound should filter requests
+      and make sure only valid, correctly formed ones are passed to the
+      back-end servers, thus protecting them from malicious clients.
+
+    Taking these criteria into consideration, it is easy to see why
+    the other systems mentioned above do not fit:
+
+    - Apache (with mod_proxy and mod_backhand): great system, but very
+      large. Imposes a significant load on the system, complex set-up
+      procedure (and it is so easy to get it wrong: check how many Apache
+      servers allow proxying from and to external hosts). While Apache
+      has proven remarkably exploit free, I wouldn't wish to go into a
+      security audit for the tens of thousands of lines of code involved,
+      not to mention all the additional modules.
+
+    - Squid: great caching proxy, but even should load-balancing
+      features become available in the future, do you really need
+      caching on the load-balancer? After all, Pound can easily run on a
+      disk-less system, whereas with Squid you'd better prepare a high
+      throughput RAID. Squid is still perfectly usable as a caching
+      proxy between Pound and the actual Web server, should it lack
+      its own cache (which Zope happily has).
+
+    - stunnel: probably comes closest to my understanding of software
+      design (does one job only and does it very well). However, it
+      lacks the load balancing and HTTP filtering features that I
+      considered necessary. Using stunnel in front of Pound (for HTTPS)
+      would have made sense, except that integrating HTTPS into Pound
+      proved to be so simple that it was not worth the trouble.
+
+    - your favourite system: let me know how it looks in light of the
+      above criteria - I am always interested in new ideas.
+
+
+DEDICATED SERVERS
+
+    Some people asked about the possibility of dedicating specific
+    back-end servers to some clients - in other words, if a request
+    originates from a certain IP address or group of addresses then
+    it should be sent to a specific group of back-end servers.
+
+    Given the ease with which IP addresses can be forged I am personally
+    doubtful of the utility of such a feature. Even should you think it
+    desirable, it is probably best implemented via the packet filter,
+    rather than a proxy server. Assuming that requests from x.com are
+    to go to s1.local, requests from y.com to s2.local and everything
+    else to s3.local and s4.local, here is how to do it:
+
+    - make sure your firewall blocks requests to port 8080, 8081 and 8082
+
+    - configure Pound as follows:
+
+        ListenHTTP
+            Address 127.0.0.1
+            Port    8080
+
+            Service
+                BackEnd
+                    Address s1.local
+                    Port    80
+                End
+            End
+        End
+
+        ListenHTTP
+            Address 127.0.0.1
+            Port    8081
+
+            Service
+                BackEnd
+                    Address s2.local
+                    Port    80
+                End
+            End
+        End
+
+        ListenHTTP
+            Address 127.0.0.1
+            Port    8082
+
+            Service
+                BackEnd
+                    Address s3.local
+                    Port    80
+                End
+                BackEnd
+                    Address s4.local
+                    Port    80
+                End
+            End
+        End
+
+    - have your packet filter redirect requests to the right local ports
+      based on the origin address. In OpenBSD pf syntax this would be
+      something like:
+
+        rdr on rl0 from x.com to myhost.com port 80 -> localhost port 8080
+        rdr on rl0 from y.com to myhost.com port 80 -> localhost port 8081
+        rdr on rl0 from any to myhost.com port 80 -> localhost port 8082
+
+      or in Linux iptables::
+
+        iptables -t nat -A PREROUTING -p tcp -s x.com --dport 80 -i eth0 \
+            -j DNAT --to 127.0.0.1:8080
+        iptables -t nat -A PREROUTING -p tcp -s y.com --dport 80 -i eth0 \
+            -j DNAT --to 127.0.0.1:8081
+        iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT \
+            --to 127.0.0.1:8082
+
+    This would give you the desired effect and probably better
+    performance than a purely proxy-based solution (though the
+    performance improvement is debatable, at least on Linux).
+
+
+WebDAV
+
+    As of version 1.0 Pound supports the full WebDAV command-set. In
+    fact, it has been tested and is known to (almost) work with the
+    Microsoft Outlook Web Gateway, which is quite remarkable given that
+    Microsoft's own proxy does not.
+
+    Regrettably, Microsoft adherence to standards leaves something to be
+    desired: they decided to add some characters to their URLs - thus
+    breaking a whole set of RFC's.
+
+    Rather then change Pound to accept these characters (which could create
+    some serious issues with security on other systems) we have made this
+    behaviour dependent on a configuration switch: xHTTP (see the man page
+    for details).
+
+    If you also use the SSL wrapper feature in front of a Microsoft server
+    you should probably also add 'AddHeader "Front-End-Https: on"'.
+
+    These changes are also required to access a Subversion server via
+    Pound.
+
+
+OTHER ISSUES
+
+    The following problems were reported by various people who use pound:
+
+    - delays in loading pages when the client browser is IE 5.5 (possibly
+      limited to W2K/XP). It seems that IE opens exactly 4 connections (sockets)
+      to the server and keeps them open until some time-out or until the server
+      closes the connection. This works fine, unless you redirect IE to another
+      server - given that all 4 sockets are used IE waits for a while before
+      the redirect is actually performed.
+
+      Solution: use the directive "Client 1" to ensure that Pound closes
+      sockets very early, thus freeing the necessary resources. Experiment with
+      the time-out - as it may cause problems with slow connections.
+
+    - Pound fails to start; HTTPS is enabled and the message "can't read
+      private key from file xxx" appears in the log.
+
+      Solution: make sure that the certificate file includes:
+
+      - (optional) a chain of certificates from a known certificate authority to
+        your server certificate
+
+      - the server certificate
+
+      - the private key; the key may NOT be password-protected
+
+      The file should be in PEM format. The OpenSSL command to generate a
+      self-signed certificate in the correct format would be something like::
+
+        openssl req -x509 -newkey rsa:1024 -keyout test.pem -out test.pem \
+            -days 365 -nodes
+
+      Note the '-nodes' flag - it's important!
+
+    - Pound fails to operate correctly with SSL when RootJail is specified.
+      Solution: OpenSSL requires access to /dev/urandom, so make sure such a
+      device is accessible from the root jail directory. Thus if your root
+      jail is something like /var/pound:
+
+        mkdir /var/pound/dev
+        mknod /var/pound/dev/urandom c 1 9
+
+      or whatever major/minor number are appropriate for your system.
+
+    - In chroot mode logging may stop functioning.
+      Solution: make sure /dev and the root jail are on the same filesystem
+      and create a hard link in the root jail to /dev/log:
+
+        mkdir /chroot/jail/dev
+        ln /dev/log /chroot/jail/dev/log
+
+      Alternately you can have syslog (or syslog-ng) listen on another
+      socket - see the man page for details.
+
+    - In chroot mode name resolution (and especially redirects) may stop
+      functioning.  Solution: make sure your resolver works correctly in the
+      jail. You probably need copies of /etc/resolv.conf and (at least part)
+      of /etc/hosts. Depending on your system additional files may be required
+      check your resolver man page for details. Should name resolution fail the
+      translation of host names to IP addresses would fail, thereby defeating
+      the mechanism Pound uses to identify when should a Redirect be rewritten.
+
+    - IE 5.x fails to work (correctly or at all) with Pound in HTTPS mode.
+      Solution: define the supported OpenSSL ciphers for IE compatibility (this
+      is really a work-around for a known IE bug):
+
+      Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
+
+      (Thanks to Andi Roedl for the tip).
+
+    - Linux-specific: some people use various redundant Pound solutions for
+      Linux which require Pound instances on separate machines to bind to the
+      same address. The default configuration of Linux does not allow a
+      program to bind() to non-local addresses, which may cause a problem.
+      Solution: add
+      
+        echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
+
+      in your start-up script, or just set
+
+        net.ipv4.ip_nonlocal_bind = 1
+
+      in /etc/sysctl.conf (if you have one).
+
+      (Thanks to RUne Saetre for the suggestion).
+
+
+ACKNOWLEDGMENTS
+
+    Albert (of Alacra) for investigating and writing the TCP_NODELAY code.
+
+    Luuk de Boer did some serious testing and debugging of the WebDAV
+    code for Microsoft servers.
+
+    Alession Cervellin packages and makes available Solaris packages for
+    various Pound versions.
+
+    David Couture found some nasty, lurking bugs, as well as contributing
+    some serious testing on big hardware.
+
+    Frank Denis contributed a few excellent code patches and some good ideas.
+
+    Dmitriy Dvoinikov makes available a live-CD FreeBSD distribution that
+    includes a Pound binary.
+
+    Abner G. Jacobsen did a lot of testing in a production environment
+    and contributed some very nice ideas.
+
+    Akira Higuchi found a significant security issue in Pound and contributed
+    the code to fix it.
+
+    Ken Lalonde contributed very useful remarks and suggestions, as well as
+    correcting a few code errors.
+
+    Phil Lodwick contributed essential parts of the high-availability code and
+    came up with some good ideas. In addition, did some serious testing under
+    heavy loads.
+
+    Simon Matter packages and makes available RPMs for various Pound versions.
+
+    Jan-Piet Mens raised some interesting security points about the HTTPS
+    implementation and brought the original idea for SSL header filtering.
+
+    Andreas Roedl for testing and some ideas about logging in root jails.
+
+    Gurkan Sengun tested Pound on Solaris, contributed the Solaris cc flags
+    and makes a Solaris pre-compiled version available on his Web-site
+    (www.linuks.mine.nu)
+
+    Shinji Tanaka contributed a patch for controlling logging to disk files.
+    This is available at http://www.hatena-inc.co.jp/~stanaka/pound/
+
+    Jim Washington contributed the code for WebDAV and tested it.
+
+    Maxime Yve discovered a nasty bug in the session tracking code and
+    contributed the patch to fix it.
+
+    All the others who tested Pound and told me about their results.
diff --git a/config.c b/config.c
new file mode 100755 (executable)
index 0000000..3f871ec
--- /dev/null
+++ b/config.c
@@ -0,0 +1,1546 @@
+/*
+ * Pound - the reverse-proxy load-balancer
+ * Copyright (C) 2002-2010 Apsis GmbH
+ *
+ * This file is part of Pound.
+ *
+ * Pound is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * Pound is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ * 
+ * Contact information:
+ * Apsis GmbH
+ * P.O.Box
+ * 8707 Uetikon am See
+ * Switzerland
+ * EMail: roseg@apsis.ch
+ */
+
+#ifndef MISS_FACILITYNAMES
+#define SYSLOG_NAMES    1
+#endif
+
+#include    "pound.h"
+
+#ifdef MISS_FACILITYNAMES
+
+/* This is lifted verbatim from the Linux sys/syslog.h */
+
+typedef struct _code {
+       char    *c_name;
+       int     c_val;
+} CODE;
+
+static CODE facilitynames[] = {
+    { "auth", LOG_AUTH },
+#ifdef  LOG_AUTHPRIV
+    { "authpriv", LOG_AUTHPRIV },
+#endif
+    { "cron", LOG_CRON },
+    { "daemon", LOG_DAEMON },
+#ifdef  LOG_FTP
+    { "ftp", LOG_FTP },
+#endif
+    { "kern", LOG_KERN },
+    { "lpr", LOG_LPR },
+    { "mail", LOG_MAIL },
+    { "mark", 0 },                  /* never used! */
+    { "news", LOG_NEWS },
+    { "security", LOG_AUTH },       /* DEPRECATED */
+    { "syslog", LOG_SYSLOG },
+    { "user", LOG_USER },
+    { "uucp", LOG_UUCP },
+    { "local0", LOG_LOCAL0 },
+    { "local1", LOG_LOCAL1 },
+    { "local2", LOG_LOCAL2 },
+    { "local3", LOG_LOCAL3 },
+    { "local4", LOG_LOCAL4 },
+    { "local5", LOG_LOCAL5 },
+    { "local6", LOG_LOCAL6 },
+    { "local7", LOG_LOCAL7 },
+    { NULL, -1 }
+};
+#endif
+
+static regex_t  Empty, Comment, User, Group, RootJail, Daemon, LogFacility, LogLevel, Alive, SSLEngine, Control;
+static regex_t  ListenHTTP, ListenHTTPS, End, Address, Port, Cert, xHTTP, Client, CheckURL;
+static regex_t  Err414, Err500, Err501, Err503, MaxRequest, HeadRemove, RewriteLocation, RewriteDestination;
+static regex_t  Service, ServiceName, URL, HeadRequire, HeadDeny, BackEnd, Emergency, Priority, HAport, HAportAddr;
+static regex_t  Redirect, RedirectN, TimeOut, Session, Type, TTL, ID, DynScale;
+static regex_t  ClientCert, AddHeader, DisableSSLv2, DisableSSLv3, SSLAllowClientRenegotiation, SSLHonorCipherOrder, Ciphers, CAlist, VerifyList, CRLlist, NoHTTPS11;
+static regex_t  Grace, Include, ConnTO, IgnoreCase, HTTPS, HTTPSCert, Disabled, Threads, CNName;
+
+static regmatch_t   matches[5];
+
+static char *xhttp[] = {
+    "^(GET|POST|HEAD) ([^ ]+) HTTP/1.[01]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE) ([^ ]+) HTTP/1.[01]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MKCALENDAR|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MKCALENDAR|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT|SUBSCRIBE|UNSUBSCRIBE|BPROPPATCH|POLL|BMOVE|BCOPY|BDELETE|BPROPFIND|NOTIFY|CONNECT) ([^ ]+) HTTP/1.[01]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MKCALENDAR|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT|SUBSCRIBE|UNSUBSCRIBE|BPROPPATCH|POLL|BMOVE|BCOPY|BDELETE|BPROPFIND|NOTIFY|CONNECT|RPC_IN_DATA|RPC_OUT_DATA) ([^ ]+) HTTP/1.[01]$",
+};
+
+static int  log_level = 1;
+static int  def_facility = LOG_DAEMON;
+static int  clnt_to = 10;
+static int  be_to = 15;
+static int  be_connto = 15;
+static int  dynscale = 0;
+static int  ignore_case = 0;
+
+#define MAX_FIN 8
+
+static FILE *f_in[MAX_FIN];
+static char *f_name[MAX_FIN];
+static int  n_lin[MAX_FIN];
+static int  cur_fin;
+
+static int
+conf_init(const char *name)
+{
+    if((f_name[0] = strdup(name)) == NULL) {
+        logmsg(LOG_ERR, "open %s: out of memory", name);
+        exit(1);
+    }
+    if((f_in[0] = fopen(name, "rt")) == NULL) {
+        logmsg(LOG_ERR, "can't open open %s", name);
+        exit(1);
+    }
+    n_lin[0] = 0;
+    cur_fin = 0;
+    return 0;
+}
+
+void
+conf_err(const char *msg)
+{
+    logmsg(LOG_ERR, "%s line %d: %s", f_name[cur_fin], n_lin[cur_fin], msg);
+    exit(1);
+}
+
+static char *
+conf_fgets(char *buf, const int max)
+{
+    int i;
+
+    for(;;) {
+        if(fgets(buf, max, f_in[cur_fin]) == NULL) {
+            fclose(f_in[cur_fin]);
+            free(f_name[cur_fin]);
+            if(cur_fin > 0) {
+                cur_fin--;
+                continue;
+            } else
+                return NULL;
+        }
+        n_lin[cur_fin]++;
+        for(i = 0; i < max; i++)
+            if(buf[i] == '\n' || buf[i] == '\r') {
+                buf[i] = '\0';
+                break;
+            }
+        if(!regexec(&Empty, buf, 4, matches, 0) || !regexec(&Comment, buf, 4, matches, 0))
+            /* comment or empty line */
+            continue;
+        if(!regexec(&Include, buf, 4, matches, 0)) {
+            buf[matches[1].rm_eo] = '\0';
+            if(cur_fin == (MAX_FIN - 1))
+                conf_err("Include nesting too deep");
+            cur_fin++;
+            if((f_name[cur_fin] = strdup(&buf[matches[1].rm_so])) == NULL)
+                conf_err("Include out of memory");
+            if((f_in[cur_fin] = fopen(&buf[matches[1].rm_so], "rt")) == NULL)
+                conf_err("can't open included file");
+            n_lin[cur_fin] = 0;
+            continue;
+        }
+        return buf;
+    }
+}
+
+/*
+ * parse a back-end
+ */
+static BACKEND *
+parse_be(const int is_emergency)
+{
+    char        lin[MAXBUF];
+    BACKEND     *res;
+    int         has_addr, has_port;
+    struct hostent      *host;
+    struct sockaddr_in  in;
+    struct sockaddr_in6 in6;
+
+    if((res = (BACKEND *)malloc(sizeof(BACKEND))) == NULL)
+        conf_err("BackEnd config: out of memory - aborted");
+    memset(res, 0, sizeof(BACKEND));
+    res->be_type = 0;
+    res->addr.ai_socktype = SOCK_STREAM;
+    res->to = is_emergency? 120: be_to;
+    res->conn_to = is_emergency? 120: be_connto;
+    res->alive = 1;
+    memset(&res->addr, 0, sizeof(res->addr));
+    res->priority = 5;
+    memset(&res->ha_addr, 0, sizeof(res->ha_addr));
+    res->url = NULL;
+    res->next = NULL;
+    has_addr = has_port = 0;
+    pthread_mutex_init(&res->mut, NULL);
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&Address, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(get_host(lin + matches[1].rm_so, &res->addr)) {
+                /* if we can't resolve it assume this is a UNIX domain socket */
+                res->addr.ai_socktype = SOCK_STREAM;
+                res->addr.ai_family = AF_UNIX;
+                res->addr.ai_protocol = 0;
+                if((res->addr.ai_addr = (struct sockaddr *)malloc(sizeof(struct sockaddr_un))) == NULL)
+                    conf_err("out of memory");
+                if((strlen(lin + matches[1].rm_so) + 1) > UNIX_PATH_MAX)
+                    conf_err("UNIX path name too long");
+                res->addr.ai_addrlen = strlen(lin + matches[1].rm_so) + 1;
+                res->addr.ai_addr->sa_family = AF_UNIX;
+                strcpy(res->addr.ai_addr->sa_data, lin + matches[1].rm_so);
+                res->addr.ai_addrlen = sizeof( struct sockaddr_un );
+            }
+            has_addr = 1;
+        } else if(!regexec(&Port, lin, 4, matches, 0)) {
+            switch(res->addr.ai_family) {
+            case AF_INET:
+                memcpy(&in, res->addr.ai_addr, sizeof(in));
+                in.sin_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in, sizeof(in));
+                break;
+            case AF_INET6:
+                memcpy(&in6, res->addr.ai_addr, sizeof(in6));
+                in6.sin6_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in6, sizeof(in6));
+                break;
+            default:
+                conf_err("Port is supported only for INET/INET6 back-ends");
+            }
+            has_port = 1;
+        } else if(!regexec(&Priority, lin, 4, matches, 0)) {
+            if(is_emergency)
+                conf_err("Priority is not supported for Emergency back-ends");
+            res->priority = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&TimeOut, lin, 4, matches, 0)) {
+            res->to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&ConnTO, lin, 4, matches, 0)) {
+            res->conn_to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&HAport, lin, 4, matches, 0)) {
+            if(is_emergency)
+                conf_err("HAport is not supported for Emergency back-ends");
+            res->ha_addr = res->addr;
+            if((res->ha_addr.ai_addr = (struct sockaddr *)malloc(res->addr.ai_addrlen)) == NULL)
+                conf_err("out of memory");
+            memcpy(res->ha_addr.ai_addr, res->addr.ai_addr, res->addr.ai_addrlen);
+            switch(res->addr.ai_family) {
+            case AF_INET:
+                memcpy(&in, res->ha_addr.ai_addr, sizeof(in));
+                in.sin_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->ha_addr.ai_addr, &in, sizeof(in));
+                break;
+            case AF_INET6:
+                memcpy(&in6, res->addr.ai_addr, sizeof(in6));
+                in6.sin6_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in6, sizeof(in6));
+                break;
+            default:
+                conf_err("HAport is supported only for INET/INET6 back-ends");
+            }
+        } else if(!regexec(&HAportAddr, lin, 4, matches, 0)) {
+            if(is_emergency)
+                conf_err("HAportAddr is not supported for Emergency back-ends");
+            lin[matches[1].rm_eo] = '\0';
+            if(get_host(lin + matches[1].rm_so, &res->ha_addr)) {
+                /* if we can't resolve it assume this is a UNIX domain socket */
+                res->addr.ai_socktype = SOCK_STREAM;
+                res->ha_addr.ai_family = AF_UNIX;
+                res->ha_addr.ai_protocol = 0;
+                if((res->ha_addr.ai_addr = (struct sockaddr *)strdup(lin + matches[1].rm_so)) == NULL)
+                    conf_err("out of memory");
+                res->addr.ai_addrlen = strlen(lin + matches[1].rm_so) + 1;
+            } else switch(res->ha_addr.ai_family) {
+            case AF_INET:
+                memcpy(&in, res->ha_addr.ai_addr, sizeof(in));
+                in.sin_port = (in_port_t)htons(atoi(lin + matches[2].rm_so));
+                memcpy(res->ha_addr.ai_addr, &in, sizeof(in));
+                break;
+            case AF_INET6:
+                memcpy(&in6, res->ha_addr.ai_addr, sizeof(in6));
+                in6.sin6_port = (in_port_t)htons(atoi(lin + matches[2].rm_so));
+                memcpy(res->ha_addr.ai_addr, &in6, sizeof(in6));
+                break;
+            default:
+                conf_err("Unknown HA address type");
+            }
+        } else if(!regexec(&HTTPS, lin, 4, matches, 0)) {
+            if((res->ctx = SSL_CTX_new(SSLv23_client_method())) == NULL)
+                conf_err("SSL_CTX_new failed - aborted");
+            SSL_CTX_set_app_data(res->ctx, res);
+            SSL_CTX_set_verify(res->ctx, SSL_VERIFY_NONE, NULL);
+            SSL_CTX_set_mode(res->ctx, SSL_MODE_AUTO_RETRY);
+            SSL_CTX_set_options(res->ctx, SSL_OP_ALL);
+#ifdef SSL_OP_NO_COMPRESSION
+            SSL_CTX_set_options(res->ctx, SSL_OP_NO_COMPRESSION);
+#endif
+            SSL_CTX_clear_options(res->ctx, SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION);
+            SSL_CTX_clear_options(res->ctx, SSL_OP_LEGACY_SERVER_CONNECT);
+            sprintf(lin, "%d-Pound-%ld", getpid(), random());
+            SSL_CTX_set_session_id_context(res->ctx, (unsigned char *)lin, strlen(lin));
+            SSL_CTX_set_tmp_rsa_callback(res->ctx, RSA_tmp_callback);
+            SSL_CTX_set_tmp_dh_callback(res->ctx, DH_tmp_callback);
+        } else if(!regexec(&HTTPSCert, lin, 4, matches, 0)) {
+            if((res->ctx = SSL_CTX_new(SSLv23_client_method())) == NULL)
+                conf_err("SSL_CTX_new failed - aborted");
+            SSL_CTX_set_app_data(res->ctx, res);
+            lin[matches[1].rm_eo] = '\0';
+            if(SSL_CTX_use_certificate_chain_file(res->ctx, lin + matches[1].rm_so) != 1)
+                conf_err("SSL_CTX_use_certificate_chain_file failed - aborted");
+            if(SSL_CTX_use_PrivateKey_file(res->ctx, lin + matches[1].rm_so, SSL_FILETYPE_PEM) != 1)
+                conf_err("SSL_CTX_use_PrivateKey_file failed - aborted");
+            if(SSL_CTX_check_private_key(res->ctx) != 1)
+                conf_err("SSL_CTX_check_private_key failed - aborted");
+            SSL_CTX_set_verify(res->ctx, SSL_VERIFY_NONE, NULL);
+            SSL_CTX_set_mode(res->ctx, SSL_MODE_AUTO_RETRY);
+            SSL_CTX_set_options(res->ctx, SSL_OP_ALL);
+#ifdef SSL_OP_NO_COMPRESSION
+            SSL_CTX_set_options(res->ctx, SSL_OP_NO_COMPRESSION);
+#endif
+            SSL_CTX_clear_options(res->ctx, SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION);
+            SSL_CTX_clear_options(res->ctx, SSL_OP_LEGACY_SERVER_CONNECT);
+            sprintf(lin, "%d-Pound-%ld", getpid(), random());
+            SSL_CTX_set_session_id_context(res->ctx, (unsigned char *)lin, strlen(lin));
+            SSL_CTX_set_tmp_rsa_callback(res->ctx, RSA_tmp_callback);
+            SSL_CTX_set_tmp_dh_callback(res->ctx, DH_tmp_callback);
+        } else if(!regexec(&Disabled, lin, 4, matches, 0)) {
+            res->disabled = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&End, lin, 4, matches, 0)) {
+            if(!has_addr)
+                conf_err("BackEnd missing Address - aborted");
+            if((res->addr.ai_family == AF_INET || res->addr.ai_family == AF_INET6) && !has_port)
+                conf_err("BackEnd missing Port - aborted");
+            return res;
+        } else {
+            conf_err("unknown directive");
+        }
+    }
+
+    conf_err("BackEnd premature EOF");
+    return NULL;
+}
+
+/*
+ * parse a session
+ */
+static void
+parse_sess(SERVICE *const svc)
+{
+    char        lin[MAXBUF], *cp, *parm;
+
+    parm = NULL;
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&Type, lin, 4, matches, 0)) {
+            if(svc->sess_type != SESS_NONE)
+                conf_err("Multiple Session types in one Service - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            cp = lin + matches[1].rm_so;
+            if(!strcasecmp(cp, "IP"))
+                svc->sess_type = SESS_IP;
+            else if(!strcasecmp(cp, "COOKIE"))
+                svc->sess_type = SESS_COOKIE;
+            else if(!strcasecmp(cp, "URL"))
+                svc->sess_type = SESS_URL;
+            else if(!strcasecmp(cp, "PARM"))
+                svc->sess_type = SESS_PARM;
+            else if(!strcasecmp(cp, "BASIC"))
+                svc->sess_type = SESS_BASIC;
+            else if(!strcasecmp(cp, "HEADER"))
+                svc->sess_type = SESS_HEADER;
+            else
+                conf_err("Unknown Session type");
+        } else if(!regexec(&TTL, lin, 4, matches, 0)) {
+            svc->sess_ttl = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&ID, lin, 4, matches, 0)) {
+            if(svc->sess_type != SESS_COOKIE && svc->sess_type != SESS_URL && svc->sess_type != SESS_HEADER)
+                conf_err("no ID permitted unless COOKIE/URL/HEADER Session - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if((parm = strdup(lin + matches[1].rm_so)) == NULL)
+                conf_err("ID config: out of memory - aborted");
+        } else if(!regexec(&End, lin, 4, matches, 0)) {
+            if(svc->sess_type == SESS_NONE)
+                conf_err("Session type not defined - aborted");
+            if(svc->sess_ttl == 0)
+                conf_err("Session TTL not defined - aborted");
+            if((svc->sess_type == SESS_COOKIE || svc->sess_type == SESS_URL || svc->sess_type == SESS_HEADER)
+            && parm == NULL)
+                conf_err("Session ID not defined - aborted");
+            if(svc->sess_type == SESS_COOKIE) {
+                snprintf(lin, MAXBUF - 1, "Cookie[^:]*:.*[ \t]%s=", parm);
+                if(regcomp(&svc->sess_start, lin, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("COOKIE pattern failed - aborted");
+                if(regcomp(&svc->sess_pat, "([^;]*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("COOKIE pattern failed - aborted");
+            } else if(svc->sess_type == SESS_URL) {
+                snprintf(lin, MAXBUF - 1, "[?&]%s=", parm);
+                if(regcomp(&svc->sess_start, lin, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("URL pattern failed - aborted");
+                if(regcomp(&svc->sess_pat, "([^&;#]*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("URL pattern failed - aborted");
+            } else if(svc->sess_type == SESS_PARM) {
+                if(regcomp(&svc->sess_start, ";", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("PARM pattern failed - aborted");
+                if(regcomp(&svc->sess_pat, "([^?]*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("PARM pattern failed - aborted");
+            } else if(svc->sess_type == SESS_BASIC) {
+                if(regcomp(&svc->sess_start, "Authorization:[ \t]*Basic[ \t]*", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("BASIC pattern failed - aborted");
+                if(regcomp(&svc->sess_pat, "([^ \t]*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("BASIC pattern failed - aborted");
+            } else if(svc->sess_type == SESS_HEADER) {
+                snprintf(lin, MAXBUF - 1, "%s:[ \t]*", parm);
+                if(regcomp(&svc->sess_start, lin, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("HEADER pattern failed - aborted");
+                if(regcomp(&svc->sess_pat, "([^ \t]*)", REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                    conf_err("HEADER pattern failed - aborted");
+            }
+            if(parm != NULL)
+                free(parm);
+            return;
+        } else {
+            conf_err("unknown directive");
+        }
+    }
+
+    conf_err("Session premature EOF");
+    return;
+}
+
+/*
+ * basic hashing function, based on fmv
+ */
+static unsigned long
+t_hash(const TABNODE *e)
+{
+    unsigned long   res;
+    char            *k;
+
+    k = e->key;
+    res = 2166136261;
+    while(*k)
+        res = ((res ^ *k++) * 16777619) & 0xFFFFFFFF;
+    return res;
+}
+
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+static IMPLEMENT_LHASH_HASH_FN(t, TABNODE)
+#else
+static IMPLEMENT_LHASH_HASH_FN(t_hash, const TABNODE *)
+#endif
+static int
+t_cmp(const TABNODE *d1, const TABNODE *d2)
+{
+    return strcmp(d1->key, d2->key);
+}
+
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+static IMPLEMENT_LHASH_COMP_FN(t, TABNODE)
+#else
+static IMPLEMENT_LHASH_COMP_FN(t_cmp, const TABNODE *)
+#endif
+
+
+/*
+ * parse a service
+ */
+static SERVICE *
+parse_service(const char *svc_name)
+{
+    char        lin[MAXBUF];
+    SERVICE     *res;
+    BACKEND     *be;
+    MATCHER     *m;
+    int         ign_case;
+
+    if((res = (SERVICE *)malloc(sizeof(SERVICE))) == NULL)
+        conf_err("Service config: out of memory - aborted");
+    memset(res, 0, sizeof(SERVICE));
+    res->sess_type = SESS_NONE;
+    res->dynscale = dynscale;
+    pthread_mutex_init(&res->mut, NULL);
+    if(svc_name)
+        strncpy(res->name, svc_name, KEY_SIZE);
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+    if((res->sessions = LHM_lh_new(TABNODE, t)) == NULL)
+#else
+    if((res->sessions = lh_new(LHASH_HASH_FN(t_hash), LHASH_COMP_FN(t_cmp))) == NULL)
+#endif
+        conf_err("lh_new failed - aborted");
+    ign_case = ignore_case;
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&URL, lin, 4, matches, 0)) {
+            if(res->url) {
+                for(m = res->url; m->next; m = m->next)
+                    ;
+                if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("URL config: out of memory - aborted");
+                m = m->next;
+            } else {
+                if((res->url = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("URL config: out of memory - aborted");
+                m = res->url;
+            }
+            memset(m, 0, sizeof(MATCHER));
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&m->pat, lin + matches[1].rm_so, REG_NEWLINE | REG_EXTENDED | (ign_case? REG_ICASE: 0)))
+                conf_err("URL bad pattern - aborted");
+        } else if(!regexec(&HeadRequire, lin, 4, matches, 0)) {
+            if(res->req_head) {
+                for(m = res->req_head; m->next; m = m->next)
+                    ;
+                if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRequire config: out of memory - aborted");
+                m = m->next;
+            } else {
+                if((res->req_head = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRequire config: out of memory - aborted");
+                m = res->req_head;
+            }
+            memset(m, 0, sizeof(MATCHER));
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&m->pat, lin + matches[1].rm_so, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("HeadRequire bad pattern - aborted");
+        } else if(!regexec(&HeadDeny, lin, 4, matches, 0)) {
+            if(res->deny_head) {
+                for(m = res->deny_head; m->next; m = m->next)
+                    ;
+                if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadDeny config: out of memory - aborted");
+                m = m->next;
+            } else {
+                if((res->deny_head = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadDeny config: out of memory - aborted");
+                m = res->deny_head;
+            }
+            memset(m, 0, sizeof(MATCHER));
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&m->pat, lin + matches[1].rm_so, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("HeadDeny bad pattern - aborted");
+        } else if(!regexec(&Redirect, lin, 4, matches, 0)) {
+            if(res->backends) {
+                for(be = res->backends; be->next; be = be->next)
+                    ;
+                if((be->next = (BACKEND *)malloc(sizeof(BACKEND))) == NULL)
+                    conf_err("Redirect config: out of memory - aborted");
+                be = be->next;
+            } else {
+                if((res->backends = (BACKEND *)malloc(sizeof(BACKEND))) == NULL)
+                    conf_err("Redirect config: out of memory - aborted");
+                be = res->backends;
+            }
+            memset(be, 0, sizeof(BACKEND));
+            be->be_type = 302;
+            be->priority = 1;
+            be->alive = 1;
+            pthread_mutex_init(& be->mut, NULL);
+            lin[matches[1].rm_eo] = '\0';
+            if((be->url = strdup(lin + matches[1].rm_so)) == NULL)
+                conf_err("Redirector config: out of memory - aborted");
+            /* split the URL into its fields */
+            if(regexec(&LOCATION, be->url, 4, matches, 0))
+                conf_err("Redirect bad URL - aborted");
+            if((be->redir_req = matches[3].rm_eo - matches[3].rm_so) == 1)
+                /* the path is a single '/', so remove it */
+                be->url[matches[3].rm_so] = '\0';
+        } else if(!regexec(&RedirectN, lin, 4, matches, 0)) {
+            if(res->backends) {
+                for(be = res->backends; be->next; be = be->next)
+                    ;
+                if((be->next = (BACKEND *)malloc(sizeof(BACKEND))) == NULL)
+                    conf_err("Redirect config: out of memory - aborted");
+                be = be->next;
+            } else {
+                if((res->backends = (BACKEND *)malloc(sizeof(BACKEND))) == NULL)
+                    conf_err("Redirect config: out of memory - aborted");
+                be = res->backends;
+            }
+            memset(be, 0, sizeof(BACKEND));
+            be->be_type = atoi(lin + matches[1].rm_so);
+            be->priority = 1;
+            be->alive = 1;
+            pthread_mutex_init(& be->mut, NULL);
+            lin[matches[2].rm_eo] = '\0';
+            if((be->url = strdup(lin + matches[2].rm_so)) == NULL)
+                conf_err("Redirector config: out of memory - aborted");
+            /* split the URL into its fields */
+            if(regexec(&LOCATION, be->url, 4, matches, 0))
+                conf_err("Redirect bad URL - aborted");
+            if((be->redir_req = matches[3].rm_eo - matches[3].rm_so) == 1)
+                /* the path is a single '/', so remove it */
+                be->url[matches[3].rm_so] = '\0';
+        } else if(!regexec(&BackEnd, lin, 4, matches, 0)) {
+            if(res->backends) {
+                for(be = res->backends; be->next; be = be->next)
+                    ;
+                be->next = parse_be(0);
+            } else
+                res->backends = parse_be(0);
+        } else if(!regexec(&Emergency, lin, 4, matches, 0)) {
+            res->emergency = parse_be(1);
+        } else if(!regexec(&Session, lin, 4, matches, 0)) {
+            parse_sess(res);
+        } else if(!regexec(&DynScale, lin, 4, matches, 0)) {
+            res->dynscale = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&IgnoreCase, lin, 4, matches, 0)) {
+            ign_case = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Disabled, lin, 4, matches, 0)) {
+            res->disabled = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&End, lin, 4, matches, 0)) {
+            for(be = res->backends; be; be = be->next)
+                res->tot_pri += be->priority;
+            res->abs_pri = res->tot_pri;
+            return res;
+        } else {
+            conf_err("unknown directive");
+        }
+    }
+
+    conf_err("Service premature EOF");
+    return NULL;
+}
+
+/*
+ * return the file contents as a string
+ */
+static char *
+file2str(const char *fname)
+{
+    char    *res;
+    struct stat st;
+    int     fin;
+
+    if(stat(fname, &st))
+        conf_err("can't stat Err file - aborted");
+    if((fin = open(fname, O_RDONLY)) < 0)
+        conf_err("can't open Err file - aborted");
+    if((res = malloc(st.st_size + 1)) == NULL)
+        conf_err("can't alloc Err file (out of memory) - aborted");
+    if(read(fin, res, st.st_size) != st.st_size)
+        conf_err("can't read Err file - aborted");
+    res[st.st_size] = '\0';
+    close(fin);
+    return res;
+}
+
+/*
+ * parse an HTTP listener
+ */
+static LISTENER *
+parse_HTTP(void)
+{
+    char        lin[MAXBUF];
+    LISTENER    *res;
+    SERVICE     *svc;
+    MATCHER     *m;
+    int         has_addr, has_port;
+    struct sockaddr_in  in;
+    struct sockaddr_in6 in6;
+
+    if((res = (LISTENER *)malloc(sizeof(LISTENER))) == NULL)
+        conf_err("ListenHTTP config: out of memory - aborted");
+    memset(res, 0, sizeof(LISTENER));
+    res->to = clnt_to;
+    res->rewr_loc = 1;
+    res->err414 = "Request URI is too long";
+    res->err500 = "An internal server error occurred. Please try again later.";
+    res->err501 = "This method may not be used.";
+    res->err503 = "The service is not available. Please try again later.";
+    res->log_level = log_level;
+    if(regcomp(&res->verb, xhttp[0], REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+        conf_err("xHTTP bad default pattern - aborted");
+    has_addr = has_port = 0;
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&Address, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(get_host(lin + matches[1].rm_so, &res->addr))
+                conf_err("Unknown Listener address");
+            if(res->addr.ai_family != AF_INET && res->addr.ai_family != AF_INET6)
+                conf_err("Unknown Listener address family");
+            has_addr = 1;
+        } else if(!regexec(&Port, lin, 4, matches, 0)) {
+            switch(res->addr.ai_family) {
+            case AF_INET:
+                memcpy(&in, res->addr.ai_addr, sizeof(in));
+                in.sin_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in, sizeof(in));
+                break;
+            case AF_INET6:
+                memcpy(&in6, res->addr.ai_addr, sizeof(in6));
+                in6.sin6_port = htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in6, sizeof(in6));
+                break;
+            default:
+                conf_err("Unknown Listener address family");
+            }
+            has_port = 1;
+        } else if(!regexec(&xHTTP, lin, 4, matches, 0)) {
+            int n;
+
+            n = atoi(lin + matches[1].rm_so);
+            regfree(&res->verb);
+            if(regcomp(&res->verb, xhttp[n], REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("xHTTP bad pattern - aborted");
+        } else if(!regexec(&Client, lin, 4, matches, 0)) {
+            res->to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&CheckURL, lin, 4, matches, 0)) {
+            if(res->has_pat)
+                conf_err("CheckURL multiple pattern - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&res->url_pat, lin + matches[1].rm_so, REG_NEWLINE | REG_EXTENDED | (ignore_case? REG_ICASE: 0)))
+                conf_err("CheckURL bad pattern - aborted");
+            res->has_pat = 1;
+        } else if(!regexec(&Err414, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err414 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err500, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err500 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err501, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err501 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err503, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err503 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&MaxRequest, lin, 4, matches, 0)) {
+            res->max_req = ATOL(lin + matches[1].rm_so);
+        } else if(!regexec(&HeadRemove, lin, 4, matches, 0)) {
+            if(res->head_off) {
+                for(m = res->head_off; m->next; m = m->next)
+                    ;
+                if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRemove config: out of memory - aborted");
+                m = m->next;
+            } else {
+                if((res->head_off = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRemove config: out of memory - aborted");
+                m = res->head_off;
+            }
+            memset(m, 0, sizeof(MATCHER));
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&m->pat, lin + matches[1].rm_so, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("HeadRemove bad pattern - aborted");
+        } else if(!regexec(&AddHeader, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(res->add_head == NULL) {
+                if((res->add_head = strdup(lin + matches[1].rm_so)) == NULL)
+                    conf_err("AddHeader config: out of memory - aborted");
+            } else {
+                if((res->add_head = realloc(res->add_head, strlen(res->add_head) + strlen(lin + matches[1].rm_so) + 3))
+                == NULL)
+                    conf_err("AddHeader config: out of memory - aborted");
+                strcat(res->add_head, "\r\n");
+                strcat(res->add_head, lin + matches[1].rm_so);
+            }
+        } else if(!regexec(&RewriteLocation, lin, 4, matches, 0)) {
+            res->rewr_loc = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&RewriteDestination, lin, 4, matches, 0)) {
+            res->rewr_dest = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&LogLevel, lin, 4, matches, 0)) {
+            res->log_level = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Service, lin, 4, matches, 0)) {
+            if(res->services == NULL)
+                res->services = parse_service(NULL);
+            else {
+                for(svc = res->services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(NULL);
+            }
+        } else if(!regexec(&ServiceName, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(res->services == NULL)
+                res->services = parse_service(lin + matches[1].rm_so);
+            else {
+                for(svc = res->services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(lin + matches[1].rm_so);
+            }
+        } else if(!regexec(&End, lin, 4, matches, 0)) {
+            if(!has_addr || !has_port)
+                conf_err("ListenHTTP missing Address or Port - aborted");
+            return res;
+        } else {
+            conf_err("unknown directive - aborted");
+        }
+    }
+
+    conf_err("ListenHTTP premature EOF");
+    return NULL;
+}
+/*
+ * Dummy certificate verification - always OK
+ */
+static int
+verify_OK(int pre_ok, X509_STORE_CTX *ctx)
+{
+    return 1;
+}
+
+#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
+static int
+SNI_server_name(SSL *ssl, int *dummy, POUND_CTX *ctx)
+{
+    const char  *server_name;
+    POUND_CTX   *pc;
+
+    if((server_name = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)) == NULL)
+        return SSL_TLSEXT_ERR_NOACK;
+
+    /* logmsg(LOG_DEBUG, "Received SSL SNI Header for servername %s", servername); */
+
+    SSL_set_SSL_CTX(ssl, NULL);
+    for(pc = ctx; pc; pc = pc->next)
+        if(fnmatch(pc->server_name, server_name, 0) == 0) {
+            /* logmsg(LOG_DEBUG, "Found cert for %s", servername); */
+            SSL_set_SSL_CTX(ssl, pc->ctx);
+            return SSL_TLSEXT_ERR_OK;
+        }
+
+    /* logmsg(LOG_DEBUG, "No match for %s, default used", server_name); */
+    SSL_set_SSL_CTX(ssl, ctx->ctx);
+    return SSL_TLSEXT_ERR_OK;
+}
+#endif
+
+/*
+ * parse an HTTPS listener
+ */
+static LISTENER *
+parse_HTTPS(void)
+{
+    char        lin[MAXBUF];
+    LISTENER    *res;
+    SERVICE     *svc;
+    MATCHER     *m;
+    int         has_addr, has_port, has_other;
+    long       ssl_op_enable, ssl_op_disable;
+    struct hostent      *host;
+    struct sockaddr_in  in;
+    struct sockaddr_in6 in6;
+    POUND_CTX   *pc;
+
+    ssl_op_enable = SSL_OP_ALL;
+#ifdef SSL_OP_NO_COMPRESSION
+    ssl_op_enable |= SSL_OP_NO_COMPRESSION;
+#endif
+    ssl_op_disable = SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | SSL_OP_LEGACY_SERVER_CONNECT;
+
+    if((res = (LISTENER *)malloc(sizeof(LISTENER))) == NULL)
+        conf_err("ListenHTTPS config: out of memory - aborted");
+    memset(res, 0, sizeof(LISTENER));
+
+    res->to = clnt_to;
+    res->rewr_loc = 1;
+    res->err414 = "Request URI is too long";
+    res->err500 = "An internal server error occurred. Please try again later.";
+    res->err501 = "This method may not be used.";
+    res->err503 = "The service is not available. Please try again later.";
+    res->allow_client_reneg = 0;
+    res->disable_ssl_v2 = 0;
+    res->disable_ssl_v3 = 0;
+    res->log_level = log_level;
+    if(regcomp(&res->verb, xhttp[0], REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+        conf_err("xHTTP bad default pattern - aborted");
+    has_addr = has_port = has_other = 0;
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&Address, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(get_host(lin + matches[1].rm_so, &res->addr))
+                conf_err("Unknown Listener address");
+            if(res->addr.ai_family != AF_INET && res->addr.ai_family != AF_INET6)
+                conf_err("Unknown Listener address family");
+            has_addr = 1;
+        } else if(!regexec(&Port, lin, 4, matches, 0)) {
+            if(res->addr.ai_family == AF_INET) {
+                memcpy(&in, res->addr.ai_addr, sizeof(in));
+                in.sin_port = (in_port_t)htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in, sizeof(in));
+            } else {
+                memcpy(&in6, res->addr.ai_addr, sizeof(in6));
+                in6.sin6_port = htons(atoi(lin + matches[1].rm_so));
+                memcpy(res->addr.ai_addr, &in6, sizeof(in6));
+            }
+            has_port = 1;
+        } else if(!regexec(&xHTTP, lin, 4, matches, 0)) {
+            int n;
+
+            n = atoi(lin + matches[1].rm_so);
+            regfree(&res->verb);
+            if(regcomp(&res->verb, xhttp[n], REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("xHTTP bad pattern - aborted");
+        } else if(!regexec(&Client, lin, 4, matches, 0)) {
+            res->to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&CheckURL, lin, 4, matches, 0)) {
+            if(res->has_pat)
+                conf_err("CheckURL multiple pattern - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&res->url_pat, lin + matches[1].rm_so, REG_NEWLINE | REG_EXTENDED | (ignore_case? REG_ICASE: 0)))
+                conf_err("CheckURL bad pattern - aborted");
+            res->has_pat = 1;
+        } else if(!regexec(&Err414, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err414 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err500, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err500 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err501, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err501 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&Err503, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            res->err503 = file2str(lin + matches[1].rm_so);
+        } else if(!regexec(&MaxRequest, lin, 4, matches, 0)) {
+            res->max_req = ATOL(lin + matches[1].rm_so);
+        } else if(!regexec(&HeadRemove, lin, 4, matches, 0)) {
+            if(res->head_off) {
+                for(m = res->head_off; m->next; m = m->next)
+                    ;
+                if((m->next = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRemove config: out of memory - aborted");
+                m = m->next;
+            } else {
+                if((res->head_off = (MATCHER *)malloc(sizeof(MATCHER))) == NULL)
+                    conf_err("HeadRemove config: out of memory - aborted");
+                m = res->head_off;
+            }
+            memset(m, 0, sizeof(MATCHER));
+            lin[matches[1].rm_eo] = '\0';
+            if(regcomp(&m->pat, lin + matches[1].rm_so, REG_ICASE | REG_NEWLINE | REG_EXTENDED))
+                conf_err("HeadRemove bad pattern - aborted");
+        } else if(!regexec(&RewriteLocation, lin, 4, matches, 0)) {
+            res->rewr_loc = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&RewriteDestination, lin, 4, matches, 0)) {
+            res->rewr_dest = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&LogLevel, lin, 4, matches, 0)) {
+            res->log_level = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Cert, lin, 4, matches, 0)) {
+#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
+            /* we have support for SNI */
+            FILE        *fcert;
+            char        server_name[MAXBUF], *cp;
+            X509        *x509;
+
+            if(has_other)
+                conf_err("Cert directives MUST precede other SSL-specific directives - aborted");
+            if(res->ctx) {
+                for(pc = res->ctx; pc->next; pc = pc->next)
+                    ;
+                if((pc->next = malloc(sizeof(POUND_CTX))) == NULL)
+                    conf_err("ListenHTTPS new POUND_CTX: out of memory - aborted");
+                pc = pc->next;
+            } else {
+                if((res->ctx = malloc(sizeof(POUND_CTX))) == NULL)
+                    conf_err("ListenHTTPS new POUND_CTX: out of memory - aborted");
+                pc = res->ctx;
+            }
+            if((pc->ctx = SSL_CTX_new(SSLv23_server_method())) == NULL)
+                conf_err("SSL_CTX_new failed - aborted");
+            pc->server_name = NULL;
+            pc->next = NULL;
+            lin[matches[1].rm_eo] = '\0';
+            if(SSL_CTX_use_certificate_chain_file(pc->ctx, lin + matches[1].rm_so) != 1)
+                conf_err("SSL_CTX_use_certificate_chain_file failed - aborted");
+            if(SSL_CTX_use_PrivateKey_file(pc->ctx, lin + matches[1].rm_so, SSL_FILETYPE_PEM) != 1)
+                conf_err("SSL_CTX_use_PrivateKey_file failed - aborted");
+            if(SSL_CTX_check_private_key(pc->ctx) != 1)
+                conf_err("SSL_CTX_check_private_key failed - aborted");
+            if((fcert = fopen(lin + matches[1].rm_so, "r")) == NULL)
+                conf_err("ListenHTTPS: could not open certificate file");
+            if((x509 = PEM_read_X509(fcert, NULL, NULL, NULL)) == NULL)
+                conf_err("ListenHTTPS: could not get certificate subject");
+            fclose(fcert);
+            memset(server_name, '\0', MAXBUF);
+            X509_NAME_oneline(X509_get_subject_name(x509), server_name, MAXBUF - 1);
+            X509_free(x509);
+            if(!regexec(&CNName, server_name, 4, matches, 0)) {
+                server_name[matches[1].rm_eo] = '\0';
+                if((pc->server_name = strdup(server_name + matches[1].rm_so)) == NULL)
+                    conf_err("ListenHTTPS: could not set certificate subject");
+            } else
+                conf_err("ListenHTTPS: could not get certificate CN");
+#else
+            /* no SNI support */
+            if(has_other)
+                conf_err("Cert directives MUST precede other SSL-specific directives - aborted");
+            if(res->ctx)
+                conf_err("ListenHTTPS: multiple certificates not supported - aborted");
+            if((res->ctx = malloc(sizeof(POUND_CTX))) == NULL)
+                conf_err("ListenHTTPS new POUND_CTX: out of memory - aborted");
+            res->ctx->server_name = NULL;
+            res->ctx->next = NULL;
+            if((res->ctx->ctx = SSL_CTX_new(SSLv23_server_method())) == NULL)
+                conf_err("SSL_CTX_new failed - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if(SSL_CTX_use_certificate_chain_file(res->ctx->ctx, lin + matches[1].rm_so) != 1)
+                conf_err("SSL_CTX_use_certificate_chain_file failed - aborted");
+            if(SSL_CTX_use_PrivateKey_file(res->ctx->ctx, lin + matches[1].rm_so, SSL_FILETYPE_PEM) != 1)
+                conf_err("SSL_CTX_use_PrivateKey_file failed - aborted");
+            if(SSL_CTX_check_private_key(res->ctx->ctx) != 1)
+                conf_err("SSL_CTX_check_private_key failed - aborted");
+#endif
+        } else if(!regexec(&ClientCert, lin, 4, matches, 0)) {
+            has_other = 1;
+            if(res->ctx == NULL)
+                conf_err("ClientCert may only be used after Cert - aborted");
+            switch(res->clnt_check = atoi(lin + matches[1].rm_so)) {
+            case 0:
+                /* don't ask */
+                for(pc = res->ctx; pc; pc = pc->next)
+                    SSL_CTX_set_verify(pc->ctx, SSL_VERIFY_NONE, NULL);
+                break;
+            case 1:
+                /* ask but OK if no client certificate */
+                for(pc = res->ctx; pc; pc = pc->next) {
+                    SSL_CTX_set_verify(pc->ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, NULL);
+                    SSL_CTX_set_verify_depth(pc->ctx, atoi(lin + matches[2].rm_so));
+                }
+                break;
+            case 2:
+                /* ask and fail if no client certificate */
+                for(pc = res->ctx; pc; pc = pc->next) {
+                    SSL_CTX_set_verify(pc->ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
+                    SSL_CTX_set_verify_depth(pc->ctx, atoi(lin + matches[2].rm_so));
+                }
+                break;
+            case 3:
+                /* ask but do not verify client certificate */
+                for(pc = res->ctx; pc; pc = pc->next) {
+                    SSL_CTX_set_verify(pc->ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, verify_OK);
+                    SSL_CTX_set_verify_depth(pc->ctx, atoi(lin + matches[2].rm_so));
+                }
+                break;
+            }
+        } else if(!regexec(&AddHeader, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(res->add_head == NULL) {
+                if((res->add_head = strdup(lin + matches[1].rm_so)) == NULL)
+                    conf_err("AddHeader config: out of memory - aborted");
+            } else {
+                if((res->add_head = realloc(res->add_head, strlen(res->add_head) + strlen(lin + matches[1].rm_so) + 3)) == NULL)
+                    conf_err("AddHeader config: out of memory - aborted");
+                strcat(res->add_head, "\r\n");
+                strcat(res->add_head, lin + matches[1].rm_so);
+            }
+       } else if(!regexec(&DisableSSLv2, lin, 4, matches, 0)) {
+           res->disable_ssl_v2 = 1;
+       } else if(!regexec(&DisableSSLv3, lin, 4, matches, 0)) {
+           res->disable_ssl_v3 = 1;
+        } else if(!regexec(&SSLAllowClientRenegotiation, lin, 4, matches, 0)) {
+            res->allow_client_reneg = atoi(lin + matches[1].rm_so);
+            if (res->allow_client_reneg == 2) {
+                ssl_op_enable |= SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
+                ssl_op_disable &= ~SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
+            } else {
+                ssl_op_disable |= SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
+                ssl_op_enable &= ~SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
+            }
+        } else if(!regexec(&SSLHonorCipherOrder, lin, 4, matches, 0)) {
+            if (atoi(lin + matches[1].rm_so)) {
+                ssl_op_enable |= SSL_OP_CIPHER_SERVER_PREFERENCE;
+                ssl_op_disable &= ~SSL_OP_CIPHER_SERVER_PREFERENCE;
+            } else {
+                ssl_op_disable |= SSL_OP_CIPHER_SERVER_PREFERENCE;
+                ssl_op_enable &= ~SSL_OP_CIPHER_SERVER_PREFERENCE;
+            }
+        } else if(!regexec(&Ciphers, lin, 4, matches, 0)) {
+            has_other = 1;
+            if(res->ctx == NULL)
+                conf_err("Ciphers may only be used after Cert - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            for(pc = res->ctx; pc; pc = pc->next)
+                SSL_CTX_set_cipher_list(pc->ctx, lin + matches[1].rm_so);
+        } else if(!regexec(&CAlist, lin, 4, matches, 0)) {
+            STACK_OF(X509_NAME) *cert_names;
+
+            has_other = 1;
+            if(res->ctx == NULL)
+                conf_err("CAList may only be used after Cert - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if((cert_names = SSL_load_client_CA_file(lin + matches[1].rm_so)) == NULL)
+                conf_err("SSL_load_client_CA_file failed - aborted");
+            for(pc = res->ctx; pc; pc = pc->next)
+                SSL_CTX_set_client_CA_list(pc->ctx, cert_names);
+        } else if(!regexec(&VerifyList, lin, 4, matches, 0)) {
+            has_other = 1;
+            if(res->ctx == NULL)
+                conf_err("VerifyList may only be used after Cert - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            for(pc = res->ctx; pc; pc = pc->next)
+                if(SSL_CTX_load_verify_locations(pc->ctx, lin + matches[1].rm_so, NULL) != 1)
+                    conf_err("SSL_CTX_load_verify_locations failed - aborted");
+        } else if(!regexec(&CRLlist, lin, 4, matches, 0)) {
+#if HAVE_X509_STORE_SET_FLAGS
+            X509_STORE *store;
+            X509_LOOKUP *lookup;
+
+            has_other = 1;
+            if(res->ctx == NULL)
+                conf_err("CRLlist may only be used after Cert - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            for(pc = res->ctx; pc; pc = pc->next) {
+                store = SSL_CTX_get_cert_store(pc->ctx);
+                if((lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file())) == NULL)
+                    conf_err("X509_STORE_add_lookup failed - aborted");
+                if(X509_load_crl_file(lookup, lin + matches[1].rm_so, X509_FILETYPE_PEM) != 1)
+                    conf_err("X509_load_crl_file failed - aborted");
+                X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
+            }
+#else
+            conf_err("your version of OpenSSL does not support CRL checking");
+#endif
+        } else if(!regexec(&NoHTTPS11, lin, 4, matches, 0)) {
+            res->noHTTPS11 = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Service, lin, 4, matches, 0)) {
+            if(res->services == NULL)
+                res->services = parse_service(NULL);
+            else {
+                for(svc = res->services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(NULL);
+            }
+        } else if(!regexec(&ServiceName, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(res->services == NULL)
+                res->services = parse_service(lin + matches[1].rm_so);
+            else {
+                for(svc = res->services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(lin + matches[1].rm_so);
+            }
+        } else if(!regexec(&End, lin, 4, matches, 0)) {
+            X509_STORE  *store;
+
+            if(!has_addr || !has_port || res->ctx == NULL)
+                conf_err("ListenHTTPS missing Address, Port or Certificate - aborted");
+#ifdef SSL_CTRL_SET_TLSEXT_SERVERNAME_CB
+            if(!SSL_CTX_set_tlsext_servername_callback(res->ctx->ctx, SNI_server_name)
+            || !SSL_CTX_set_tlsext_servername_arg(res->ctx->ctx, res->ctx))
+                conf_err("ListenHTTPS: can't set SNI callback");
+#endif
+            for(pc = res->ctx; pc; pc = pc->next) {
+                SSL_CTX_set_app_data(pc->ctx, res);
+                SSL_CTX_set_mode(pc->ctx, SSL_MODE_AUTO_RETRY);
+                SSL_CTX_set_options(pc->ctx, ssl_op_enable);
+                SSL_CTX_set_options(pc->ctx, SSL_OP_NO_COMPRESSION);
+                SSL_CTX_clear_options(pc->ctx, ssl_op_disable);
+               if (res->disable_ssl_v2 == 1)
+               {
+                   SSL_CTX_set_options(pc->ctx, SSL_OP_NO_SSLv2);
+               }
+               if (res->disable_ssl_v3 == 1)
+               {
+                   SSL_CTX_set_options(pc->ctx, SSL_OP_NO_SSLv3);
+               }
+                sprintf(lin, "%d-Pound-%ld", getpid(), random());
+                SSL_CTX_set_session_id_context(pc->ctx, (unsigned char *)lin, strlen(lin));
+                SSL_CTX_set_tmp_rsa_callback(pc->ctx, RSA_tmp_callback);
+                SSL_CTX_set_tmp_dh_callback(pc->ctx, DH_tmp_callback);
+                SSL_CTX_set_info_callback(pc->ctx, SSLINFO_callback);
+            }
+            return res;
+        } else {
+            conf_err("unknown directive");
+        }
+    }
+
+    conf_err("ListenHTTPS premature EOF");
+    return NULL;
+}
+
+/*
+ * parse the config file
+ */
+static void
+parse_file(void)
+{
+    char        lin[MAXBUF];
+    SERVICE     *svc;
+    LISTENER    *lstn;
+    int         i;
+#if HAVE_OPENSSL_ENGINE_H
+    ENGINE      *e;
+#endif
+
+    while(conf_fgets(lin, MAXBUF)) {
+        if(strlen(lin) > 0 && lin[strlen(lin) - 1] == '\n')
+            lin[strlen(lin) - 1] = '\0';
+        if(!regexec(&User, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if((user = strdup(lin + matches[1].rm_so)) == NULL)
+                conf_err("User config: out of memory - aborted");
+        } else if(!regexec(&Group, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if((group = strdup(lin + matches[1].rm_so)) == NULL)
+                conf_err("Group config: out of memory - aborted");
+        } else if(!regexec(&RootJail, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if((root_jail = strdup(lin + matches[1].rm_so)) == NULL)
+                conf_err("RootJail config: out of memory - aborted");
+        } else if(!regexec(&Daemon, lin, 4, matches, 0)) {
+            daemonize = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Threads, lin, 4, matches, 0)) {
+            numthreads = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&LogFacility, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(lin[matches[1].rm_so] == '-')
+                def_facility = -1;
+            else
+                for(i = 0; facilitynames[i].c_name; i++)
+                    if(!strcmp(facilitynames[i].c_name, lin + matches[1].rm_so)) {
+                        def_facility = facilitynames[i].c_val;
+                        break;
+                    }
+        } else if(!regexec(&Grace, lin, 4, matches, 0)) {
+            grace = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&LogLevel, lin, 4, matches, 0)) {
+            log_level = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Client, lin, 4, matches, 0)) {
+            clnt_to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&Alive, lin, 4, matches, 0)) {
+            alive_to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&DynScale, lin, 4, matches, 0)) {
+            dynscale = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&TimeOut, lin, 4, matches, 0)) {
+            be_to = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&ConnTO, lin, 4, matches, 0)) {
+            be_connto = atoi(lin + matches[1].rm_so);
+        } else if(!regexec(&IgnoreCase, lin, 4, matches, 0)) {
+            ignore_case = atoi(lin + matches[1].rm_so);
+#if HAVE_OPENSSL_ENGINE_H
+        } else if(!regexec(&SSLEngine, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+            ENGINE_load_builtin_engines();
+#endif
+            if (!(e = ENGINE_by_id(lin + matches[1].rm_so)))
+                conf_err("could not find engine");
+            if(!ENGINE_init(e)) {
+                ENGINE_free(e);
+                conf_err("could not init engine");
+            }
+            if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) {
+                ENGINE_free(e);
+                conf_err("could not set all defaults");
+            }
+            ENGINE_finish(e);
+            ENGINE_free(e);
+#endif
+        } else if(!regexec(&Control, lin, 4, matches, 0)) {
+            if(ctrl_name != NULL)
+                conf_err("Control multiply defined - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            ctrl_name = strdup(lin + matches[1].rm_so);
+        } else if(!regexec(&ListenHTTP, lin, 4, matches, 0)) {
+            if(listeners == NULL)
+                listeners = parse_HTTP();
+            else {
+                for(lstn = listeners; lstn->next; lstn = lstn->next)
+                    ;
+                lstn->next = parse_HTTP();
+            }
+        } else if(!regexec(&ListenHTTPS, lin, 4, matches, 0)) {
+            if(listeners == NULL)
+                listeners = parse_HTTPS();
+            else {
+                for(lstn = listeners; lstn->next; lstn = lstn->next)
+                    ;
+                lstn->next = parse_HTTPS();
+            }
+        } else if(!regexec(&Service, lin, 4, matches, 0)) {
+            if(services == NULL)
+                services = parse_service(NULL);
+            else {
+                for(svc = services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(NULL);
+            }
+        } else if(!regexec(&ServiceName, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(services == NULL)
+                services = parse_service(lin + matches[1].rm_so);
+            else {
+                for(svc = services; svc->next; svc = svc->next)
+                    ;
+                svc->next = parse_service(lin + matches[1].rm_so);
+            }
+        } else {
+            conf_err("unknown directive - aborted");
+        }
+    }
+    return;
+}
+
+/*
+ * prepare to parse the arguments/config file
+ */
+void
+config_parse(const int argc, char **const argv)
+{
+    char    *conf_name;
+    FILE    *f_conf;
+    int     c_opt, check_only;
+
+    if(regcomp(&Empty, "^[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Comment, "^[ \t]*#.*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&User, "^[ \t]*User[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Group, "^[ \t]*Group[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&RootJail, "^[ \t]*RootJail[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Daemon, "^[ \t]*Daemon[ \t]+([01])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Threads, "^[ \t]*Threads[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&LogFacility, "^[ \t]*LogFacility[ \t]+([a-z0-9-]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&LogLevel, "^[ \t]*LogLevel[ \t]+([0-5])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Grace, "^[ \t]*Grace[ \t]+([0-9]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Alive, "^[ \t]*Alive[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&SSLEngine, "^[ \t]*SSLEngine[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Control, "^[ \t]*Control[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ListenHTTP, "^[ \t]*ListenHTTP[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ListenHTTPS, "^[ \t]*ListenHTTPS[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&End, "^[ \t]*End[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Address, "^[ \t]*Address[ \t]+([^ \t]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Port, "^[ \t]*Port[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Cert, "^[ \t]*Cert[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&xHTTP, "^[ \t]*xHTTP[ \t]+([01234])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Client, "^[ \t]*Client[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&CheckURL, "^[ \t]*CheckURL[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Err414, "^[ \t]*Err414[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Err500, "^[ \t]*Err500[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Err501, "^[ \t]*Err501[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Err503, "^[ \t]*Err503[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&MaxRequest, "^[ \t]*MaxRequest[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HeadRemove, "^[ \t]*HeadRemove[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&RewriteLocation, "^[ \t]*RewriteLocation[ \t]+([012])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&RewriteDestination, "^[ \t]*RewriteDestination[ \t]+([01])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Service, "^[ \t]*Service[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ServiceName, "^[ \t]*Service[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&URL, "^[ \t]*URL[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HeadRequire, "^[ \t]*HeadRequire[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HeadDeny, "^[ \t]*HeadDeny[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&BackEnd, "^[ \t]*BackEnd[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Emergency, "^[ \t]*Emergency[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Priority, "^[ \t]*Priority[ \t]+([1-9])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&TimeOut, "^[ \t]*TimeOut[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HAport, "^[ \t]*HAport[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HAportAddr, "^[ \t]*HAport[ \t]+([^ \t]+)[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Redirect, "^[ \t]*Redirect[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&RedirectN, "^[ \t]*Redirect[ \t]+(30[127])[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Session, "^[ \t]*Session[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Type, "^[ \t]*Type[ \t]+([^ \t]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&TTL, "^[ \t]*TTL[ \t]+([1-9-][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ID, "^[ \t]*ID[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&DynScale, "^[ \t]*DynScale[ \t]+([01])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ClientCert, "^[ \t]*ClientCert[ \t]+([0-3])[ \t]+([1-9])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&AddHeader, "^[ \t]*AddHeader[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&SSLAllowClientRenegotiation, "^[ \t]*SSLAllowClientRenegotiation[ \t]+([012])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&DisableSSLv2, "^[ \t]*DisableSSLv2[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&DisableSSLv3, "^[ \t]*DisableSSLv3[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&SSLHonorCipherOrder, "^[ \t]*SSLHonorCipherOrder[ \t]+([01])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Ciphers, "^[ \t]*Ciphers[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&CAlist, "^[ \t]*CAlist[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&VerifyList, "^[ \t]*VerifyList[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&CRLlist, "^[ \t]*CRLlist[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&NoHTTPS11, "^[ \t]*NoHTTPS11[ \t]+([0-2])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Include, "^[ \t]*Include[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&ConnTO, "^[ \t]*ConnTO[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&IgnoreCase, "^[ \t]*IgnoreCase[ \t]+([01])[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HTTPS, "^[ \t]*HTTPS[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&HTTPSCert, "^[ \t]*HTTPS[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&Disabled, "^[ \t]*Disabled[ \t]+[01][ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    || regcomp(&CNName, ".*[Cc][Nn]=([-*.A-Za-z0-9]+).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+    ) {
+        logmsg(LOG_ERR, "bad config Regex - aborted");
+        exit(1);
+    }
+
+    opterr = 0;
+    check_only = 0;
+    conf_name = F_CONF;
+    pid_name = F_PID;
+
+    while((c_opt = getopt(argc, argv, "f:cvVp:")) > 0)
+        switch(c_opt) {
+        case 'f':
+            conf_name = optarg;
+            break;
+        case 'p':
+            pid_name = optarg;
+            break;
+        case 'c':
+            check_only = 1;
+            break;
+        case 'v':
+            print_log = 1;
+            break;
+        case 'V':
+            print_log = 1;
+            logmsg(LOG_DEBUG, "Version %s", VERSION);
+            logmsg(LOG_DEBUG, "  Configuration switches:");
+#ifdef  C_SUPER
+            if(strcmp(C_SUPER, "0"))
+                logmsg(LOG_DEBUG, "    --disable-super");
+#endif
+#ifdef  C_CERT1L
+            if(strcmp(C_CERT1L, "1"))
+                logmsg(LOG_DEBUG, "    --enable-cert1l");
+#endif
+#ifdef  C_SSL
+            if(strcmp(C_SSL, ""))
+                logmsg(LOG_DEBUG, "    --with-ssl=%s", C_SSL);
+#endif
+#ifdef  C_T_RSA
+            if(strcmp(C_T_RSA, "0"))
+                logmsg(LOG_DEBUG, "    --with-t_rsa=%s", C_T_RSA);
+#endif
+#ifdef  C_MAXBUF
+            if(strcmp(C_MAXBUF, "0"))
+                logmsg(LOG_DEBUG, "    --with-maxbuf=%s", C_MAXBUF);
+#endif
+#ifdef  C_OWNER
+            if(strcmp(C_OWNER, ""))
+                logmsg(LOG_DEBUG, "    --with-owner=%s", C_OWNER);
+#endif
+#ifdef  C_GROUP
+            if(strcmp(C_GROUP, ""))
+                logmsg(LOG_DEBUG, "    --with-group=%s", C_GROUP);
+#endif
+            logmsg(LOG_DEBUG, "Exiting...");
+            exit(0);
+            break;
+        default:
+            logmsg(LOG_ERR, "bad flag -%c", optopt);
+            exit(1);
+            break;
+        }
+    if(optind < argc) {
+        logmsg(LOG_ERR, "unknown extra arguments (%s...)", argv[optind]);
+        exit(1);
+    }
+
+    conf_init(conf_name);
+
+    user = NULL;
+    group = NULL;
+    root_jail = NULL;
+    ctrl_name = NULL;
+
+    numthreads = 128;
+    alive_to = 30;
+    daemonize = 1;
+    grace = 30;
+
+    services = NULL;
+    listeners = NULL;
+
+    parse_file();
+
+    if(check_only) {
+        logmsg(LOG_INFO, "Config file %s is OK", conf_name);
+        exit(0);
+    }
+
+    if(listeners == NULL) {
+        logmsg(LOG_ERR, "no listeners defined - aborted");
+        exit(1);
+    }
+
+    regfree(&Empty);
+    regfree(&Comment);
+    regfree(&User);
+    regfree(&Group);
+    regfree(&RootJail);
+    regfree(&Daemon);
+    regfree(&Threads);
+    regfree(&LogFacility);
+    regfree(&LogLevel);
+    regfree(&Grace);
+    regfree(&Alive);
+    regfree(&SSLEngine);
+    regfree(&Control);
+    regfree(&ListenHTTP);
+    regfree(&ListenHTTPS);
+    regfree(&End);
+    regfree(&Address);
+    regfree(&Port);
+    regfree(&Cert);
+    regfree(&xHTTP);
+    regfree(&Client);
+    regfree(&CheckURL);
+    regfree(&Err414);
+    regfree(&Err500);
+    regfree(&Err501);
+    regfree(&Err503);
+    regfree(&MaxRequest);
+    regfree(&HeadRemove);
+    regfree(&RewriteLocation);
+    regfree(&RewriteDestination);
+    regfree(&Service);
+    regfree(&ServiceName);
+    regfree(&URL);
+    regfree(&HeadRequire);
+    regfree(&HeadDeny);
+    regfree(&BackEnd);
+    regfree(&Emergency);
+    regfree(&Priority);
+    regfree(&TimeOut);
+    regfree(&HAport);
+    regfree(&HAportAddr);
+    regfree(&Redirect);
+    regfree(&RedirectN);
+    regfree(&Session);
+    regfree(&Type);
+    regfree(&TTL);
+    regfree(&ID);
+    regfree(&DynScale);
+    regfree(&ClientCert);
+    regfree(&AddHeader);
+    regfree(&SSLAllowClientRenegotiation);
+    regfree(&DisableSSLv2);
+    regfree(&DisableSSLv3);
+    regfree(&SSLHonorCipherOrder);
+    regfree(&Ciphers);
+    regfree(&CAlist);
+    regfree(&VerifyList);
+    regfree(&CRLlist);
+    regfree(&NoHTTPS11);
+    regfree(&Include);
+    regfree(&ConnTO);
+    regfree(&IgnoreCase);
+    regfree(&HTTPS);
+    regfree(&HTTPSCert);
+    regfree(&Disabled);
+    regfree(&CNName);
+
+    /* set the facility only here to ensure the syslog gets opened if necessary */
+    log_facility = def_facility;
+
+    return;
+}
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..6bdac8d
--- /dev/null
@@ -0,0 +1,1388 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-05-09'
+
+# 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 <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  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 <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+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) ; } ||
+ { 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 tupples: *-*-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 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-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 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mipseb-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # 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 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/^[VTX]//' | 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 ;;
+    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_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 ;;
+    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 <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c \
+         && $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 <sys/systemcfg.h>
+
+               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 <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           # 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 <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && $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 nv1-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 ;;
+    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:*:*|*:GNU/FreeBSD:*:*)
+       # Determine whether the default compiler uses glibc.
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #if __GLIBC__ >= 2
+       LIBC=gnu
+       #else
+       LIBC=
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+       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*:3*)
+       echo i586-pc-interix3
+       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:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64: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 ;;
+    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 <features.h>
+       #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
+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: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' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 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[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*: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)
+       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 <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # 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:*:*)
+       case `uname -p` in
+           *86) UNAME_PROCESSOR=i686 ;;
+           powerpc) 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-[DGKLNPTVW]: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 ;;
+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 <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#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 <sys/param.h>
+  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 <sys/param.h>
+#  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 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> 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.h.in b/config.h.in
new file mode 100755 (executable)
index 0000000..684eff3
--- /dev/null
@@ -0,0 +1,253 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the <ctype.h> header file. */
+#undef HAVE_CTYPE_H
+
+/* Define to 1 if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `long long' type. */
+#undef HAVE_LONG_LONG_INT
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <grp.h> header file. */
+#undef HAVE_GRP_H
+
+/* Define to 1 if you have the `inet_ntop' function. */
+#undef HAVE_INET_NTOP
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define if libpcreposix is available */
+#undef HAVE_LIBPCREPOSIX
+
+/* Define to 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#undef HAVE_NETINET_TCP_H
+
+/* Define to 1 if you have the <openssl/engine.h> header file. */
+#undef HAVE_OPENSSL_ENGINE_H
+
+/* Define to 1 if you have the <openssl/ssl.h> header file. */
+#undef HAVE_OPENSSL_SSL_H
+
+/* Define to 1 if you have the <pcreposix.h> header file. */
+#undef HAVE_PCREPOSIX_H
+
+/* Define to 1 if you have the <pcre/pcreposix.h> header file. */
+#undef HAVE_PCRE_PCREPOSIX_H
+
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `regcomp' function. */
+#undef HAVE_REGCOMP
+
+/* Define to 1 if you have the <regex.h> header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the `setsid' function. */
+#undef HAVE_SETSID
+
+/* Define to 1 if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define to 1 if you have the `socket' function. */
+#undef HAVE_SOCKET
+
+/* Define to 1 if `stat' has the bug that it succeeds when given the
+   zero-length file name argument. */
+#undef HAVE_STAT_EMPTY_STRING_BUG
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strspn' function. */
+#undef HAVE_STRSPN
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+#undef HAVE_SYS_POLL_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+#undef HAVE_SYS_UN_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <time.h> header file. */
+#undef HAVE_TIME_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if you have the <wait.h> header file. */
+#undef HAVE_WAIT_H
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if you have the `X509_STORE_set_flags' function. */
+#undef HAVE_X509_STORE_SET_FLAGS
+
+/* Define to 1 if `lstat' dereferences a symlink specified with a trailing
+   slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to the necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to the type of arg 1 for `select'. */
+#undef SELECT_TYPE_ARG1
+
+/* Define to the type of args 2, 3 and 4 for `select'. */
+#undef SELECT_TYPE_ARG234
+
+/* Define to the type of arg 5 for `select'. */
+#undef SELECT_TYPE_ARG5
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 if you have the <fnmatch.h> header file. */
+#undef HAVE_FNMATCH_H
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..fe4f1ed
--- /dev/null
@@ -0,0 +1,1492 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-05-09'
+
+# 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 <config-patches@gnu.org>.  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 <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+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* | freebsd*-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)
+               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] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k \
+       | m32r | 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 \
+       | 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 | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | 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-* | 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-* \
+       | m32r-* \
+       | 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-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | msp430-* \
+       | none-* | np1-* | nv1-* | 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-* \
+       | 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
+               ;;
+       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
+               ;;
+       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
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       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
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       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
+               ;;
+       nv1)
+               basic_machine=nv1-cray
+               os=-unicosmp
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       or32 | or32-*)
+               basic_machine=or32-unknown
+               os=-coff
+               ;;
+       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)
+               basic_machine=i686-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-*)
+               basic_machine=i686-`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
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       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
+               ;;
+        tic4x | c4x*)
+               basic_machine=tic4x-unknown
+               os=-coff
+               ;;
+       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
+               ;;
+       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
+               ;;
+       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 | 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* | -netbsd* | -openbsd* | -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* | -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*)
+       # 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*)
+               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
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -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
+               ;;
+       -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
+               ;;
+       # 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
+               ;;
+       *-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
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -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 (executable)
index 0000000..dec7033
--- /dev/null
+++ b/configure
@@ -0,0 +1,6749 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.65 for pound 2.6.
+#
+# Report bugs to <roseg@apsis.ch>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+       # neutralization value for shells without unset; and this also
+       # works around shells that cannot unset nonexistent variables.
+       BASH_ENV=/dev/null
+       ENV=/dev/null
+       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+       export CONFIG_SHELL
+       exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and roseg@apsis.ch
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error ERROR [LINENO LOG_FD]
+# ---------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with status $?, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$?; test $as_status -eq 0 && as_status=1
+  if test "$3"; then
+    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  fi
+  $as_echo "$as_me: error: $1" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -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='mkdir -p "$as_dir"'
+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'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&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=
+
+# Identity of this package.
+PACKAGE_NAME='pound'
+PACKAGE_TARNAME='pound'
+PACKAGE_VERSION='2.6'
+PACKAGE_STRING='pound 2.6'
+PACKAGE_BUGREPORT='roseg@apsis.ch'
+PACKAGE_URL=''
+
+ac_unique_file="pound.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+I_GRP
+I_OWNER
+LIBOBJS
+EGREP
+GREP
+CPP
+C_CERT1L
+C_SUPER
+C_GROUP
+C_OWNER
+C_MAXBUF
+C_T_RSA
+C_SSL
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+acx_pthread_config
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+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_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_ssl
+with_t_rsa
+with_maxbuf
+with_owner
+with_group
+enable_super
+enable_cert1l
+enable_pcreposix
+enable_tcmalloc
+enable_hoard
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information."
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $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_fn_error "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures pound 2.6 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/pound]
+  --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]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of pound 2.6:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-super          enable or disable running with supervisor process
+                          (default: enabled)
+  --enable-cert1l         enable or disable single-line certificate (default:
+                          disabled)
+  --enable-pcreposix      enable or disable using the pcreposix library
+                          (default: enabled if available)
+  --enable-tcmalloc       enable or disable using the tcmalloc library
+                          (default: enabled if available)
+  --enable-hoard          enable or disable using the hoard library (default:
+                          enabled if available and tcmalloc NOT available)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-ssl=directory    location of OpenSSL package
+  --with-t_rsa=nnn        Time-out for RSA ephemeral keys generation
+  --with-maxbuf=nnn       Value of the MAXBUF parameter (default: 4096)
+  --with-owner=name       The account that will own the files installed by
+                          Pound
+  --with-group=name       The group that will own the files installed by Pound
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <roseg@apsis.ch>.
+_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
+   &nb