Update from Debian version 2.7-1.2.
authorWerner Koch <wk@gnupg.org>
Mon, 30 Jan 2017 09:54:03 +0000 (10:54 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 30 Jan 2017 09:55:00 +0000 (10:55 +0100)
26 files changed:
CHANGELOG
Makefile.in [changed mode: 0755->0644]
config.c [changed mode: 0755->0644]
configure
debian/changelog
debian/compat
debian/control
debian/install [new file with mode: 0644]
debian/patches/0001-Add-MKCALENDAR-to-xHTTP-2-and-above.patch [moved from debian/patches/0006-add_mkcalendar_support.patch with 52% similarity]
debian/patches/0001-anti_beast.patch [deleted file]
debian/patches/0002-xss_redirect_fix.patch [deleted file]
debian/patches/0003-tls_compression_disable.patch [deleted file]
debian/patches/0004-add_http_patch_support.patch [deleted file]
debian/patches/0005-wait_on_semaphore_fix.patch [deleted file]
debian/patches/0007-anti_poodle.patch [deleted file]
debian/patches/0008-disable_client_initiated_renegotiation.patch [deleted file]
debian/patches/series
debian/postinst
debian/pound.cfg
debian/rules
http.c [changed mode: 0755->0644]
pound.8 [changed mode: 0755->0644]
pound.c [changed mode: 0755->0644]
pound.h [changed mode: 0755->0644]
poundctl.c
svc.c [changed mode: 0755->0644]

index 061317f..62e8749 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,120 @@
 ------------------------------------------------------------------------
+r81 | roseg | 2015-01-26 17:47:53 +0100 (Mon, 26 Jan 2015) | 30 lines
+
+Release 2.7
+
+Enhancements:
+    - added support for larger DH keys + compile-time parameter for DH bits (workaround for OpenSSL limitation)
+    - added support for elliptical curve encryption
+    - added protocol version in X-SSL-cipher (Tom Fitzhenry)
+    - added "Disable PROTO" directives (fix for Poodle vulnerability)
+    - added Cert, Disable and Cipher directives for HTTPS back-ends. The directive HTTPS "cert" no longer supported.
+    - added filtering of "Expect: 100-continue" headers
+    - Add support for PATCH HTTP method
+    - Anonymise configuration option - show last client address byte as 0 (based on an idea by Christian Doering)
+    - SSLAllowClientRenegotiation (based on a patch from Joe Gooch)
+    - SSLHonorCipherOrder (based on a patch from Joe Gooch)
+    - Certificate alternate names support (based on a patch from Jonas Pasche)
+    - poundctl shows the length of the request queue (based on a request from Leo)
+
+Bug fixes:
+    - fixed lh_retrieve warning
+    - fixed potential memory leak on client certificates
+    - fixed alt names problem (Joe Gooch)
+    - removed debugging messages
+    - fixed address comparison for RewriteLocation (IPv4/IPv6 problem - Christopher Bartz)
+    - re-patched the redirect patch (Frank Schmierler)
+    - fixed RPC handling (Frank Schmierler)
+    - sanitize URLs for redirection (prevent CSRF)
+    - SSL disable empty fragments + SSL disable compression (CRIME attack prevention)
+    - fixed bug in configuration of DISABLED directive
+    - changed the log level from WARNING to NOTICE if the thread arg is NULL
+    - fixed testing of gcc options
+
+------------------------------------------------------------------------
+r80 | roseg | 2014-12-29 11:47:54 +0100 (Mon, 29 Dec 2014) | 10 lines
+
+Release 2.7f
+
+Enhancements:
+    - compile-time parameter for DH bits (workaround for OpenSSL limitation)
+
+Bug fixes:
+    - allow '-' and '=' again in URLs (redirect)
+    - fixed lh_retrieve warning
+    - fixed "Disable" regex typo
+
+------------------------------------------------------------------------
+r79 | roseg | 2014-12-08 14:39:00 +0100 (Mon, 08 Dec 2014) | 12 lines
+
+Release 2.7e
+
+Enhancements:
+    - added support for elliptical curve encryption
+    - added support for larger DH keys
+    - added protocol version in X-SSL-cipher (Tom Fitzhenry)
+
+Bug fixes:
+    - fixed potential memory leak on client certificates
+    - fixed alt names problem (Joe Gooch)
+    - removed debugging messages
+
+------------------------------------------------------------------------
+r78 | roseg | 2014-10-18 12:36:28 +0200 (Sat, 18 Oct 2014) | 10 lines
+
+Release 2.7d
+
+Enhancements:
+    - added "Disable PROTO" directives (fix for Poodle vulnerability)
+    - added Cert, Disable and Cipher directives for HTTPS back-ends. The
+      directive HTTPS "cert" no longer supported.
+
+Bug fixes:
+    - fixed address comparison for RewriteLocation (IPv4/IPv6 problem - Christopher Bartz)
+
+------------------------------------------------------------------------
+r77 | roseg | 2014-04-21 13:16:07 +0200 (Mon, 21 Apr 2014) | 9 lines
+
+Release 2.7c
+
+Enhancements:
+    - added filtering of "Expect: 100-continue" headers
+
+Bug fixes:
+    - re-patched the redirect patch (Frank Schmierler)
+    - fixed RPC handling (Frank Schmierler)
+
+------------------------------------------------------------------------
+r76 | roseg | 2013-09-26 14:33:21 +0200 (Thu, 26 Sep 2013) | 12 lines
+
+Release 2.7b
+
+Enhancements:
+    - Add support for PATCH HTTP method
+
+Bug fixes:
+    - sanitize URLs for redirection (prevent CSRF)
+    - SSL disable empty fragments
+    - SSL disable compression (CRIME attack prevention)
+    - fixed bug in configuration of DISABLED directive
+    - changed the log level from WARNING to NOTICE if the thread arg is NULL
+
+------------------------------------------------------------------------
+r75 | roseg | 2012-04-09 15:37:26 +0200 (Mon, 09 Apr 2012) | 12 lines
+
+Release 2.7a
+
+Enhancements:
+    - Anonymise configuration option - show last client address byte as 0 (based on an idea by Christian Doering)
+    - SSLAllowClientRenegotiation (based on a patch from Joe Gooch)
+    - SSLHonorCipherOrder (based on a patch from Joe Gooch)
+    - Certificate alternate names support (based on a patch from Jonas Pasche)
+    - poundctl shows the length of the request queue (based on a request from Leo)
+
+Bug fixes:
+    - fixed testing of gcc options
+
+------------------------------------------------------------------------
 r74 | roseg | 2011-12-28 14:57:45 +0100 (Wed, 28 Dec 2011) | 10 lines
 
 Release 2.6
old mode 100755 (executable)
new mode 100644 (file)
index c0435dc..a5af21c
@@ -7,12 +7,12 @@
 # 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/>.
 #
 # 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@
+
+CFLAGS=-DF_CONF=\"@sysconfdir@/pound.cfg\" -DVERSION=\"@PACKAGE_VERSION@\" -DC_SSL=\"@C_SSL@\" -DC_T_RSA=\"@C_T_RSA@\" \
+       -DC_DH_LEN=\"@C_DH_LEN@\" -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
 
@@ -54,14 +45,17 @@ pound:      $(OBJS)
 poundctl:      poundctl.o
                ${CC} @LDFLAGS@ -o poundctl poundctl.o $(LIBS)
 
-dh2048.h:
-               openssl dhparam -5 -C -noout 2048 > dh2048.h
+dh512.h:
+               openssl dhparam -5 -C -noout 512 > dh512.h
 
-$(OBJS) poundctl.o:    pound.h config.h
+dh@C_DH_LEN@.h:
+               openssl dhparam -5 -C -noout @C_DH_LEN@ > dh@C_DH_LEN@.h
 
-svc.o:         svc.c dh2048.h
+svc.o:         svc.c dh512.h dh@C_DH_LEN@.h
                ${CC} ${CFLAGS} -c -o svc.o svc.c
 
+$(OBJS) poundctl.o:    pound.h config.h
+
 install:       all
                @INSTALL@ -d ${DESTDIR}@sbindir@
                @INSTALL@ -o @I_OWNER@ -g @I_GRP@ -m 555 pound ${DESTDIR}@sbindir@/pound
@@ -72,6 +66,7 @@ install:      all
 
 clean:
                rm -f pound $(OBJS) poundctl poundctl.o
+               rm -f dh512.h dh@C_DH_LEN@.h
 
 distclean:     clean
                -rm -f config.h config.log config.status Makefile
old mode 100755 (executable)
new mode 100644 (file)
index 7c769bd..de1e163
--- a/config.c
+++ b/config.c
 
 #include    "pound.h"
 
+#include    <openssl/x509v3.h>
+
 #ifdef MISS_FACILITYNAMES
 
 /* This is lifted verbatim from the Linux sys/syslog.h */
 
 typedef struct _code {
-       char    *c_name;
-       int     c_val;
+    char    *c_name;
+    int     c_val;
 } CODE;
 
 static CODE facilitynames[] = {
@@ -76,17 +78,18 @@ static regex_t  ListenHTTP, ListenHTTPS, End, Address, Port, Cert, xHTTP, Client
 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 regex_t  ClientCert, AddHeader, DisableProto, SSLAllowClientRenegotiation, SSLHonorCipherOrder, Ciphers;
+static regex_t  CAlist, VerifyList, CRLlist, NoHTTPS11, Grace, Include, ConnTO, IgnoreCase, HTTPS;
+static regex_t  Disabled, Threads, CNName, Anonymise, ECDHCurve;
 
 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]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$",
+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|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|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;
@@ -96,6 +99,11 @@ static int  be_to = 15;
 static int  be_connto = 15;
 static int  dynscale = 0;
 static int  ignore_case = 0;
+#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+static int  EC_nid = NID_X9_62_prime256v1;
+#endif
+#endif
 
 #define MAX_FIN 8
 
@@ -167,6 +175,54 @@ conf_fgets(char *buf, const int max)
     }
 }
 
+unsigned char **
+get_subjectaltnames(X509 *x509, unsigned int *count)
+{
+    unsigned int            local_count;
+    unsigned char           **result;
+    STACK_OF(GENERAL_NAME)  *san_stack = (STACK_OF(GENERAL_NAME)*)X509_get_ext_d2i(x509, NID_subject_alt_name, NULL, NULL);     
+    unsigned char           *temp[sk_GENERAL_NAME_num(san_stack)];
+    GENERAL_NAME            *name;
+    int                     i;
+
+    local_count = 0;
+    result = NULL;
+    name = NULL;
+    *count = 0;
+    if(san_stack == NULL)
+        return NULL;
+    while(sk_GENERAL_NAME_num(san_stack) > 0) {
+        name = sk_GENERAL_NAME_pop(san_stack);
+        switch(name->type) {
+            case GEN_DNS:
+                temp[local_count] = strndup(ASN1_STRING_data(name->d.dNSName), ASN1_STRING_length(name->d.dNSName)
+                                    + 1);
+                if(temp[local_count] == NULL)
+                    conf_err("out of memory");
+                local_count++;
+                break;
+            default:
+              logmsg(LOG_INFO, "unsupported subjectAltName type encountered: %i", name->type);
+        }
+        GENERAL_NAME_free(name);
+    }
+
+    result = (unsigned char**)malloc(sizeof(unsigned char*)*local_count);
+    if(result == NULL)
+        conf_err("out of memory");
+    for(i = 0;i < local_count; i++) {
+        result[i] = strndup(temp[i], strlen(temp[i])+1);
+        if(result[i] == NULL)
+            conf_err("out of memory");
+        free(temp[i]);
+    }
+    *count = local_count;
+
+    sk_GENERAL_NAME_pop_free(san_stack, GENERAL_NAME_free);
+
+    return result;
+}
+
 /*
  * parse a back-end
  */
@@ -200,7 +256,7 @@ parse_be(const int is_emergency)
             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(get_host(lin + matches[1].rm_so, &res->addr, PF_UNSPEC)) {
                 /* 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;
@@ -264,7 +320,7 @@ parse_be(const int is_emergency)
             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(get_host(lin + matches[1].rm_so, &res->ha_addr, PF_UNSPEC)) {
                 /* 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;
@@ -292,8 +348,11 @@ parse_be(const int is_emergency)
             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);
+#ifdef SSL_MODE_SEND_FALLBACK_SCSV
+            SSL_CTX_set_mode(res->ctx, SSL_MODE_SEND_FALLBACK_SCSV);
+#endif
             SSL_CTX_set_options(res->ctx, SSL_OP_ALL);
-#ifdef SSL_OP_NO_COMPRESSION
+#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);
@@ -302,10 +361,20 @@ parse_be(const int is_emergency)
             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);
+#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+            /* This generates a EC_KEY structure with no key, but a group defined */
+            EC_KEY *ecdh;
+            if((ecdh = EC_KEY_new_by_curve_name(EC_nid)) == NULL)
+                conf_err("Unable to generate temp ECDH key");
+            SSL_CTX_set_tmp_ecdh(res->ctx, ecdh);
+            SSL_CTX_set_options(res->ctx, SSL_OP_SINGLE_ECDH_USE);
+            EC_KEY_free(ecdh);
+#endif
+#endif
+        } else if(!regexec(&Cert, lin, 4, matches, 0)) {
+            if(res->ctx == NULL)
+                conf_err("BackEnd Cert can only be used after HTTPS - aborted");
             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");
@@ -313,18 +382,31 @@ parse_be(const int is_emergency)
                 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);
+        } else if(!regexec(&Ciphers, lin, 4, matches, 0)) {
+            if(res->ctx == NULL)
+                conf_err("BackEnd Ciphers can only be used after HTTPS - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            SSL_CTX_set_cipher_list(res->ctx, lin + matches[1].rm_so);
+        } else if(!regexec(&DisableProto, lin, 4, matches, 0)) {
+            if(res->ctx == NULL)
+                conf_err("BackEnd Disable can only be used after HTTPS - aborted");
+            lin[matches[1].rm_eo] = '\0';
+            if(strcasecmp(lin + matches[1].rm_so, "SSLv2") == 0)
+                SSL_CTX_set_options(res->ctx, SSL_OP_NO_SSLv2);
+            else if(strcasecmp(lin + matches[1].rm_so, "SSLv3") == 0)
+                SSL_CTX_set_options(res->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
+#ifdef SSL_OP_NO_TLSv1
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1") == 0)
+                SSL_CTX_set_options(res->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1);
+#endif
+#ifdef SSL_OP_NO_TLSv1_1
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1_1") == 0)
+                SSL_CTX_set_options(res->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1);
+#endif
+#ifdef SSL_OP_NO_TLSv1_2
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1_2") == 0)
+                SSL_CTX_set_options(res->ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2);
 #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)) {
@@ -613,9 +695,11 @@ parse_service(const char *svc_name)
         } 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;
+            for(be = res->backends; be; be = be->next) {
+                if(!be->disabled)
+                    res->tot_pri += be->priority;
+                res->abs_pri += be->priority;
+            }
             return res;
         } else {
             conf_err("unknown directive");
@@ -681,7 +765,7 @@ parse_HTTP(void)
             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(get_host(lin + matches[1].rm_so, &res->addr, PF_UNSPEC))
                 conf_err("Unknown Listener address");
             if(res->addr.ai_family != AF_INET && res->addr.ai_family != AF_INET6)
                 conf_err("Unknown Listener address family");
@@ -817,13 +901,24 @@ SNI_server_name(SSL *ssl, int *dummy, POUND_CTX *ctx)
     /* logmsg(LOG_DEBUG, "Received SSL SNI Header for servername %s", servername); */
 
     SSL_set_SSL_CTX(ssl, NULL);
-    for(pc = ctx; pc; pc = pc->next)
+    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;
         }
+        else if(pc->subjectAltNameCount > 0 && pc->subjectAltNames != NULL) {
+            int i;
 
+            for(i = 0; i < pc->subjectAltNameCount; i++) {
+                if(fnmatch(pc->subjectAltNames[i], server_name, 0) == 0) {
+                    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;
@@ -836,22 +931,23 @@ SNI_server_name(SSL *ssl, int *dummy, POUND_CTX *ctx)
 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;
+    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;
+    POUND_CTX           *pc;
 
     ssl_op_enable = SSL_OP_ALL;
-#ifdef SSL_OP_NO_COMPRESSION
+#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;
+    ssl_op_disable = SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION | SSL_OP_LEGACY_SERVER_CONNECT
+                    | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
 
     if((res = (LISTENER *)malloc(sizeof(LISTENER))) == NULL)
         conf_err("ListenHTTPS config: out of memory - aborted");
@@ -864,8 +960,6 @@ parse_HTTPS(void)
     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");
@@ -875,7 +969,7 @@ parse_HTTPS(void)
             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(get_host(lin + matches[1].rm_so, &res->addr, PF_UNSPEC))
                 conf_err("Unknown Listener address");
             if(res->addr.ai_family != AF_INET && res->addr.ai_family != AF_INET6)
                 conf_err("Unknown Listener address family");
@@ -981,6 +1075,9 @@ parse_HTTPS(void)
             fclose(fcert);
             memset(server_name, '\0', MAXBUF);
             X509_NAME_oneline(X509_get_subject_name(x509), server_name, MAXBUF - 1);
+            pc->subjectAltNameCount = 0;
+            pc->subjectAltNames = NULL;
+            pc->subjectAltNames = get_subjectaltnames(x509, &(pc->subjectAltNameCount));
             X509_free(x509);
             if(!regexec(&CNName, server_name, 4, matches, 0)) {
                 server_name[matches[1].rm_eo] = '\0';
@@ -1051,10 +1148,24 @@ parse_HTTPS(void)
                 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(&DisableProto, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if(strcasecmp(lin + matches[1].rm_so, "SSLv2") == 0)
+                ssl_op_enable |= SSL_OP_NO_SSLv2;
+            else if(strcasecmp(lin + matches[1].rm_so, "SSLv3") == 0)
+                ssl_op_enable |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+#ifdef SSL_OP_NO_TLSv1
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1") == 0)
+                ssl_op_enable |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1;
+#endif
+#ifdef SSL_OP_NO_TLSv1_1
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1_1") == 0)
+                ssl_op_enable |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;
+#endif
+#ifdef SSL_OP_NO_TLSv1_2
+            else if(strcasecmp(lin + matches[1].rm_so, "TLSv1_2") == 0)
+                ssl_op_enable |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
+#endif
         } else if(!regexec(&SSLAllowClientRenegotiation, lin, 4, matches, 0)) {
             res->allow_client_reneg = atoi(lin + matches[1].rm_so);
             if (res->allow_client_reneg == 2) {
@@ -1143,23 +1254,32 @@ parse_HTTPS(void)
             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");
+            if(res->ctx->next)
+                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);
-                SSL_CTX_set_options(pc->ctx, SSL_OP_NO_SSLv2);
-                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);
+#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+                /* This generates a EC_KEY structure with no key, but a group defined */
+                EC_KEY *ecdh;
+                if((ecdh = EC_KEY_new_by_curve_name(EC_nid)) == NULL)
+                    conf_err("Unable to generate temp ECDH key");
+                SSL_CTX_set_tmp_ecdh(pc->ctx, ecdh);
+                SSL_CTX_set_options(pc->ctx, SSL_OP_SINGLE_ECDH_USE);
+                EC_KEY_free(ecdh);
+#endif
+#endif
             }
             return res;
         } else {
@@ -1230,6 +1350,14 @@ parse_file(void)
             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 OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+        } else if(!regexec(&ECDHCurve, lin, 4, matches, 0)) {
+            lin[matches[1].rm_eo] = '\0';
+            if((EC_nid = OBJ_sn2nid(lin + matches[1].rm_so)) == 0)
+                conf_err("ECDHCurve config: invalid curve name");
+#endif
+#endif
 #if HAVE_OPENSSL_ENGINE_H
         } else if(!regexec(&SSLEngine, lin, 4, matches, 0)) {
             lin[matches[1].rm_eo] = '\0';
@@ -1287,6 +1415,8 @@ parse_file(void)
                     ;
                 svc->next = parse_service(lin + matches[1].rm_so);
             }
+        } else if(!regexec(&Anonymise, lin, 4, matches, 0)) {
+            anonymise = 1;
         } else {
             conf_err("unknown directive - aborted");
         }
@@ -1355,8 +1485,7 @@ config_parse(const int argc, char **const argv)
     || 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(&DisableProto, "^[ \t]*Disable[ \t]+(SSLv2|SSLv3|TLSv1|TLSv1_1|TLSv1_2)[ \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)
@@ -1367,9 +1496,14 @@ config_parse(const int argc, char **const argv)
     || 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(&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)
+    || regcomp(&Anonymise, "^[ \t]*Anonymise[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+    || regcomp(&ECDHCurve, "^[ \t]*ECDHCurve[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+#endif
+#endif
     ) {
         logmsg(LOG_ERR, "bad config Regex - aborted");
         exit(1);
@@ -1426,6 +1560,10 @@ config_parse(const int argc, char **const argv)
             if(strcmp(C_GROUP, ""))
                 logmsg(LOG_DEBUG, "    --with-group=%s", C_GROUP);
 #endif
+#ifdef  C_DH_LEN
+            if(strcmp(C_DH_LEN, "0"))
+                logmsg(LOG_DEBUG, "    --with-dh=%s", C_DH_LEN);
+#endif
             logmsg(LOG_DEBUG, "Exiting...");
             exit(0);
             break;
@@ -1517,8 +1655,7 @@ config_parse(const int argc, char **const argv)
     regfree(&ClientCert);
     regfree(&AddHeader);
     regfree(&SSLAllowClientRenegotiation);
-    regfree(&DisableSSLv2);
-    regfree(&DisableSSLv3);
+    regfree(&DisableProto);
     regfree(&SSLHonorCipherOrder);
     regfree(&Ciphers);
     regfree(&CAlist);
@@ -1529,9 +1666,14 @@ config_parse(const int argc, char **const argv)
     regfree(&ConnTO);
     regfree(&IgnoreCase);
     regfree(&HTTPS);
-    regfree(&HTTPSCert);
     regfree(&Disabled);
     regfree(&CNName);
+    regfree(&Anonymise);
+#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
+#ifndef OPENSSL_NO_ECDH
+    regfree(&ECDHCurve);
+#endif
+#endif
 
     /* set the facility only here to ensure the syslog gets opened if necessary */
     log_facility = def_facility;
index dec7033..fbf6e11 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,13 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for pound 2.6.
+# Generated by GNU Autoconf 2.69 for pound 2.7.
 #
 # 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.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -91,6 +89,7 @@ fi
 IFS=" ""       $as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
 case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -135,6 +134,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -168,7 +192,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -213,14 +238,25 @@ 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+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -319,10 +355,18 @@ $as_echo X"$as_dir" |
       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"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -359,19 +403,19 @@ else
 fi # as_fn_arith
 
 
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
 # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
 # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# 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
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $1" >&2
+  $as_echo "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -444,6 +488,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -478,16 +526,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... 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'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -499,28 +547,8 @@ else
   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
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -533,7 +561,7 @@ 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,
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
@@ -552,12 +580,13 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='pound'
 PACKAGE_TARNAME='pound'
-PACKAGE_VERSION='2.6'
-PACKAGE_STRING='pound 2.6'
+PACKAGE_VERSION='2.7'
+PACKAGE_STRING='pound 2.7'
 PACKAGE_BUGREPORT='roseg@apsis.ch'
 PACKAGE_URL=''
 
 ac_unique_file="pound.c"
+ac_c_werror_flag=
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -606,6 +635,7 @@ C_SUPER
 C_GROUP
 C_OWNER
 C_MAXBUF
+C_DH_LEN
 C_T_RSA
 C_SSL
 PTHREAD_CFLAGS
@@ -677,6 +707,7 @@ ac_user_opts='
 enable_option_checking
 with_ssl
 with_t_rsa
+with_dh
 with_maxbuf
 with_owner
 with_group
@@ -757,8 +788,9 @@ do
   fi
 
   case $ac_option in
-  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)   ac_optarg=yes ;;
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
   esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
@@ -803,7 +835,7 @@ do
     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"
+      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
@@ -829,7 +861,7 @@ do
     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"
+      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
@@ -1033,7 +1065,7 @@ do
     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"
+      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
@@ -1049,7 +1081,7 @@ do
     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"
+      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
@@ -1079,8 +1111,8 @@ do
   | --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."
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
     ;;
 
   *=*)
@@ -1088,7 +1120,7 @@ Try \`$0 --help' for more information."
     # 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'" ;;
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
     esac
     eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
@@ -1098,7 +1130,7 @@ Try \`$0 --help' for more information."
     $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}
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
     ;;
 
   esac
@@ -1106,13 +1138,13 @@ done
 
 if test -n "$ac_prev"; then
   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
+  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" ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
     *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
   esac
 fi
@@ -1135,7 +1167,7 @@ do
     [\\/$]* | ?:[\\/]* )  continue;;
     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+  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'
@@ -1149,8 +1181,6 @@ target=$target_alias
 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
@@ -1165,9 +1195,9 @@ 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"
+  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"
+  as_fn_error $? "pwd does not report name of working directory"
 
 
 # Find the source files, if location was not specified.
@@ -1206,11 +1236,11 @@ else
 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"
+  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"
+       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
@@ -1236,7 +1266,7 @@ 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.
+\`configure' configures pound 2.7 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1250,7 +1280,7 @@ Configuration:
       --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
+  -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
@@ -1302,7 +1332,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pound 2.6:";;
+     short | recursive ) echo "Configuration of pound 2.7:";;
    esac
   cat <<\_ACEOF
 
@@ -1326,6 +1356,8 @@ Optional Packages:
   --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-dh=nnn           DH key length parameter (default: 2048, can set to
+                          1024
   --with-maxbuf=nnn       Value of the MAXBUF parameter (default: 4096)
   --with-owner=name       The account that will own the files installed by
                           Pound
@@ -1407,10 +1439,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pound configure 2.6
-generated by GNU Autoconf 2.65
+pound configure 2.7
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1454,7 +1486,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
        ac_retval=1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_compile
@@ -1486,7 +1518,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -1500,7 +1532,7 @@ fi
   # interfere with the next link command; also delete a directory that is
   # left behind by Apple's compiler.  We do this before executing the actions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_link
@@ -1526,7 +1558,7 @@ $as_echo "$ac_try_echo"; } >&5
     mv -f conftest.er1 conftest.err
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } >/dev/null && {
+  test $ac_status = 0; } > conftest.i && {
         test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
         test ! -s conftest.err
        }; then :
@@ -1537,7 +1569,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
     ac_retval=1
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_cpp
@@ -1579,7 +1611,7 @@ sed 's/^/| /' conftest.$ac_ext >&5
        ac_retval=$ac_status
 fi
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
 } # ac_fn_c_try_run
@@ -1592,10 +1624,10 @@ fi
 ac_fn_c_check_header_mongrel ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+  if eval \${$3+:} false; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 fi
 eval ac_res=\$$3
@@ -1631,7 +1663,7 @@ if ac_fn_c_try_cpp "$LINENO"; then :
 else
   ac_header_preproc=no
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
 $as_echo "$ac_header_preproc" >&6; }
 
@@ -1654,17 +1686,15 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( cat <<\_ASBOX
-## ----------------------------- ##
+( $as_echo "## ----------------------------- ##
 ## Report this to roseg@apsis.ch ##
-## ----------------------------- ##
-_ASBOX
+## ----------------------------- ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=\$ac_header_compiler"
@@ -1673,7 +1703,7 @@ eval ac_res=\$$3
               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
 fi
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_header_mongrel
 
@@ -1686,7 +1716,7 @@ ac_fn_c_check_header_compile ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1704,7 +1734,7 @@ fi
 eval ac_res=\$$3
               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_header_compile
 
@@ -1717,7 +1747,7 @@ ac_fn_c_check_type ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   eval "$3=no"
@@ -1758,7 +1788,7 @@ fi
 eval ac_res=\$$3
               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_type
 
@@ -1770,7 +1800,7 @@ ac_fn_c_check_func ()
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
 $as_echo_n "checking for $2... " >&6; }
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
+if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -1825,15 +1855,15 @@ fi
 eval ac_res=\$$3
               { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_func
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pound $as_me 2.6, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
+It was created by pound $as_me 2.7, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -1943,11 +1973,9 @@ trap 'exit_status=$?
   {
     echo
 
-    cat <<\_ASBOX
-## ---------------- ##
+    $as_echo "## ---------------- ##
 ## Cache variables. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
     echo
     # The following way of writing the cache mishandles newlines in values,
 (
@@ -1981,11 +2009,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
 )
     echo
 
-    cat <<\_ASBOX
-## ----------------- ##
+    $as_echo "## ----------------- ##
 ## Output variables. ##
-## ----------------- ##
-_ASBOX
+## ----------------- ##"
     echo
     for ac_var in $ac_subst_vars
     do
@@ -1998,11 +2024,9 @@ _ASBOX
     echo
 
     if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
+      $as_echo "## ------------------- ##
 ## File substitutions. ##
-## ------------------- ##
-_ASBOX
+## ------------------- ##"
       echo
       for ac_var in $ac_subst_files
       do
@@ -2016,11 +2040,9 @@ _ASBOX
     fi
 
     if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
+      $as_echo "## ----------- ##
 ## confdefs.h. ##
-## ----------- ##
-_ASBOX
+## ----------- ##"
       echo
       cat confdefs.h
       echo
@@ -2075,7 +2097,12 @@ _ACEOF
 ac_site_file1=NONE
 ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
 elif test "x$prefix" != xNONE; then
   ac_site_file1=$prefix/share/config.site
   ac_site_file2=$prefix/etc/config.site
@@ -2090,7 +2117,11 @@ do
     { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
 $as_echo "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
   fi
 done
 
@@ -2166,7 +2197,7 @@ if $ac_cache_corrupted; then
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
   { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
 fi
 ## -------------------- ##
 ## Main body of script. ##
@@ -2189,12 +2220,18 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2206,7 +2243,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2234,7 +2271,7 @@ if test -z "$ac_cv_prog_CC"; then
 set dummy gcc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2246,7 +2283,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2287,7 +2324,7 @@ if test -z "$CC"; then
 set dummy ${ac_tool_prefix}cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2299,7 +2336,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2327,7 +2364,7 @@ if test -z "$CC"; then
 set dummy cc; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2340,7 +2377,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -2386,7 +2423,7 @@ if test -z "$CC"; then
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
@@ -2398,7 +2435,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2430,7 +2467,7 @@ do
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
@@ -2442,7 +2479,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2484,8 +2521,8 @@ fi
 
 test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "no acceptable C compiler found in \$PATH
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
 
 # Provide some information about the compiler.
 $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -2599,9 +2636,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-{ as_fn_set_status 77
-as_fn_error "C compiler cannot create executables
-See \`config.log' for more details." "$LINENO" 5; }; }
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
@@ -2643,8 +2679,8 @@ done
 else
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest conftest$ac_cv_exeext
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -2701,9 +2737,9 @@ $as_echo "$ac_try_echo"; } >&5
     else
        { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot run C compiled programs.
+as_fn_error $? "cannot run C compiled programs.
 If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." "$LINENO" 5; }
+See \`config.log' for more details" "$LINENO" 5; }
     fi
   fi
 fi
@@ -2714,7 +2750,7 @@ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
 ac_clean_files=$ac_clean_files_save
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
 $as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
+if ${ac_cv_objext+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2754,8 +2790,8 @@ sed 's/^/| /' conftest.$ac_ext >&5
 
 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
@@ -2765,7 +2801,7 @@ OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2802,7 +2838,7 @@ ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
 $as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
@@ -2880,7 +2916,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
@@ -2889,8 +2925,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -2975,18 +3010,86 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  for ac_t in install-sh install.sh shtool; do
-    if test -f "$ac_dir/$ac_t"; then
-      ac_aux_dir=$ac_dir
-      ac_install_sh="$ac_aux_dir/$ac_t -c"
-      break 2
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
     fi
   done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
 done
 if test -z "$ac_aux_dir"; then
-  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
 fi
 
 # These three variables are undocumented and unsupported,
@@ -3015,7 +3118,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
 $as_echo_n "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then :
+if ${ac_cv_path_install+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -3035,7 +3138,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -3093,27 +3196,27 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
 $as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
+if ${ac_cv_build+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_build_alias=$build_alias
 test "x$ac_build_alias" = x &&
   ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
 test "x$ac_build_alias" = x &&
-  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
 $as_echo "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
 esac
 build=$ac_cv_build
 ac_save_IFS=$IFS; IFS='-'
@@ -3131,14 +3234,14 @@ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
 $as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
+if ${ac_cv_host+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "x$host_alias" = x; then
   ac_cv_host=$ac_cv_build
 else
   ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
 fi
 
 fi
@@ -3146,7 +3249,7 @@ fi
 $as_echo "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
 esac
 host=$ac_cv_host
 ac_save_IFS=$IFS; IFS='-'
@@ -3164,14 +3267,14 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
 $as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
+if ${ac_cv_target+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "x$target_alias" = x; then
   ac_cv_target=$ac_cv_host
 else
   ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
 fi
 
 fi
@@ -3179,7 +3282,7 @@ fi
 $as_echo "$ac_cv_target" >&6; }
 case $ac_cv_target in
 *-*-*) ;;
-*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
 esac
 target=$ac_cv_target
 ac_save_IFS=$IFS; IFS='-'
@@ -3230,9 +3333,53 @@ test -n "$target_alias" &&
 
 CPPFLAGS="${CPPFLAGS} -D_REENTRANT -D_THREAD_SAFE"
 
+# if the compiler is gcc, test which flags are supported
 if  test "${CC}" = "gcc"
 then
-    CPPFLAGS="${CPPFLAGS} -Wstrict-prototypes -Wno-unused-result -pipe"
+
+ac_c_werror_flag=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking gcc arguments" >&5
+$as_echo_n "checking gcc arguments... " >&6; }
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -Wstrict-prototypes"
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int x;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$save_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -Wno-unused-result"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int x;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$save_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    save_CFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -pipe"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int x;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  CFLAGS="$save_CFLAGS"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CFLAGS" >&5
+$as_echo "$CFLAGS" >&6; }
+    ac_c_werror_flag=""
 fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: *** Checking for threads library and/or flags ***" >&5
@@ -3242,7 +3389,6 @@ $as_echo "$as_me: *** Checking for threads library and/or flags ***" >&6;}
 
 
 
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3364,7 +3510,7 @@ $as_echo_n "checking whether pthreads work with $flag... " >&6; }
 set dummy pthread-config; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_acx_pthread_config+set}" = set; then :
+if ${ac_cv_prog_acx_pthread_config+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$acx_pthread_config"; then
@@ -3376,7 +3522,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_acx_pthread_config="yes"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3539,7 +3685,7 @@ $as_echo "${flag}" >&6; }
 set dummy cc_r; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then :
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -n "$PTHREAD_CC"; then
@@ -3551,7 +3697,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_PTHREAD_CC="cc_r"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3621,6 +3767,16 @@ fi
 
 
 
+# Check whether --with-dh was given.
+if test "${with_dh+set}" = set; then :
+  withval=$with_dh; CPPFLAGS="-DDH_LEN=${with_dh} ${CPPFLAGS}"; C_DH_LEN="${with_dh}"
+else
+  CPPFLAGS="-DDH_LEN=2048 ${CPPFLAGS}"; C_DH_LEN="2048"
+fi
+
+
+
+
 # Check whether --with-maxbuf was given.
 if test "${with_maxbuf+set}" = set; then :
   withval=$with_maxbuf; CPPFLAGS="-DMAXBUF=${with_maxbuf} ${CPPFLAGS}"; C_MAXBUF="${with_maxbuf}"
@@ -3697,7 +3853,7 @@ $as_echo "$as_me: *** Checking for libraries ***" >&6;}
 LIBS="${LIBS} -lm"
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+if ${ac_cv_lib_dl_dlopen+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3731,7 +3887,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_LIBDL 1
 _ACEOF
@@ -3742,7 +3898,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
 $as_echo_n "checking for socket in -lsocket... " >&6; }
-if test "${ac_cv_lib_socket_socket+set}" = set; then :
+if ${ac_cv_lib_socket_socket+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3776,13 +3932,13 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
 $as_echo "$ac_cv_lib_socket_socket" >&6; }
-if test "x$ac_cv_lib_socket_socket" = x""yes; then :
+if test "x$ac_cv_lib_socket_socket" = xyes; then :
   LIBS="-lsocket -lnsl ${LIBS}"
 fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hstrerror in -lresolv" >&5
 $as_echo_n "checking for hstrerror in -lresolv... " >&6; }
-if test "${ac_cv_lib_resolv_hstrerror+set}" = set; then :
+if ${ac_cv_lib_resolv_hstrerror+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3816,13 +3972,13 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_hstrerror" >&5
 $as_echo "$ac_cv_lib_resolv_hstrerror" >&6; }
-if test "x$ac_cv_lib_resolv_hstrerror" = x""yes; then :
+if test "x$ac_cv_lib_resolv_hstrerror" = xyes; then :
   LIBS="-lresolv ${LIBS}"
 fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BIO_new in -lcrypto" >&5
 $as_echo_n "checking for BIO_new in -lcrypto... " >&6; }
-if test "${ac_cv_lib_crypto_BIO_new+set}" = set; then :
+if ${ac_cv_lib_crypto_BIO_new+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3856,7 +4012,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_BIO_new" >&5
 $as_echo "$ac_cv_lib_crypto_BIO_new" >&6; }
-if test "x$ac_cv_lib_crypto_BIO_new" = x""yes; then :
+if test "x$ac_cv_lib_crypto_BIO_new" = xyes; then :
   LIBS="-lcrypto ${LIBS}"
 else
   echo 'Missing OpenSSL (-lcrypto) - aborted'; exit 1
@@ -3864,7 +4020,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_CTX_new in -lssl" >&5
 $as_echo_n "checking for SSL_CTX_new in -lssl... " >&6; }
-if test "${ac_cv_lib_ssl_SSL_CTX_new+set}" = set; then :
+if ${ac_cv_lib_ssl_SSL_CTX_new+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3898,7 +4054,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_CTX_new" >&5
 $as_echo "$ac_cv_lib_ssl_SSL_CTX_new" >&6; }
-if test "x$ac_cv_lib_ssl_SSL_CTX_new" = x""yes; then :
+if test "x$ac_cv_lib_ssl_SSL_CTX_new" = xyes; then :
   LIBS="-lssl ${LIBS}"
 else
   echo 'Missing OpenSSL (-lssl) - aborted'; exit 1
@@ -3907,7 +4063,7 @@ fi
 if test x"$C_PCREPOSIX" = xyes; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regcomp in -lpcreposix" >&5
 $as_echo_n "checking for regcomp in -lpcreposix... " >&6; }
-if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then :
+if ${ac_cv_lib_pcreposix_regcomp+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3941,7 +4097,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regcomp" >&5
 $as_echo "$ac_cv_lib_pcreposix_regcomp" >&6; }
-if test "x$ac_cv_lib_pcreposix_regcomp" = x""yes; then :
+if test "x$ac_cv_lib_pcreposix_regcomp" = xyes; then :
   LIBS="-lpcreposix ${LIBS}";
 $as_echo "#define HAVE_LIBPCREPOSIX 1" >>confdefs.h
 
@@ -3951,7 +4107,7 @@ else
         LIBS="-lpcre $LIBS"
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for regexec in -lpcreposix" >&5
 $as_echo_n "checking for regexec in -lpcreposix... " >&6; }
-if test "${ac_cv_lib_pcreposix_regexec+set}" = set; then :
+if ${ac_cv_lib_pcreposix_regexec+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -3985,7 +4141,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcreposix_regexec" >&5
 $as_echo "$ac_cv_lib_pcreposix_regexec" >&6; }
-if test "x$ac_cv_lib_pcreposix_regexec" = x""yes; then :
+if test "x$ac_cv_lib_pcreposix_regexec" = xyes; then :
   LIBS="-lpcreposix -lpcre $save_LIBS";
 $as_echo "#define HAVE_LIBPCREPOSIX 1" >>confdefs.h
 
@@ -4000,7 +4156,7 @@ fi
 if test x"$C_TCMALLOC" = xyes; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for malloc in -ltcmalloc" >&5
 $as_echo_n "checking for malloc in -ltcmalloc... " >&6; }
-if test "${ac_cv_lib_tcmalloc_malloc+set}" = set; then :
+if ${ac_cv_lib_tcmalloc_malloc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -4034,7 +4190,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tcmalloc_malloc" >&5
 $as_echo "$ac_cv_lib_tcmalloc_malloc" >&6; }
-if test "x$ac_cv_lib_tcmalloc_malloc" = x""yes; then :
+if test "x$ac_cv_lib_tcmalloc_malloc" = xyes; then :
   LIBS="${LIBS} -ltcmalloc"
 fi
 
@@ -4042,7 +4198,7 @@ else
 if test x"$C_HOARD" = xyes; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for malloc in -lhoard" >&5
 $as_echo_n "checking for malloc in -lhoard... " >&6; }
-if test "${ac_cv_lib_hoard_malloc+set}" = set; then :
+if ${ac_cv_lib_hoard_malloc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -4076,7 +4232,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_hoard_malloc" >&5
 $as_echo "$ac_cv_lib_hoard_malloc" >&6; }
-if test "x$ac_cv_lib_hoard_malloc" = x""yes; then :
+if test "x$ac_cv_lib_hoard_malloc" = xyes; then :
   LIBS="${LIBS} -lhoard"
 fi
 
@@ -4126,7 +4282,7 @@ if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then :
+  if ${ac_cv_prog_CPP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
       # Double quotes because CPP needs to be expanded
@@ -4156,7 +4312,7 @@ else
   # Broken: fails on valid input.
 continue
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
   # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
@@ -4172,11 +4328,11 @@ else
 ac_preproc_ok=:
 break
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.i conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then :
   break
 fi
@@ -4215,7 +4371,7 @@ else
   # Broken: fails on valid input.
 continue
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
   # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
@@ -4231,18 +4387,18 @@ else
 ac_preproc_ok=:
 break
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.i conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then :
 
 else
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." "$LINENO" 5; }
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 
 ac_ext=c
@@ -4254,7 +4410,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
 $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
+if ${ac_cv_path_GREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$GREP"; then
@@ -4268,7 +4424,7 @@ do
     for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+      as_fn_executable_p "$ac_path_GREP" || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
@@ -4303,7 +4459,7 @@ esac
   done
 IFS=$as_save_IFS
   if test -z "$ac_cv_path_GREP"; then
-    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
   fi
 else
   ac_cv_path_GREP=$GREP
@@ -4317,7 +4473,7 @@ $as_echo "$ac_cv_path_GREP" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
 $as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
+if ${ac_cv_path_EGREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -4334,7 +4490,7 @@ do
     for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+      as_fn_executable_p "$ac_path_EGREP" || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
@@ -4369,7 +4525,7 @@ esac
   done
 IFS=$as_save_IFS
   if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
   fi
 else
   ac_cv_path_EGREP=$EGREP
@@ -4384,7 +4540,7 @@ $as_echo "$ac_cv_path_EGREP" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
 $as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
+if ${ac_cv_header_stdc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4501,8 +4657,7 @@ do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
 "
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
 #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
@@ -4516,8 +4671,7 @@ for ac_header in arpa/inet.h errno.h netdb.h netinet/in.h netinet/tcp.h stdlib.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
 #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
@@ -4596,7 +4750,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
 $as_echo_n "checking return type of signal handlers... " >&6; }
-if test "${ac_cv_type_signal+set}" = set; then :
+if ${ac_cv_type_signal+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4629,7 +4783,7 @@ _ACEOF
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
 $as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if test "${ac_cv_c_const+set}" = set; then :
+if ${ac_cv_c_const+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4638,11 +4792,11 @@ else
 int
 main ()
 {
-/* FIXME: Include the comments suggested by Paul. */
+
 #ifndef __cplusplus
-  /* Ultrix mips cc rejects this.  */
+  /* Ultrix mips cc rejects this sort of thing.  */
   typedef int charset[2];
-  const charset cs;
+  const charset cs = { 0, 0 };
   /* SunOS 4.1.1 cc rejects this.  */
   char const *const *pcpcc;
   char **ppc;
@@ -4659,8 +4813,9 @@ main ()
   ++pcpcc;
   ppc = (char**) pcpcc;
   pcpcc = (char const *const *) ppc;
-  { /* SCO 3.2v4 cc rejects this.  */
-    char *t;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
     char const *s = 0 ? (char *) 0 : (char const *) 0;
 
     *t++ = 0;
@@ -4676,10 +4831,10 @@ main ()
     iptr p = 0;
     ++p;
   }
-  { /* AIX XL C 1.02.0.0 rejects this saying
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
        "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; };
-    struct s *b; b->j = 5;
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
   }
   { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
     const int foo = 10;
@@ -4709,7 +4864,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
 $as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if test "${ac_cv_type_uid_t+set}" = set; then :
+if ${ac_cv_type_uid_t+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4738,7 +4893,7 @@ $as_echo "#define gid_t int" >>confdefs.h
 fi
 
 ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = x""yes; then :
+if test "x$ac_cv_type_pid_t" = xyes; then :
 
 else
 
@@ -4750,7 +4905,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if test "${ac_cv_header_time+set}" = set; then :
+if ${ac_cv_header_time+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4784,27 +4939,29 @@ $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
 fi
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
-$as_echo_n "checking for long long int... " >&6; }
-if test "${ac_cv_type_long_long_int+set}" = set; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
+$as_echo_n "checking for unsigned long long int... " >&6; }
+if ${ac_cv_type_unsigned_long_long_int+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
   /* For now, do not test the preprocessor; as of 2007 there are too many
-        implementations with broken preprocessors.  Perhaps this can
-        be revisited in 2012.  In the meantime, code should not expect
-        #if to work with literals wider than 32 bits.  */
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
       /* Test literals.  */
       long long int ll = 9223372036854775807ll;
       long long int nll = -9223372036854775807LL;
       unsigned long long int ull = 18446744073709551615ULL;
       /* Test constant expressions.   */
       typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-                    ? 1 : -1)];
+                     ? 1 : -1)];
       typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
-                    ? 1 : -1)];
+                     ? 1 : -1)];
       int i = 63;
 int
 main ()
@@ -4813,46 +4970,73 @@ main ()
       long long int llmax = 9223372036854775807ll;
       unsigned long long int ullmax = 18446744073709551615ull;
       return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
-             | (llmax / ll) | (llmax % ll)
-             | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
-             | (ullmax / ull) | (ullmax % ull));
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));
   ;
   return 0;
 }
 
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-                       if test "$cross_compiling" = yes; then :
+
+else
+  ac_cv_type_unsigned_long_long_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
+$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+  fi
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
+$as_echo_n "checking for long long int... " >&6; }
+if ${ac_cv_type_long_long_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
   ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+                                        if test "$cross_compiling" = yes; then :
+  :
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <limits.h>
-              #ifndef LLONG_MAX
-              # define HALF \
-                       (1LL << (sizeof (long long int) * CHAR_BIT - 2))
-              # define LLONG_MAX (HALF - 1 + HALF)
-              #endif
+                 #ifndef LLONG_MAX
+                 # define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 # define LLONG_MAX (HALF - 1 + HALF)
+                 #endif
 int
 main ()
 {
 long long int n = 1;
-              int i;
-              for (i = 0; ; i++)
-                {
-                  long long int m = n << i;
-                  if (m >> i != n)
-                    return 1;
-                  if (LLONG_MAX / 2 < m)
-                    break;
-                }
-              return 0;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_type_long_long_int=yes
+
 else
   ac_cv_type_long_long_int=no
 fi
@@ -4860,11 +5044,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-else
-  ac_cv_type_long_long_int=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+        fi
+      fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5
 $as_echo "$ac_cv_type_long_long_int" >&6; }
@@ -4877,7 +5058,7 @@ $as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
 ac_fn_c_check_type "$LINENO" "in_addr_t" "ac_cv_type_in_addr_t" "#include <sys/types.h>
 #include <netinet/in.h>
 "
-if test "x$ac_cv_type_in_addr_t" = x""yes; then :
+if test "x$ac_cv_type_in_addr_t" = xyes; then :
 
 else
   CFLAGS="${CFLAGS} -DNEED_INADDRT"
@@ -4886,7 +5067,7 @@ fi
 ac_fn_c_check_type "$LINENO" "in_port_t" "ac_cv_type_in_port_t" "#include <sys/types.h>
 #include <netinet/in.h>
 "
-if test "x$ac_cv_type_in_port_t" = x""yes; then :
+if test "x$ac_cv_type_in_port_t" = xyes; then :
 
 else
   CFLAGS="${CFLAGS} -DNEED_INPORTT"
@@ -4894,7 +5075,7 @@ fi
 
 ac_fn_c_check_type "$LINENO" "time_t" "ac_cv_type_time_t" "#include <time.h>
 "
-if test "x$ac_cv_type_time_t" = x""yes; then :
+if test "x$ac_cv_type_time_t" = xyes; then :
 
 else
   CFLAGS="${CFLAGS} -DNEED_TIMET"
@@ -4904,7 +5085,7 @@ fi
 for ac_header in vfork.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
-if test "x$ac_cv_header_vfork_h" = x""yes; then :
+if test "x$ac_cv_header_vfork_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_VFORK_H 1
 _ACEOF
@@ -4917,8 +5098,7 @@ for ac_func in fork vfork
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
 #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
@@ -4929,7 +5109,7 @@ done
 if test "x$ac_cv_func_fork" = xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
 $as_echo_n "checking for working fork... " >&6; }
-if test "${ac_cv_func_fork_works+set}" = set; then :
+if ${ac_cv_func_fork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -4982,7 +5162,7 @@ ac_cv_func_vfork_works=$ac_cv_func_vfork
 if test "x$ac_cv_func_vfork" = xyes; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
 $as_echo_n "checking for working vfork... " >&6; }
-if test "${ac_cv_func_vfork_works+set}" = set; then :
+if ${ac_cv_func_vfork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -5117,7 +5297,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5
 $as_echo_n "checking for working memcmp... " >&6; }
-if test "${ac_cv_func_memcmp_working+set}" = set; then :
+if ${ac_cv_func_memcmp_working+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -5181,8 +5361,7 @@ for ac_header in sys/select.h sys/socket.h
 do :
   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-eval as_val=\$$as_ac_Header
-   if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
 #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
@@ -5193,7 +5372,7 @@ done
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5
 $as_echo_n "checking types of arguments for select... " >&6; }
-if test "${ac_cv_func_select_args+set}" = set; then :
+if ${ac_cv_func_select_args+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   for ac_arg234 in 'fd_set *' 'int *' 'void *'; do
@@ -5227,7 +5406,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
 done
 # Provide a safe default value.
-: ${ac_cv_func_select_args='int,int *,struct timeval *'}
+: "${ac_cv_func_select_args=int,int *,struct timeval *}"
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5
@@ -5255,7 +5434,7 @@ rm -f conftest*
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
 $as_echo_n "checking return type of signal handlers... " >&6; }
-if test "${ac_cv_type_signal+set}" = set; then :
+if ${ac_cv_type_signal+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5288,7 +5467,7 @@ _ACEOF
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
 $as_echo_n "checking whether lstat correctly handles trailing slash... " >&6; }
-if test "${ac_cv_func_lstat_dereferences_slashed_symlink+set}" = set; then :
+if ${ac_cv_func_lstat_dereferences_slashed_symlink+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   rm -f conftest.sym conftest.file
@@ -5350,7 +5529,7 @@ fi
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5
 $as_echo_n "checking whether stat accepts an empty string... " >&6; }
-if test "${ac_cv_func_stat_empty_string_bug+set}" = set; then :
+if ${ac_cv_func_stat_empty_string_bug+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then :
@@ -5397,7 +5576,7 @@ fi
 for ac_func in strftime
 do :
   ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime"
-if test "x$ac_cv_func_strftime" = x""yes; then :
+if test "x$ac_cv_func_strftime" = xyes; then :
   cat >>confdefs.h <<_ACEOF
 #define HAVE_STRFTIME 1
 _ACEOF
@@ -5406,7 +5585,7 @@ else
   # strftime is in -lintl on SCO UNIX.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5
 $as_echo_n "checking for strftime in -lintl... " >&6; }
-if test "${ac_cv_lib_intl_strftime+set}" = set; then :
+if ${ac_cv_lib_intl_strftime+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -5440,7 +5619,7 @@ LIBS=$ac_check_lib_save_LIBS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5
 $as_echo "$ac_cv_lib_intl_strftime" >&6; }
-if test "x$ac_cv_lib_intl_strftime" = x""yes; then :
+if test "x$ac_cv_lib_intl_strftime" = xyes; then :
   $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h
 
 LIBS="-lintl $LIBS"
@@ -5453,8 +5632,7 @@ for ac_func in getaddrinfo inet_ntop memset regcomp poll socket strcasecmp strch
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-eval as_val=\$$as_ac_var
-   if test "x$as_val" = x""yes; then :
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
 #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
@@ -5551,10 +5729,21 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
+    if test "x$cache_file" != "x/dev/null"; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
 $as_echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -5570,6 +5759,7 @@ DEFS=-DHAVE_CONFIG_H
 
 ac_libobjs=
 ac_ltlibobjs=
+U=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
@@ -5585,7 +5775,7 @@ LTLIBOBJS=$ac_ltlibobjs
 
 
 
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
 ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@@ -5686,6 +5876,7 @@ fi
 IFS=" ""       $as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
 case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -5731,19 +5922,19 @@ export LANGUAGE
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
 # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
 # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# 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
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $1" >&2
+  $as_echo "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -5881,16 +6072,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... 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'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -5939,7 +6130,7 @@ $as_echo X"$as_dir" |
       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"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
 
 
 } # as_fn_mkdir_p
@@ -5950,28 +6141,16 @@ else
   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
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -5992,8 +6171,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pound $as_me 2.6, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
+This file was extended by pound $as_me 2.7, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -6054,11 +6233,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pound config.status 2.6
-configured by $0, generated by GNU Autoconf 2.65,
+pound config.status 2.7
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -6074,11 +6253,16 @@ ac_need_defaults=:
 while test $# != 0
 do
   case $1 in
-  --*=*)
+  --*=?*)
     ac_option=`expr "X$1" : 'X\([^=]*\)='`
     ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
   *)
     ac_option=$1
     ac_optarg=$2
@@ -6100,6 +6284,7 @@ do
     $ac_shift
     case $ac_optarg in
     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
     esac
     as_fn_append CONFIG_FILES " '$ac_optarg'"
     ac_need_defaults=false;;
@@ -6112,7 +6297,7 @@ do
     ac_need_defaults=false;;
   --he | --h)
     # Conflict between --help and --header
-    as_fn_error "ambiguous option: \`$1'
+    as_fn_error $? "ambiguous option: \`$1'
 Try \`$0 --help' for more information.";;
   --help | --hel | -h )
     $as_echo "$ac_cs_usage"; exit ;;
@@ -6121,7 +6306,7 @@ Try \`$0 --help' for more information.";;
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
+  -*) as_fn_error $? "unrecognized option: \`$1'
 Try \`$0 --help' for more information." ;;
 
   *) as_fn_append ac_config_targets " $1"
@@ -6141,7 +6326,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -6173,7 +6358,7 @@ do
     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
 
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
   esac
 done
 
@@ -6195,9 +6380,10 @@ fi
 # after its creation but before its name has been assigned to `$tmp'.
 $debug ||
 {
-  tmp=
+  tmp= ac_tmp=
   trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
 ' 0
   trap 'as_fn_exit 1' 1 2 13 15
 }
@@ -6205,12 +6391,13 @@ $debug ||
 
 {
   tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
+  test -d "$tmp"
 }  ||
 {
   tmp=./conf$$-$RANDOM
   (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
 
 # Set up the scripts for CONFIG_FILES section.
 # No need to generate them if there are no CONFIG_FILES.
@@ -6227,12 +6414,12 @@ if test "x$ac_cr" = x; then
 fi
 ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
 if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
+  ac_cs_awk_cr='\\r'
 else
   ac_cs_awk_cr=$ac_cr
 fi
 
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
 _ACEOF
 
 
@@ -6241,18 +6428,18 @@ _ACEOF
   echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
   echo "_ACEOF"
 } >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
 
   ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
   if test $ac_delim_n = $ac_delim_num; then
     break
   elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
   else
     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
@@ -6260,7 +6447,7 @@ done
 rm -f conf$$subs.sh
 
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
 _ACEOF
 sed -n '
 h
@@ -6308,7 +6495,7 @@ t delim
 rm -f conf$$subs.awk
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 _ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
   for (key in S) S_is_set[key] = 1
   FS = "\a"
 
@@ -6340,21 +6527,29 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
   sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
 else
   cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
 _ACEOF
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
 # trailing colons and then remove the whole line if VPATH becomes empty
 # (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[         ]*VPATH[        ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[    ]*\):*/\1/
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
 s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
 s/^[^=]*=[      ]*$//
 }'
 fi
@@ -6366,7 +6561,7 @@ fi # test -n "$CONFIG_FILES"
 # No need to generate them if there are no CONFIG_HEADERS.
 # This happens for instance with `./config.status Makefile'.
 if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
 BEGIN {
 _ACEOF
 
@@ -6378,11 +6573,11 @@ _ACEOF
 # handling of long lines.
 ac_delim='%!_!# '
 for ac_last_try in false false :; do
-  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
-  if test -z "$ac_t"; then
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
     break
   elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
   else
     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
@@ -6467,7 +6662,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 _ACAWK
 _ACEOF
 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
-  as_fn_error "could not setup config headers machinery" "$LINENO" 5
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
 fi # test -n "$CONFIG_HEADERS"
 
 
@@ -6480,7 +6675,7 @@ do
   esac
   case $ac_mode$ac_tag in
   :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
   :[FH]-) ac_tag=-:-;;
   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
   esac
@@ -6499,7 +6694,7 @@ do
     for ac_f
     do
       case $ac_f in
-      -) ac_f="$tmp/stdin";;
+      -) ac_f="$ac_tmp/stdin";;
       *) # Look for the file first in the build tree, then in the source tree
         # (if the path is not absolute).  The absolute path cannot be DOS-style,
         # because $ac_f cannot contain `:'.
@@ -6508,7 +6703,7 @@ do
           [\\/$]*) false;;
           *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
           esac ||
-          as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+          as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
       esac
       case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
@@ -6534,8 +6729,8 @@ $as_echo "$as_me: creating $ac_file" >&6;}
     esac
 
     case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
     esac
     ;;
   esac
@@ -6665,23 +6860,24 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
 s&@INSTALL@&$ac_INSTALL&;t t
 $ac_datarootdir_hack
 "
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
+which seems to be undefined.  Please make sure it is defined" >&5
 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
+which seems to be undefined.  Please make sure it is defined" >&2;}
 
-  rm -f "$tmp/stdin"
+  rm -f "$ac_tmp/stdin"
   case $ac_file in
-  -) cat "$tmp/out" && rm -f "$tmp/out";;
-  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
   esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
   :H)
   #
@@ -6690,22 +6886,56 @@ which seems to be undefined.  Please make sure it is defined." >&2;}
   if test x"$ac_file" != x-; then
     {
       $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
-    } >"$tmp/config.h" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5
-    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
       { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
 $as_echo "$as_me: $ac_file is unchanged" >&6;}
     else
       rm -f "$ac_file"
-      mv "$tmp/config.h" "$ac_file" \
-       || as_fn_error "could not create $ac_file" "$LINENO" 5
+      mv "$ac_tmp/config.h" "$ac_file" \
+       || as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
     $as_echo "/* $configure_input  */" \
-      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
-      || as_fn_error "could not create -" "$LINENO" 5
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
   fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$_am_arg" : 'X\(//\)[^/]' \| \
+        X"$_am_arg" : 'X\(//\)$' \| \
+        X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
  ;;
 
 
@@ -6719,7 +6949,7 @@ _ACEOF
 ac_clean_files=$ac_clean_files_save
 
 test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
 
 
 # configure is writing to config.log, and then calls config.status.
@@ -6740,7 +6970,7 @@ if test "$no_create" != yes; then
   exec 5>>config.log
   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
   # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
+  $ac_cs_success || as_fn_exit 1
 fi
 if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
index 1b7d3d9..f214655 100644 (file)
@@ -1,9 +1,31 @@
-pound (2.6-6+deb8u1) jessie-security; urgency=high
+pound (2.7-1.2) unstable; urgency=medium
 
+  * Include .orig.tar.gz in upload.
+
+ -- Brett Parker <iDunno@sommitrealweird.co.uk>  Sun, 31 Jul 2016 10:40:17 +0100
+
+pound (2.7-1.1) unstable; urgency=medium
+
+  * Fix failed binary only upload.
+
+ -- Brett Parker <iDunno@sommitrealweird.co.uk>  Sun, 31 Jul 2016 10:32:40 +0100
+
+pound (2.7-1) unstable; urgency=medium
+
+  * New upstream release
+
+ -- Brett Parker <iDunno@sommitrealweird.co.uk>  Sat, 30 Jul 2016 20:07:36 +0100
+
+pound (2.6-6.1) unstable; urgency=medium
+
+  [ Thijs Kinkhorst ]
   * Non-maintainer upload by the security team with maintainer approval.
   * Add missing part of anti_beast patch to fix disabling of client
     renegotiation. (Closes: #765649)
 
+  [ Brett Parker ]
+  * 2.7-1
+
  -- Thijs Kinkhorst <thijs@debian.org>  Tue, 05 May 2015 13:27:06 +0000
 
 pound (2.6-6) unstable; urgency=low
index 7f8f011..ec63514 100644 (file)
@@ -1 +1 @@
-7
+9
index 50ed4a2..20b42b5 100644 (file)
@@ -2,7 +2,7 @@ Source: pound
 Section: net
 Priority: extra
 Maintainer: Brett Parker <iDunno@sommitrealweird.co.uk>
-Build-Depends: debhelper (>= 7), libssl-dev (>= 0.9.7), autotools-dev, libpcre3-dev, openssl
+Build-Depends: debhelper (>= 9), libssl-dev (>= 1.0.2), autotools-dev, libpcre3-dev, openssl
 Standards-Version: 3.9.2
 Homepage: http://www.apsis.ch/pound/
 
diff --git a/debian/install b/debian/install
new file mode 100644 (file)
index 0000000..94f9d21
--- /dev/null
@@ -0,0 +1 @@
+debian/pound.cfg etc/pound
@@ -1,26 +1,39 @@
-From: Brett Parker <brettp@mythic-beasts.com>
-Date: Sun, 19 Oct 2014 22:25:05 +0100
-Subject: add_mkcalendar_support
+From: Brett Parker <iDunno@sommitrealweird.co.uk>
+Date: Sat, 30 Jul 2016 21:47:14 +0100
+Subject: Add MKCALENDAR to xHTTP 2 and above
 
-    - Enable MKCALENDAR support as per #742488
 ---
- config.c |    6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
+ config.c | 6 +++---
+ pound.8  | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
 
 diff --git a/config.c b/config.c
-index a194164..9adbe9d 100755
+index de1e163..68e2d2f 100644
 --- a/config.c
 +++ b/config.c
-@@ -84,9 +84,9 @@ static regmatch_t   matches[5];
+@@ -87,9 +87,9 @@ 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|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$",
 -    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|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|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]$",
-+    "^(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]$",
++    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT|MKCALENDAR) ([^ ]+) HTTP/1.[01]$",
++    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT|MKCALENDAR|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|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT|MKCALENDAR|SUBSCRIBE|UNSUBSCRIBE|BPROPPATCH|POLL|BMOVE|BCOPY|BDELETE|BPROPFIND|NOTIFY|CONNECT|RPC_IN_DATA|RPC_OUT_DATA) ([^ ]+) HTTP/1.[01]$",
  };
  
  static int  log_level = 1;
+diff --git a/pound.8 b/pound.8
+index ceddf48..235d829 100644
+--- a/pound.8
++++ b/pound.8
+@@ -368,7 +368,7 @@ additionally allow extended HTTP requests (PUT, PATCH, DELETE).
+ .I 2
+ additionally allow standard WebDAV verbs (LOCK, UNLOCK, PROPFIND,
+ PROPPATCH, SEARCH, MKCOL, MOVE, COPY, OPTIONS, TRACE, MKACTIVITY,
+-CHECKOUT, MERGE, REPORT).
++CHECKOUT, MERGE, REPORT, MKCALENDAR).
+ .IP
+ .I 3
+ additionally allow MS extensions WebDAV verbs (SUBSCRIBE, UNSUBSCRIBE,
diff --git a/debian/patches/0001-anti_beast.patch b/debian/patches/0001-anti_beast.patch
deleted file mode 100644 (file)
index 20e530f..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-From: Joe Gooch <mrwizard@k12system.com>
-Date: Thu, 23 Jan 2014 14:50:01 +0000
-Subject: anti_beast
-
----
- config.c |   39 +++++++++++++++++++++++++++++++++++++--
- pound.8  |   13 +++++++++++++
- pound.h  |    9 +++++++++
- svc.c    |   31 +++++++++++++++++++++++++++++++
- 4 files changed, 90 insertions(+), 2 deletions(-)
-
-diff --git a/config.c b/config.c
-index 1294d84..731b022 100755
---- a/config.c
-+++ b/config.c
-@@ -76,7 +76,7 @@ static regex_t  ListenHTTP, ListenHTTPS, End, Address, Port, Cert, xHTTP, Client
- 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, Ciphers, CAlist, VerifyList, CRLlist, NoHTTPS11;
-+static regex_t  ClientCert, AddHeader, SSLAllowClientRenegotiation, SSLHonorCipherOrder, Ciphers, CAlist, VerifyList, CRLlist, NoHTTPS11;
- static regex_t  Grace, Include, ConnTO, IgnoreCase, HTTPS, HTTPSCert, Disabled, Threads, CNName;
- static regmatch_t   matches[5];
-@@ -289,9 +289,12 @@ parse_be(const int is_emergency)
-         } 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);
-+            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);
-@@ -299,6 +302,7 @@ parse_be(const int is_emergency)
-         } 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");
-@@ -309,6 +313,8 @@ parse_be(const int is_emergency)
-             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);
-+            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);
-@@ -829,11 +835,15 @@ parse_HTTPS(void)
-     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;
-+    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));
-@@ -844,6 +854,7 @@ parse_HTTPS(void)
-     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->log_level = log_level;
-     if(regcomp(&res->verb, xhttp[0], REG_ICASE | REG_NEWLINE | REG_EXTENDED))
-         conf_err("xHTTP bad default pattern - aborted");
-@@ -1029,6 +1040,23 @@ parse_HTTPS(void)
-                 strcat(res->add_head, "\r\n");
-                 strcat(res->add_head, lin + matches[1].rm_so);
-             }
-+        } 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)
-@@ -1105,12 +1133,15 @@ parse_HTTPS(void)
-                 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_ALL);
-+                SSL_CTX_set_options(pc->ctx, ssl_op_enable);
-+                SSL_CTX_clear_options(pc->ctx, ssl_op_disable);
-                 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 {
-@@ -1305,6 +1336,8 @@ config_parse(const int argc, char **const argv)
-     || 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(&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)
-@@ -1463,6 +1496,8 @@ config_parse(const int argc, char **const argv)
-     regfree(&DynScale);
-     regfree(&ClientCert);
-     regfree(&AddHeader);
-+    regfree(&SSLAllowClientRenegotiation);
-+    regfree(&SSLHonorCipherOrder);
-     regfree(&Ciphers);
-     regfree(&CAlist);
-     regfree(&VerifyList);
-diff --git a/pound.8 b/pound.8
-index f878a4d..b95e794 100755
---- a/pound.8
-+++ b/pound.8
-@@ -501,6 +501,19 @@ string in the same format as in OpenSSL
- and
- .I SSL_CTX_set_cipher_list(3).
- .TP
-+\fBSSLHonorCipherOrder\fR 0|1
-+If this value is 1, the server will broadcast a preference to use \fBCiphers\fR in the
-+order supplied in the \fBCiphers\fR directive.  If the value is 0, the server will treat
-+the Ciphers list as the list of Ciphers it will accept, but no preference will be
-+indicated.  Default value is 0.
-+.TP
-+\fBSSLAllowClientRenegotiation\fR 0|1|2
-+If this value is 0, client initiated renegotiation will be disabled.  This will mitigate
-+DoS exploits based on client renegotiation, regardless of the patch status of clients and
-+servers related to "Secure renegotiation".  If the value is 1, secure renegotiation is
-+supported.  If the value is 2, insecure renegotiation is supported, with unpatched
-+clients.  /fBThis can lead to a DoS and a Man in the Middle attack!/fR  Default value is 0.
-+.TP
- \fBCAlist\fR "CAcert_file"
- Set the list of "trusted" CA's for this server. The CAcert_file is a file containing
- a sequence of CA certificates (PEM format). The names of the defined CA certificates
-diff --git a/pound.h b/pound.h
-index 114db58..5d0c880 100755
---- a/pound.h
-+++ b/pound.h
-@@ -404,6 +404,7 @@ typedef struct _listener {
-     int                 rewr_dest;      /* rewrite destination header */
-     int                 disabled;       /* true if the listener is disabled */
-     int                 log_level;      /* log level for this listener */
-+    int                 allow_client_reneg; /* Allow Client SSL Renegotiation */
-     SERVICE             *services;
-     struct _listener    *next;
- }   LISTENER;
-@@ -419,6 +420,9 @@ typedef struct _thr_arg {
-     struct _thr_arg *next;
- }   thr_arg;                        /* argument to processing threads: socket, origin */
-+/* Track SSL handshare/renegotiation so we can reject client-renegotiations. */
-+typedef enum { RENEG_INIT=0, RENEG_REJECT, RENEG_ALLOW, RENEG_ABORT } RENEG_STATE;
-+
- /* Header types */
- #define HEADER_ILLEGAL              -1
- #define HEADER_OTHER                0
-@@ -591,6 +595,11 @@ extern RSA  *RSA_tmp_callback(SSL *, int, int);
- extern DH   *DH_tmp_callback(SSL *, int, int);
- /*
-+ * Renegotiation callback
-+ */
-+extern void SSLINFO_callback(const SSL *s, int where, int rc);
-+
-+/*
-  * expiration stuff
-  */
- #ifndef EXPIRE_TO
-diff --git a/svc.c b/svc.c
-index fca3e3b..8c33a10 100755
---- a/svc.c
-+++ b/svc.c
-@@ -1797,3 +1797,34 @@ thr_control(void *arg)
-         close(ctl);
-     }
- }
-+
-+void
-+SSLINFO_callback(const SSL *ssl, int where, int rc)
-+{
-+    RENEG_STATE *reneg_state;
-+
-+    /* Get our thr_arg where we're tracking this connection info */
-+    if ((reneg_state = (RENEG_STATE *)SSL_get_app_data(ssl)) == NULL) return;
-+
-+    /* If we're rejecting renegotiations, move to ABORT if Client Hello is being read. */
-+    if ((where & SSL_CB_ACCEPT_LOOP) && *reneg_state == RENEG_REJECT) {
-+        int state = SSL_get_state(ssl);
-+
-+        if (state == SSL3_ST_SR_CLNT_HELLO_A || state == SSL23_ST_SR_CLNT_HELLO_A) {
-+           *reneg_state = RENEG_ABORT;
-+           logmsg(LOG_WARNING,"rejecting client initiated renegotiation");
-+        }
-+    }
-+    else if (where & SSL_CB_HANDSHAKE_DONE && *reneg_state == RENEG_INIT) {
-+       // Reject any followup renegotiations
-+       *reneg_state = RENEG_REJECT;
-+    }
-+
-+    //if (where & SSL_CB_HANDSHAKE_START) logmsg(LOG_DEBUG, "handshake start");
-+    //else if (where & SSL_CB_HANDSHAKE_DONE) logmsg(LOG_DEBUG, "handshake done");
-+    //else if (where & SSL_CB_LOOP) logmsg(LOG_DEBUG, "loop");
-+    //else if (where & SSL_CB_READ) logmsg(LOG_DEBUG, "read");
-+    //else if (where & SSL_CB_WRITE) logmsg(LOG_DEBUG, "write");
-+    //else if (where & SSL_CB_ALERT) logmsg(LOG_DEBUG, "alert");
-+}
-+
diff --git a/debian/patches/0002-xss_redirect_fix.patch b/debian/patches/0002-xss_redirect_fix.patch
deleted file mode 100644 (file)
index 215c8e4..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-From: Joe Gooch <mrwizard@k12system.com>
-Date: Thu, 23 Jan 2014 14:50:01 +0000
-Subject: xss_redirect_fix
-
----
- http.c |   41 ++++++++++++++++++++++++++++++++++-------
- 1 file changed, 34 insertions(+), 7 deletions(-)
-
-diff --git a/http.c b/http.c
-index bb2ce8b..b3780b8 100755
---- a/http.c
-+++ b/http.c
-@@ -46,13 +46,24 @@ err_reply(BIO *const c, const char *head, const char *txt)
-     return;
- }
-+
-+static char *redir_pre = "<html><head><title>Redirect</title></head><body><h1>Redirect</h1><p>You should go to <a href=\"";
-+static char *redir_post = "\">here</a></p></body></html>";
-+
-+static char hexchar(char a) {
-+  a = a & 0xF;
-+  if (a > 9) return (a+'a'-10);
-+  return a+'0';
-+}
-+
- /*
-  * Reply with a redirect
-  */
- static void
- redirect_reply(BIO *const c, const char *url, const int code)
- {
--    char    rep[MAXBUF], cont[MAXBUF], *code_msg;
-+    char    rep[MAXBUF], urlbuf[MAXBUF], ch, *code_msg;
-+    int     i,j;
-     switch(code) {
-     case 301:
-@@ -65,14 +76,30 @@ redirect_reply(BIO *const c, const char *url, const int code)
-         code_msg = "Found";
-         break;
-     }
--    snprintf(cont, sizeof(cont),
--        "<html><head><title>Redirect</title></head><body><h1>Redirect</h1><p>You should go to <a href=\"%s\">%s</a></p></body></html>",
--        url, url);
-+    for(i=0,j=0; url[i] && j<MAXBUF-1; i++) {
-+      ch = url[i];
-+      if (
-+          (ch>= 'A' && ch <='Z') ||
-+          (ch>= 'a' && ch <='z') ||
-+          (ch>= '0' && ch <='9') ||
-+            ch == '-' || ch == '_' || ch == '.' || ch == ':' || ch == '/' || ch == '?' || ch == '&' || ch == ';' || ch == '=') {
-+
-+          urlbuf[j++] = ch;
-+          continue;
-+      }
-+      if (j>MAXBUF-4) break;
-+      urlbuf[j++] = '%';
-+      urlbuf[j++] = hexchar(ch>>4);
-+      urlbuf[j++] = hexchar(ch);
-+    }
-+    urlbuf[j++] = 0;
-     snprintf(rep, sizeof(rep),
--        "HTTP/1.0 %d %s\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n",
--        code, code_msg, url, strlen(cont));
-+        "HTTP/1.0 %d %s\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %u\r\n\r\n",
-+        code, code_msg, urlbuf, (unsigned int)(strlen(redir_pre)+strlen(redir_post)+strlen(urlbuf)));
-     BIO_write(c, rep, strlen(rep));
--    BIO_write(c, cont, strlen(cont));
-+    BIO_write(c, redir_pre, strlen(redir_pre));
-+    BIO_write(c, urlbuf, strlen(urlbuf));
-+    BIO_write(c, redir_post, strlen(redir_post));
-     BIO_flush(c);
-     return;
- }
diff --git a/debian/patches/0003-tls_compression_disable.patch b/debian/patches/0003-tls_compression_disable.patch
deleted file mode 100644 (file)
index bcbee3e..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-From: Joe Gooch <mrwizard@k12system.com>
-Date: Fri, 5 Oct 2012 11:41:48 -0400
-Subject: tls_compression_disable
-
----
- config.c |    9 +++++++++
- pound.c  |   17 +++++++++++++++++
- 2 files changed, 26 insertions(+)
-
-diff --git a/config.c b/config.c
-index 731b022..3219137 100755
---- a/config.c
-+++ b/config.c
-@@ -293,6 +293,9 @@ parse_be(const int is_emergency)
-             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());
-@@ -313,6 +316,9 @@ parse_be(const int is_emergency)
-             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());
-@@ -842,6 +848,9 @@ parse_HTTPS(void)
-     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)
-diff --git a/pound.c b/pound.c
-index 9667dcd..79007f6 100755
---- a/pound.c
-+++ b/pound.c
-@@ -251,6 +251,23 @@ main(const int argc, char **argv)
-     CRYPTO_set_locking_callback(l_lock);
-     init_timer();
-+    /* Disable SSL Compression for OpenSSL pre-1.0.  1.0 is handled with an option in config.c */
-+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
-+#ifndef SSL_OP_NO_COMPRESSION
-+    {
-+      int i,n;
-+      STACK_OF(SSL_COMP) *ssl_comp_methods;
-+
-+      ssl_comp_methods = SSL_COMP_get_compression_methods();
-+      n = sk_SSL_COMP_num(ssl_comp_methods);
-+
-+      for(i=n-1; i>=0; i--) {
-+        sk_SSL_COMP_delete(ssl_comp_methods, i);
-+      }
-+    }
-+#endif
-+#endif
-+
-     /* prepare regular expressions */
-     if(regcomp(&HEADER, "^([a-z0-9!#$%&'*+.^_`|~-]+):[ \t]*(.*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
-     || regcomp(&CHUNK_HEAD, "^([0-9a-f]+).*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
diff --git a/debian/patches/0004-add_http_patch_support.patch b/debian/patches/0004-add_http_patch_support.patch
deleted file mode 100644 (file)
index 47f5dc9..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From: Brett Parker <iDunno@sommitrealweird.co.uk>
-Date: Mon, 3 Mar 2014 15:05:32 +0000
-Subject: add_http_patch_support
-
-  - patch from http://www.apsis.ch/pound/pound_list/archive/2013/2013-08/1377264673000
----
- config.c |    8 ++++----
- pound.8  |    2 +-
- 2 files changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/config.c b/config.c
-index 3219137..a194164 100755
---- a/config.c
-+++ b/config.c
-@@ -83,10 +83,10 @@ static regmatch_t   matches[5];
- static char *xhttp[] = {
-     "^(GET|POST|HEAD) ([^ ]+) HTTP/1.[01]$",
--    "^(GET|POST|HEAD|PUT|DELETE) ([^ ]+) HTTP/1.[01]$",
--    "^(GET|POST|HEAD|PUT|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$",
--    "^(GET|POST|HEAD|PUT|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|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|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|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]$",
-+    "^(GET|POST|HEAD|PUT|PATCH|DELETE) ([^ ]+) HTTP/1.[01]$",
-+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|MOVE|COPY|OPTIONS|TRACE|MKACTIVITY|CHECKOUT|MERGE|REPORT) ([^ ]+) HTTP/1.[01]$",
-+    "^(GET|POST|HEAD|PUT|PATCH|DELETE|LOCK|UNLOCK|PROPFIND|PROPPATCH|SEARCH|MKCOL|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|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;
-diff --git a/pound.8 b/pound.8
-index b95e794..c173c96 100755
---- a/pound.8
-+++ b/pound.8
-@@ -356,7 +356,7 @@ Defines which HTTP verbs are accepted. The possible values are:
- (default) accept only standard HTTP requests (GET, POST, HEAD).
- .IP
- .I 1
--additionally allow extended HTTP requests (PUT, DELETE).
-+additionally allow extended HTTP requests (PUT, PATCH, DELETE).
- .IP
- .I 2
- additionally allow standard WebDAV verbs (LOCK, UNLOCK, PROPFIND,
diff --git a/debian/patches/0005-wait_on_semaphore_fix.patch b/debian/patches/0005-wait_on_semaphore_fix.patch
deleted file mode 100644 (file)
index 88a7f7a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From: Brett Parker <iDunno@sommitrealweird.co.uk>
-Date: Mon, 3 Mar 2014 15:24:41 +0000
-Subject: wait_on_semaphore_fix
-
-    - As supplied in #737853
----
- pound.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/pound.c b/pound.c
-index 79007f6..388f930 100755
---- a/pound.c
-+++ b/pound.c
-@@ -155,7 +155,7 @@ get_thr_arg(void)
-     thr_arg *res;
-     (void)pthread_mutex_lock(&arg_mut);
--    if(first == NULL)
-+    while(first == NULL)
-         (void)pthread_cond_wait(&arg_cond, &arg_mut);
-     if((res = first) != NULL)
-         if((first = first->next) == NULL)
diff --git a/debian/patches/0007-anti_poodle.patch b/debian/patches/0007-anti_poodle.patch
deleted file mode 100644 (file)
index 6a319b7..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-From: Brett Parker <brettp@mythic-beasts.com>
-Date: Sun, 19 Oct 2014 23:11:14 +0100
-Subject: anti_poodle
-
-  - Allow disabling of SSLv2 and SSLv3
----
- config.c |   21 ++++++++++++++++++++-
- pound.h  |    2 ++
- 2 files changed, 22 insertions(+), 1 deletion(-)
-
-diff --git a/config.c b/config.c
-index 9adbe9d..3f871ec 100755
---- a/config.c
-+++ b/config.c
-@@ -76,7 +76,7 @@ static regex_t  ListenHTTP, ListenHTTPS, End, Address, Port, Cert, xHTTP, Client
- 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, SSLAllowClientRenegotiation, SSLHonorCipherOrder, Ciphers, CAlist, VerifyList, CRLlist, NoHTTPS11;
-+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];
-@@ -864,6 +864,8 @@ parse_HTTPS(void)
-     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");
-@@ -1049,6 +1051,10 @@ parse_HTTPS(void)
-                 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) {
-@@ -1145,7 +1151,16 @@ parse_HTTPS(void)
-                 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);
-@@ -1346,6 +1361,8 @@ config_parse(const int argc, char **const argv)
-     || 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)
-@@ -1506,6 +1523,8 @@ config_parse(const int argc, char **const argv)
-     regfree(&ClientCert);
-     regfree(&AddHeader);
-     regfree(&SSLAllowClientRenegotiation);
-+    regfree(&DisableSSLv2);
-+    regfree(&DisableSSLv3);
-     regfree(&SSLHonorCipherOrder);
-     regfree(&Ciphers);
-     regfree(&CAlist);
-diff --git a/pound.h b/pound.h
-index 5d0c880..2417aaa 100755
---- a/pound.h
-+++ b/pound.h
-@@ -405,6 +405,8 @@ typedef struct _listener {
-     int                 disabled;       /* true if the listener is disabled */
-     int                 log_level;      /* log level for this listener */
-     int                 allow_client_reneg; /* Allow Client SSL Renegotiation */
-+    int                disable_ssl_v2; /* Disable SSL version 2 */
-+    int                disable_ssl_v3; /* Disable SSL version 3 */
-     SERVICE             *services;
-     struct _listener    *next;
- }   LISTENER;
diff --git a/debian/patches/0008-disable_client_initiated_renegotiation.patch b/debian/patches/0008-disable_client_initiated_renegotiation.patch
deleted file mode 100644 (file)
index b63bcb6..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-Added the missing parts that makes the option SSLAllowClientRenegotiation
-work as advertised, allowing client initiated renegotiation to be turned off.
-This patch is a compliment to the changes introduced in the 0001-anti_beast.patch, 
-which was missing the changes to http.c as seen in the original patch from 
-Joe Gooch <mrwizard@k12system.com> at:
-http://goochfriend.org/pound_2.6f_ssl_renegotiation_and_ciphers.patch
-
---- a/http.c
-+++ b/http.c
-@@ -273,6 +273,11 @@
- static int  err_to = -1;
-+typedef struct {
-+    int timeout;
-+    RENEG_STATE *reneg_state;
-+} BIO_ARG;
-+
- /*
-  * Time-out for client read/gets
-  * the SSL manual says not to do it, but it works well enough anyway...
-@@ -280,6 +285,7 @@
- static long
- bio_callback(BIO *const bio, const int cmd, const char *argp, int argi, long argl, long ret)
- {
-+    BIO_ARG *bio_arg;
-     struct pollfd   p;
-     int             to, p_res, p_err;
-@@ -287,11 +293,22 @@
-         return ret;
-     /* a time-out already occured */
--    if((to = *((int *)BIO_get_callback_arg(bio)) * 1000) < 0) {
-+    if((bio_arg = (BIO_ARG*)BIO_get_callback_arg(bio))==NULL) return ret;
-+    if((to = bio_arg->timeout * 1000) < 0) {
-         errno = ETIMEDOUT;
-         return -1;
-     }
-+    /* Renegotiations */
-+    if (bio_arg->reneg_state != NULL && *bio_arg->reneg_state == RENEG_ABORT) {
-+        logmsg(LOG_NOTICE, "REJECTING renegotiated session");
-+        errno = ECONNABORTED;
-+        return -1;
-+    }
-+
-+    //logmsg(LOG_NOTICE, "TO %d", to);
-+    if (to == 0) return ret;
-+
-     for(;;) {
-         memset(&p, 0, sizeof(p));
-         BIO_get_fd(bio, &p.fd);
-@@ -326,7 +343,7 @@
-             return -1;
-         case 0:
-             /* timeout - mark the BIO as unusable for the future */
--            BIO_set_callback_arg(bio, (char *)&err_to);
-+            bio_arg->timeout = err_to;
- #ifdef  EBUG
-             logmsg(LOG_WARNING, "(%lx) CALLBACK timeout poll after %d secs: %s",
-                 pthread_self(), to / 1000, strerror(p_err));
-@@ -531,6 +548,15 @@
-     struct linger       l;
-     double              start_req, end_req;
-+    RENEG_STATE         reneg_state;
-+    BIO_ARG             ba1, ba2;
-+
-+    reneg_state = RENEG_INIT;
-+    ba1.reneg_state =  &reneg_state;
-+    ba2.reneg_state = &reneg_state;
-+    ba1.timeout = 0;
-+    ba2.timeout = 0;
-+
-     from_host = ((thr_arg *)arg)->from_host;
-     memcpy(&from_host_addr, from_host.ai_addr, from_host.ai_addrlen);
-     from_host.ai_addr = (struct sockaddr *)&from_host_addr;
-@@ -539,6 +565,8 @@
-     free(((thr_arg *)arg)->from_host.ai_addr);
-     free(arg);
-+    if(lstn->allow_client_reneg) reneg_state = RENEG_ALLOW;
-+
-     n = 1;
-     setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&n, sizeof(n));
-     l.l_onoff = 1;
-@@ -562,10 +590,10 @@
-         close(sock);
-         return;
-     }
--    if(lstn->to > 0) {
--        BIO_set_callback_arg(cl, (char *)&lstn->to);
--        BIO_set_callback(cl, bio_callback);
--    }
-+
-+    ba1.timeout = lstn->to;
-+    BIO_set_callback_arg(cl, (char *)&ba1);
-+    BIO_set_callback(cl, bio_callback);
-     if(lstn->ctx != NULL) {
-         if((ssl = SSL_new(lstn->ctx->ctx)) == NULL) {
-@@ -574,6 +602,7 @@
-             BIO_free_all(cl);
-             return;
-         }
-+        SSL_set_app_data(ssl, &reneg_state);
-         SSL_set_bio(ssl, cl, cl);
-         if((bb = BIO_new(BIO_f_ssl())) == NULL) {
-             logmsg(LOG_WARNING, "(%lx) BIO_new(Bio_f_ssl()) failed", pthread_self());
-@@ -875,7 +904,8 @@
-             }
-             BIO_set_close(be, BIO_CLOSE);
-             if(backend->to > 0) {
--                BIO_set_callback_arg(be, (char *)&backend->to);
-+                ba2.timeout = backend->to;
-+                BIO_set_callback_arg(be, (char *)&ba2);
-                 BIO_set_callback(be, bio_callback);
-             }
-             if(backend->ctx != NULL) {
index 6cd03a0..372f41c 100644 (file)
@@ -1,8 +1 @@
-0001-anti_beast.patch
-0002-xss_redirect_fix.patch
-0003-tls_compression_disable.patch
-0004-add_http_patch_support.patch
-0005-wait_on_semaphore_fix.patch
-0006-add_mkcalendar_support.patch
-0007-anti_poodle.patch
-0008-disable_client_initiated_renegotiation.patch
+0001-Add-MKCALENDAR-to-xHTTP-2-and-above.patch
index 64917a4..77b9979 100644 (file)
@@ -27,8 +27,8 @@ case "$1" in
     configure)
         # create the default file to prevent automatic startup unconfigured
         if [ ! -f "/etc/default/pound" ]
-       then
-         cat > /etc/default/pound << _EOF_
+        then
+            cat > /etc/default/pound << _EOF_
 # Defaults for pound initscript
 # sourced by /etc/init.d/pound
 # installed at /etc/default/pound by the maintainer scripts
@@ -37,7 +37,10 @@ case "$1" in
 # set the below varible to 1 in order to allow pound to start
 startup=0
 _EOF_
-       fi
+           fi
+        if [ -e "/etc/pound/pound.cfg" ] && ( grep "DisableSSLv" /etc/pound/pound.cfg > /dev/null ); then
+            sed -i -e '/^[^#]*Disable\(SSLv[23]\).*$/ { s#^\([^#]*Disable\)\(SSLv[23]\)\(.*\)$#\1 \2 \3#; }' /etc/pound/pound.cfg
+        fi
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
index d463830..dfd0169 100644 (file)
@@ -36,7 +36,7 @@ ListenHTTP
        Port    8080
 
        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
-       xHTTP           0
+       xHTTP           1
 
        Service
                BackEnd
index fb6a11b..57d48f9 100755 (executable)
@@ -1,77 +1,8 @@
 #!/usr/bin/make -f
 
-DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
-DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
-DEB_HOST_GNU_CPU   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_CPU)
+%:
+       dh "$@"
 
-ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
-  CONFFLAGS += --build $(DEB_HOST_GNU_TYPE)
-else
-  CONFFLAGS += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
-endif
+override_dh_auto_configure:
+       dh_auto_configure -- --sysconfdir=/etc/pound
 
-ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
-       INSTALL_PROGRAM += -s
-endif
-
-config.status: configure
-       dh_testdir
-       mv config.sub config.sub.upstream && ln -s /usr/share/misc/config.sub
-       mv config.guess config.guess.upstream && ln -s /usr/share/misc/config.guess
-       ./configure $(shell dpkg-buildflags --export=configure) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --sysconfdir=/etc/pound --with-maxbuf=8192
-       rm config.sub && mv config.sub.upstream config.sub
-       rm config.guess && mv config.guess.upstream config.guess
-
-build: build-arch build-indep
-build-arch: build-stamp
-build-indep: build-stamp
-
-build-stamp:  config.status
-       dh_testdir
-       $(MAKE)
-       touch build-stamp
-
-clean:
-       dh_testdir
-       dh_testroot
-       rm -f build-stamp 
-
-       [ ! -f Makefile ] || $(MAKE) clean
-       rm -f config.h config.status config.log Makefile
-
-       dh_clean 
-
-install: build
-       dh_testdir
-       dh_testroot
-       dh_prep
-       dh_installdirs
-       $(MAKE) install DESTDIR=$(CURDIR)/debian/pound
-
-       install -m644 -D debian/pound.cfg debian/pound/etc/pound/pound.cfg
-
-# Build architecture-independent files here.
-binary-indep: build install
-# We have nothing to do by default.
-
-# Build architecture-dependent files here.
-binary-arch: build install
-       dh_testdir
-       dh_testroot
-       dh_installchangelogs CHANGELOG 
-       dh_installdocs
-       dh_installexamples
-       dh_installinit
-       dh_installman
-       dh_link
-       dh_strip
-       dh_compress
-       dh_fixperms
-       dh_installdeb
-       dh_shlibdeps
-       dh_gencontrol
-       dh_md5sums
-       dh_builddeb
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary install 
diff --git a/http.c b/http.c
old mode 100755 (executable)
new mode 100644 (file)
index d81f7dc..749b279
--- a/http.c
+++ b/http.c
@@ -46,24 +46,14 @@ err_reply(BIO *const c, const char *head, const char *txt)
     return;
 }
 
-
-static char *redir_pre = "<html><head><title>Redirect</title></head><body><h1>Redirect</h1><p>You should go to <a href=\"";
-static char *redir_post = "\">here</a></p></body></html>";
-
-static char hexchar(char a) {
-  a = a & 0xF;
-  if (a > 9) return (a+'a'-10);
-  return a+'0';
-}
-
 /*
  * Reply with a redirect
  */
 static void
 redirect_reply(BIO *const c, const char *url, const int code)
 {
-    char    rep[MAXBUF], urlbuf[MAXBUF], ch, *code_msg;
-    int     i,j;
+    char    rep[MAXBUF], cont[MAXBUF], safe_url[MAXBUF], *code_msg;
+    int     i, j;
 
     switch(code) {
     case 301:
@@ -76,30 +66,26 @@ redirect_reply(BIO *const c, const char *url, const int code)
         code_msg = "Found";
         break;
     }
-    for(i=0,j=0; url[i] && j<MAXBUF-1; i++) {
-       ch = url[i];
-       if (
-           (ch>= 'A' && ch <='Z') ||
-           (ch>= 'a' && ch <='z') ||
-           (ch>= '0' && ch <='9') ||
-            ch == '-' || ch == '_' || ch == '.' || ch == ':' || ch == '/' || ch == '?' || ch == '&' || ch == ';' || ch == '=') {
-
-           urlbuf[j++] = ch;
-           continue;
-       }
-       if (j>MAXBUF-4) break;
-       urlbuf[j++] = '%';
-       urlbuf[j++] = hexchar(ch>>4);
-       urlbuf[j++] = hexchar(ch);
-    }
-    urlbuf[j++] = 0;
+    /*
+     * Make sure to return a safe version of the URL (otherwise CSRF becomes a possibility)
+     */
+    memset(safe_url, 0, MAXBUF);
+    for(i = j = 0; i < MAXBUF && j < MAXBUF && url[i]; i++)
+        if(isalnum(url[i]) || url[i] == '_' || url[i] == '.' || url[i] == ':' || url[i] == '/'
+        || url[i] == '?' || url[i] == '&' || url[i] == ';' || url[i] == '-' || url[i] == '=')
+            safe_url[j++] = url[i];
+        else {
+            sprintf(safe_url + j, "%%%02x", url[i]);
+            j += 3;
+        }
+    snprintf(cont, sizeof(cont),
+        "<html><head><title>Redirect</title></head><body><h1>Redirect</h1><p>You should go to <a href=\"%s\">%s</a></p></body></html>",
+        safe_url, safe_url);
     snprintf(rep, sizeof(rep),
-        "HTTP/1.0 %d %s\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %u\r\n\r\n",
-        code, code_msg, urlbuf, (unsigned int)(strlen(redir_pre)+strlen(redir_post)+strlen(urlbuf)));
+        "HTTP/1.0 %d %s\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n",
+        code, code_msg, safe_url, strlen(cont));
     BIO_write(c, rep, strlen(rep));
-    BIO_write(c, redir_pre, strlen(redir_pre));
-    BIO_write(c, urlbuf, strlen(urlbuf));
-    BIO_write(c, redir_post, strlen(redir_post));
+    BIO_write(c, cont, strlen(cont));
     BIO_flush(c);
     return;
 }
@@ -274,7 +260,7 @@ copy_chunks(BIO *const cl, BIO *const be, LONG *res_bytes, const int no_write, c
 static int  err_to = -1;
 
 typedef struct {
-    int timeout;
+    int         timeout;
     RENEG_STATE *reneg_state;
 } BIO_ARG;
 
@@ -293,21 +279,23 @@ bio_callback(BIO *const bio, const int cmd, const char *argp, int argi, long arg
         return ret;
 
     /* a time-out already occured */
-    if((bio_arg = (BIO_ARG*)BIO_get_callback_arg(bio))==NULL) return ret;
+    if((bio_arg = (BIO_ARG*)BIO_get_callback_arg(bio))==NULL)
+        return ret;
     if((to = bio_arg->timeout * 1000) < 0) {
         errno = ETIMEDOUT;
         return -1;
     }
 
     /* Renegotiations */
+    /* logmsg(LOG_NOTICE, "RENEG STATE %d", bio_arg->reneg_state==NULL?-1:*bio_arg->reneg_state); */
     if (bio_arg->reneg_state != NULL && *bio_arg->reneg_state == RENEG_ABORT) {
         logmsg(LOG_NOTICE, "REJECTING renegotiated session");
         errno = ECONNABORTED;
         return -1;
     }
 
-    //logmsg(LOG_NOTICE, "TO %d", to);
-    if (to == 0) return ret;
+    if (to == 0)
+        return ret;
 
     for(;;) {
         memset(&p, 0, sizeof(p));
@@ -547,7 +535,6 @@ do_http(thr_arg *arg)
     regmatch_t          matches[4];
     struct linger       l;
     double              start_req, end_req;
-
     RENEG_STATE         reneg_state;
     BIO_ARG             ba1, ba2;
 
@@ -556,7 +543,6 @@ do_http(thr_arg *arg)
     ba2.reneg_state = &reneg_state;
     ba1.timeout = 0;
     ba2.timeout = 0;
-
     from_host = ((thr_arg *)arg)->from_host;
     memcpy(&from_host_addr, from_host.ai_addr, from_host.ai_addrlen);
     from_host.ai_addr = (struct sockaddr *)&from_host_addr;
@@ -565,7 +551,8 @@ do_http(thr_arg *arg)
     free(((thr_arg *)arg)->from_host.ai_addr);
     free(arg);
 
-    if(lstn->allow_client_reneg) reneg_state = RENEG_ALLOW;
+    if(lstn->allow_client_reneg)
+        reneg_state = RENEG_ALLOW;
 
     n = 1;
     setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&n, sizeof(n));
@@ -590,7 +577,6 @@ do_http(thr_arg *arg)
         close(sock);
         return;
     }
-
     ba1.timeout = lstn->to;
     BIO_set_callback_arg(cl, (char *)&ba1);
     BIO_set_callback(cl, bio_callback);
@@ -628,6 +614,7 @@ do_http(thr_arg *arg)
             && SSL_get_verify_result(ssl) != X509_V_OK) {
                 addr2str(caddr, MAXBUF - 1, &from_host, 1);
                 logmsg(LOG_NOTICE, "Bad certificate from %s", caddr);
+                X509_free(x509);
                 BIO_reset(cl);
                 BIO_free_all(cl);
                 return;
@@ -640,6 +627,8 @@ do_http(thr_arg *arg)
 
     if((bb = BIO_new(BIO_f_buffer())) == NULL) {
         logmsg(LOG_WARNING, "(%lx) BIO_new(buffer) failed", pthread_self());
+        if(x509 != NULL)
+            X509_free(x509);
         BIO_reset(cl);
         BIO_free_all(cl);
         return;
@@ -735,9 +724,21 @@ do_http(thr_arg *arg)
             case HEADER_CONTENT_LENGTH:
                 if(chunked || cont >= 0L)
                     headers_ok[n] = 0;
-                else
-                    if((cont = ATOL(buf)) < 0L)
-                        headers_ok[n] = 0;
+                else {
+                     if((cont = ATOL(buf)) < 0L)
+                         headers_ok[n] = 0;
+                    if(is_rpc == 1 && (cont < 0x20000L || cont > 0x80000000L))
+                        is_rpc = -1;
+                }
+                break;
+            case HEADER_EXPECT:
+                /*
+                 * we do NOT support the "Expect: 100-continue" headers
+                 * support may involve severe performance penalties (non-responding back-end, etc)
+                 * as a stop-gap measure we just skip these headers
+                 */
+                if(!strcasecmp("100-continue", buf))
+                    headers_ok[n] = 0;
                 break;
             case HEADER_ILLEGAL:
                 if(lstn->log_level > 0) {
@@ -1009,12 +1010,12 @@ do_http(thr_arg *arg)
 
         /* if SSL put additional headers for client certificate */
         if(cur_backend->be_type == 0 && ssl != NULL) {
-            SSL_CIPHER  *cipher;
+            const SSL_CIPHER  *cipher;
 
             if((cipher = SSL_get_current_cipher(ssl)) != NULL) {
                 SSL_CIPHER_description(cipher, buf, MAXBUF - 1);
                 strip_eol(buf);
-                if(BIO_printf(be, "X-SSL-cipher: %s\r\n", buf) <= 0) {
+                if(BIO_printf(be, "X-SSL-cipher: %s/%s\r\n", SSL_get_version(ssl), buf) <= 0) {
                     str_be(buf, MAXBUF - 1, cur_backend);
                     end_req = cur_time();
                     logmsg(LOG_WARNING, "(%lx) e500 error write X-SSL-cipher to %s: %s (%.3f sec)",
@@ -1396,8 +1397,12 @@ do_http(thr_arg *arg)
                 case HEADER_CONTENT_LENGTH:
                     cont = ATOL(buf);
                     /* treat RPC_OUT_DATA like reply without content-length */
-                    if(is_rpc == 0 && cont == 0x40000000L)
-                        cont = -1L;
+                    if(is_rpc == 0) {
+                        if(cont >= 0x20000L && cont <= 0x80000000L)
+                            cont = -1L;
+                        else
+                            is_rpc = -1;
+                    }
                     break;
                 case HEADER_LOCATION:
                     if(v_host[0] && need_rewrite(lstn->rewr_loc, buf, loc_path, v_host, lstn, cur_backend)) {
@@ -1554,6 +1559,12 @@ do_http(thr_arg *arg)
         memset(s_res_bytes, 0, LOG_BYTES_SIZE);
         log_bytes(s_res_bytes, res_bytes);
         addr2str(caddr, MAXBUF - 1, &from_host, 1);
+        if(anonymise) {
+            char    *last;
+
+            if((last = strrchr(caddr, '.')) != NULL || (last = strrchr(caddr, ':')) != NULL)
+                strcpy(++last, "0");
+        }
         str_be(buf, MAXBUF - 1, cur_backend);
         switch(lstn->log_level) {
         case 0:
@@ -1625,7 +1636,7 @@ thr_http(void *dummy)
 
     for(;;) {
         while((arg = get_thr_arg()) == NULL)
-            logmsg(LOG_WARNING, "NULL get_thr_arg");
+            logmsg(LOG_NOTICE, "NULL get_thr_arg");
         do_http(arg);
     }
 }
diff --git a/pound.8 b/pound.8
old mode 100755 (executable)
new mode 100644 (file)
index bb8d16d..ceddf48
--- a/pound.8
+++ b/pound.8
@@ -310,6 +310,9 @@ delay.
 Use an OpenSSL hardware acceleration card called \fIname\fR. Available
 only if OpenSSL-engine is installed on your system.
 .TP
+\fBECDHcurve\fR "name"
+Use the named curve for elliptical curve encryption (default: prime256v1).
+.TP
 \fBControl\fR "/path/to/socket"
 Set the control socket path. If not defined
 .B Pound
@@ -320,6 +323,10 @@ program.
 .TP
 \fBInclude\fR "/path/to/file"
 Include the file as though it were part of the configuration file.
+.TP
+\fBAnonymise\fR
+Replace the last byte of the client address with 0 for logging purposes.
+Default: log the client address in full.
 .SH "HTTP Listener"
 An HTTP listener defines an address and port that
 .B Pound
@@ -494,6 +501,13 @@ is the depth of verification for a client certificate (up to 9). The default
 depth limit is 9, allowing for the peer certificate and additional 9 CA
 certificates that must be verified.
 .TP
+\fBDisable\fR SSLv2|SSLv3|TLSv1|TLSv1_1|TLSv1_2
+Disable the protocol \fBand all lower protocols as well\fR.
+This is due to a limitation in OpenSSL, which does not support disabling a single
+protocol. For example,
+.I Disable TLSv1
+would disable SSLv2, SSLv3 and TLSv1, thus allowing only TLSv1_1 and TLSv1_2.
+.TP
 \fBCiphers\fR "acceptable:cipher:list"
 This is the list of ciphers that will be accepted by the SSL connection; it is a
 string in the same format as in OpenSSL
@@ -502,25 +516,18 @@ and
 .I SSL_CTX_set_cipher_list(3).
 .TP
 \fBSSLHonorCipherOrder\fR 0|1
-If this value is 1, the server will broadcast a preference to use \fBCiphers\fR in the
-order supplied in the \fBCiphers\fR directive.  If the value is 0, the server will treat
-the Ciphers list as the list of Ciphers it will accept, but no preference will be
-indicated.  Default value is 0.
+If this value is 1, the server will broadcast a preference to use \fBCiphers\fR in
+the order supplied in the \fBCiphers\fR directive.  If the value is 0, the server
+will treat the Ciphers list as the list of Ciphers it will accept, but no preference
+will be indicated.  Default value is 0.
 .TP
 \fBSSLAllowClientRenegotiation\fR 0|1|2
-If this value is 0, client initiated renegotiation will be disabled.  This will mitigate
-DoS exploits based on client renegotiation, regardless of the patch status of clients and
-servers related to "Secure renegotiation".  If the value is 1, secure renegotiation is
-supported.  If the value is 2, insecure renegotiation is supported, with unpatched
-clients.  /fBThis can lead to a DoS and a Man in the Middle attack!/fR  Default value is 0.
-.TP
-\fBSSLNoCompression\fR 0|1
-If this value is 1, the server will disable DEFLATE compression even if both server
-and client supports it.  In case compression is enabled an attacker with access to
-encrypted network traffic can conduct a "CRIME" attack by making client issue requests
-with specific character sequences and observing whether they got compressed or not,
-indicating their presence in part of the request that is not under his control
-(e.g. cookie headers). Default value is 0.
+If this value is 0, client initiated renegotiation will be disabled.  This will
+mitigate DoS exploits based on client renegotiation, regardless of the patch status
+of clients and servers related to "Secure renegotiation".  If the value is 1, secure
+renegotiation is supported.  If the value is 2, insecure renegotiation is supported,
+with unpatched clients. \fBThis can lead to a DoS and a Man in the Middle attack!\fR
+The default value is 0.
 .TP
 \fBCAlist\fR "CAcert_file"
 Set the list of "trusted" CA's for this server. The CAcert_file is a file containing
@@ -569,7 +576,9 @@ will be skipped and next one tried. If all services fail to match
 .B Pound
 returns an error. You may define multiple
 .I URL
-conditions per service. If no
+conditions per service, in which case
+.B all
+patterns must match. If no
 .I URL
 was defined then all requests match. The matching is by default case-sensitive,
 but this can be overridden by specifying
@@ -716,12 +725,38 @@ will connect to. This is a
 .B mandatory
 parameter for non Unix-domain back-ends.
 .TP
-\fBHTTPS\fR [ "cert" ]
-The back-end is using HTTPS. If the optional parameter
-.I cert
-is specified,
+\fBHTTPS\fR
+The back-end is using HTTPS.
+.TP
+\fBCert\fR "certificate file"
+Specify the certificate that
 .B Pound
-will present this certificate to the back-end.
+will use as a client. The
+.I certificate file
+is the file containing the certificate, possibly a certificate chain and the signature.
+This directive may appear only after the
+.I HTTPS
+directive.
+.TP
+\fBDisable\fR SSLv2|SSLv3|TLSv1|TLSv1_1|TLSv1_2
+Disable the protocol \fBand all lower protocols as well\fR.
+This is due to a limitation in OpenSSL, which does not support disabling a single
+protocol. For example,
+.I Disable TLSv1
+would disable SSLv2, SSLv3 and TLSv1, thus allowing only TLSv1_1 and TLSv1_2.
+This directive may appear only after the
+.I HTTPS
+directive.
+.TP
+\fBCiphers\fR "acceptable:cipher:list"
+This is the list of ciphers that will be accepted by the SSL connection; it is a
+string in the same format as in OpenSSL
+.I ciphers(1)
+and
+.I SSL_CTX_set_cipher_list(3).
+This directive may appear only after the
+.I HTTPS
+directive.
 .TP
 \fBPriority\fR val
 The priority of this back-end (between 1 and 9, 5 is default). Higher priority
diff --git a/pound.c b/pound.c
old mode 100755 (executable)
new mode 100644 (file)
index 11a18e5..3643f70
--- a/pound.c
+++ b/pound.c
@@ -8,12 +8,12 @@
  * 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/>.
  *
@@ -35,6 +35,7 @@ char        *user,              /* user to run as */
             *ctrl_name;         /* control socket name */
 
 int         alive_to,           /* check interval for resurrection */
+            anonymise,          /* anonymise client address */
             daemonize,          /* run as daemon */
             log_facility,       /* log facility to use */
             print_log,          /* print log messages to stdout/stderr */
@@ -155,7 +156,7 @@ get_thr_arg(void)
     thr_arg *res;
 
     (void)pthread_mutex_lock(&arg_mut);
-    while(first == NULL)
+    if(first == NULL)
         (void)pthread_cond_wait(&arg_cond, &arg_mut);
     if((res = first) != NULL)
         if((first = first->next) == NULL)
@@ -167,6 +168,21 @@ get_thr_arg(void)
 }
 
 /*
+ * get the current queue length
+ */
+get_thr_qlen(void)
+{
+    int     res;
+    thr_arg *tap;
+
+    (void)pthread_mutex_lock(&arg_mut);
+    for(res = 0, tap = first; tap != NULL; tap = tap->next, res++)
+        ;
+    (void)pthread_mutex_unlock(&arg_mut);
+    return res;
+}
+
+/*
  * handle SIGTERM/SIGQUIT - exit
  */
 static RETSIGTYPE
@@ -231,7 +247,6 @@ main(const int argc, char **argv)
     (void)umask(077);
     control_sock = -1;
     log_facility = -1;
-    logmsg(LOG_NOTICE, "pound version %s (DH2048, wk)", VERSION);
     logmsg(LOG_NOTICE, "starting...");
 
     signal(SIGHUP, h_shut);
diff --git a/pound.h b/pound.h
old mode 100755 (executable)
new mode 100644 (file)
index 2417aaa..5e53f40
--- a/pound.h
+++ b/pound.h
@@ -267,6 +267,7 @@ extern char *user,              /* user to run as */
             *ctrl_name;         /* control socket name */
 
 extern int  numthreads,         /* number of worker threads */
+            anonymise,          /* anonymise client address */
             alive_to,           /* check interval for resurrection */
             daemonize,          /* run as daemon */
             log_facility,       /* log facility to use */
@@ -379,34 +380,35 @@ extern SERVICE          *services;  /* global services (if any) */
 typedef struct _pound_ctx {
     SSL_CTX             *ctx;
     char                *server_name;
+    unsigned char       **subjectAltNames;
+    unsigned int        subjectAltNameCount;
     struct _pound_ctx   *next;
 } POUND_CTX;
 
 /* Listener definition */
 typedef struct _listener {
-    struct addrinfo     addr;           /* IPv4/6 address */
-    int                 sock;           /* listening socket */
-    POUND_CTX           *ctx;           /* CTX for SSL connections */
-    int                 clnt_check;     /* client verification mode */
-    int                 noHTTPS11;      /* HTTP 1.1 mode for SSL */
-    char                *add_head;      /* extra SSL header */
-    regex_t             verb;           /* pattern to match the request verb against */
-    int                 to;             /* client time-out */
-    int                 has_pat;        /* was a URL pattern defined? */
-    regex_t             url_pat;        /* pattern to match the request URL against */
-    char                *err414,        /* error messages */
+    struct addrinfo     addr;               /* IPv4/6 address */
+    int                 sock;               /* listening socket */
+    POUND_CTX           *ctx;               /* CTX for SSL connections */
+    int                 clnt_check;         /* client verification mode */
+    int                 noHTTPS11;          /* HTTP 1.1 mode for SSL */
+    char                *add_head;          /* extra SSL header */
+    regex_t             verb;               /* pattern to match the request verb against */
+    int                 to;                 /* client time-out */
+    int                 has_pat;            /* was a URL pattern defined? */
+    regex_t             url_pat;            /* pattern to match the request URL against */
+    char                *err414,            /* error messages */
                         *err500,
                         *err501,
                         *err503;
-    LONG                max_req;        /* max. request size */
-    MATCHER             *head_off;      /* headers to remove */
-    int                 rewr_loc;       /* rewrite location response */
-    int                 rewr_dest;      /* rewrite destination header */
-    int                 disabled;       /* true if the listener is disabled */
-    int                 log_level;      /* log level for this listener */
+    LONG                max_req;            /* max. request size */
+    MATCHER             *head_off;          /* headers to remove */
+    int                 rewr_loc;           /* rewrite location response */
+    int                 rewr_dest;          /* rewrite destination header */
+    int                 disabled;           /* true if the listener is disabled */
+    int                 log_level;          /* log level for this listener */
     int                 allow_client_reneg; /* Allow Client SSL Renegotiation */
-    int                disable_ssl_v2; /* Disable SSL version 2 */
-    int                disable_ssl_v3; /* Disable SSL version 3 */
+    int                 disable_ssl_v2;     /* Disable SSL version 2 */
     SERVICE             *services;
     struct _listener    *next;
 }   LISTENER;
@@ -438,6 +440,7 @@ typedef enum { RENEG_INIT=0, RENEG_REJECT, RENEG_ALLOW, RENEG_ABORT } RENEG_STAT
 #define HEADER_USER_AGENT           8
 #define HEADER_URI                  9
 #define HEADER_DESTINATION          10
+#define HEADER_EXPECT               11
 
 /* control request stuff */
 typedef enum    {
@@ -482,6 +485,11 @@ extern int  put_thr_arg(thr_arg *);
 extern thr_arg  *get_thr_arg(void);
 
 /*
+ * get the current queue length
+ */
+extern  get_thr_qlen(void);
+
+/*
  * handle an HTTP request
  */
 extern void *thr_http(void *);
@@ -519,7 +527,7 @@ extern BACKEND  *get_backend(SERVICE *const, const struct addrinfo *, const char
 /*
  * Search for a host name, return the addrinfo for it
  */
-extern int  get_host(char *const, struct addrinfo *);
+extern int  get_host(char *const, struct addrinfo *, int);
 
 /*
  * Find if a redirect needs rewriting
@@ -583,7 +591,7 @@ extern void config_parse(const int, char **const);
  */
 #define N_RSA_KEYS  11
 #ifndef T_RSA_KEYS
-#define T_RSA_KEYS  1800
+#define T_RSA_KEYS  7200
 #endif
 
 /*
index c18518a..ed6d2a7 100755 (executable)
@@ -342,9 +342,16 @@ main(const int argc, char **argv)
     write(sock, &cmd, sizeof(cmd));
 
     if (!is_set) {
+        int n;
+
         n_lstn = 0;
         if(xml_out)
             printf("<pound>\n");
+        if(read(sock, &n, sizeof(n)) == sizeof(n))
+            if(xml_out)
+                printf("<queue size=\"%d\"/>\n", n);
+            else
+                printf("Requests in queue: %d\n", n);
         while(read(sock, (void *)&lstn, sizeof(LISTENER)) == sizeof(LISTENER)) {
             if(lstn.disabled < 0)
                 break;
diff --git a/svc.c b/svc.c
old mode 100755 (executable)
new mode 100644 (file)
index 5ef8c9d..b6167e5
--- a/svc.c
+++ b/svc.c
@@ -82,7 +82,11 @@ t_find(LHASH_OF(TABNODE) *const tab, char *const key)
     TABNODE t, *res;
 
     t.key = key;
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L
+    if((res = (TABNODE *)LHM_lh_retrieve(TABNODE, tab, &t)) != NULL) {
+#else
     if((res = (TABNODE *)lh_retrieve(tab, &t)) != NULL) {
+#endif
         res->last_acc = time(NULL);
         return res->content;
     }
@@ -390,6 +394,7 @@ check_header(const char *header, char *const content)
         { "Referer",            7,  HEADER_REFERER },
         { "User-agent",         10, HEADER_USER_AGENT },
         { "Destination",        11, HEADER_DESTINATION },
+        { "Expect",             6,  HEADER_EXPECT },
         { "",                   0,  HEADER_OTHER },
     };
     int i;
@@ -749,7 +754,7 @@ upd_be(SERVICE *const svc, BACKEND *const be, const double elapsed)
  * Search for a host name, return the addrinfo for it
  */
 int
-get_host(char *const name, struct addrinfo *res)
+get_host(char *const name, struct addrinfo *res, int ai_family)
 {
     struct addrinfo *chain, *ap;
     struct addrinfo hints;
@@ -757,7 +762,7 @@ get_host(char *const name, struct addrinfo *res)
 
 #ifdef  HAVE_INET_NTOP
     memset (&hints, 0, sizeof(hints));
-    hints.ai_family = PF_UNSPEC;
+    hints.ai_family = ai_family;
     hints.ai_socktype = SOCK_STREAM;
     hints.ai_flags = AI_CANONNAME;
     if((ret_val = getaddrinfo(name, NULL, &hints, &chain)) == 0) {
@@ -800,7 +805,6 @@ need_rewrite(const int rewr_loc, char *const location, char *const path, const c
     struct sockaddr_in6     in6_addr, be6_addr;
     regmatch_t              matches[4];
     char                    *proto, *host, *port, *cp, buf[MAXBUF];
-    int                     ret_val;
 
     /* check if rewriting is required at all */
     if(rewr_loc == 0)
@@ -827,7 +831,7 @@ need_rewrite(const int rewr_loc, char *const location, char *const path, const c
      * Check if the location has the same address as the listener or the back-end
      */
     memset(&addr, 0, sizeof(addr));
-    if(get_host(host, &addr))
+    if(get_host(host, &addr, be->addr.ai_family))
         return 0;
 
     /*
@@ -837,31 +841,37 @@ need_rewrite(const int rewr_loc, char *const location, char *const path, const c
         free(addr.ai_addr);
         return 0;
     }
-    memset(buf, '\0', MAXBUF);
-    strncpy(buf, v_host, MAXBUF - 1);
-    if((cp = strchr(buf, ':')) != NULL)
-        *cp = '\0';
     if(addr.ai_family == AF_INET) {
+        memcpy(&in_addr, addr.ai_addr, sizeof(in_addr));
+        memcpy(&be_addr, be->addr.ai_addr, sizeof(be_addr));
+        if(port)
+            in_addr.sin_port = (in_port_t)htons(atoi(port));
+        else if(!strcasecmp(proto, "https"))
+            in_addr.sin_port = (in_port_t)htons(443);
+        else
+            in_addr.sin_port = (in_port_t)htons(80);
         /*
-         * check if the Location points to the Listener but with the wrong port or protocol
+         * check if the Location points to the back-end
          */
-        memcpy(&be_addr, lstn->addr.ai_addr, sizeof(be_addr));
-        if((memcmp(&be_addr.sin_addr.s_addr, &in_addr.sin_addr.s_addr, sizeof(in_addr.sin_addr.s_addr)) == 0
-          || strcasecmp(host, buf) == 0)
-        && (memcmp(&be_addr.sin_port, &in_addr.sin_port, sizeof(in_addr.sin_port)) != 0
-          || strcasecmp(proto, (lstn->ctx == NULL)? "http": "https"))) {
+        if(memcmp(&be_addr.sin_addr.s_addr, &in_addr.sin_addr.s_addr, sizeof(in_addr.sin_addr.s_addr)) == 0
+        && memcmp(&be_addr.sin_port, &in_addr.sin_port, sizeof(in_addr.sin_port)) == 0) {
             free(addr.ai_addr);
             return 1;
         }
     } else /* AF_INET6 */ {
+        memcpy(&in6_addr, addr.ai_addr, sizeof(in6_addr));
+        memcpy(&be6_addr, be->addr.ai_addr, sizeof(be6_addr));
+        if(port)
+            in6_addr.sin6_port = (in_port_t)htons(atoi(port));
+        else if(!strcasecmp(proto, "https"))
+            in6_addr.sin6_port = (in_port_t)htons(443);
+        else
+            in6_addr.sin6_port = (in_port_t)htons(80);
         /*
-         * check if the Location points to the Listener but with the wrong port or protocol
+         * check if the Location points to the back-end
          */
-        memcpy(&be6_addr, lstn->addr.ai_addr, sizeof(be6_addr));
-        if((memcmp(&be6_addr.sin6_addr.s6_addr, &in6_addr.sin6_addr.s6_addr, sizeof(in6_addr.sin6_addr.s6_addr)) == 0
-          || strcasecmp(host, buf) == 0)
-        && (memcmp(&be6_addr.sin6_port, &in6_addr.sin6_port, sizeof(in6_addr.sin6_port)) != 0
-          || strcasecmp(proto, (lstn->ctx == NULL)? "http": "https"))) {
+        if(memcmp(&be6_addr.sin6_addr.s6_addr, &in6_addr.sin6_addr.s6_addr, sizeof(in6_addr.sin6_addr.s6_addr)) == 0
+        && memcmp(&be6_addr.sin6_port, &in6_addr.sin6_port, sizeof(in6_addr.sin6_port)) == 0) {
             free(addr.ai_addr);
             return 1;
         }
@@ -874,25 +884,29 @@ need_rewrite(const int rewr_loc, char *const location, char *const path, const c
         free(addr.ai_addr);
         return 0;
     }
+    memset(buf, '\0', MAXBUF);
+    strncpy(buf, v_host, MAXBUF - 1);
+    if((cp = strchr(buf, ':')) != NULL)
+        *cp = '\0';
     if(addr.ai_family == AF_INET) {
-        memcpy(&in_addr, addr.ai_addr, sizeof(in_addr));
         memcpy(&be_addr, lstn->addr.ai_addr, sizeof(be_addr));
         /*
          * check if the Location points to the Listener but with the wrong port or protocol
          */
-        if(memcmp(&be_addr.sin_addr.s_addr, &in_addr.sin_addr.s_addr, sizeof(in_addr.sin_addr.s_addr)) == 0
+        if((memcmp(&be_addr.sin_addr.s_addr, &in_addr.sin_addr.s_addr, sizeof(in_addr.sin_addr.s_addr)) == 0
+          || strcasecmp(host, buf) == 0)
         && (memcmp(&be_addr.sin_port, &in_addr.sin_port, sizeof(in_addr.sin_port)) != 0
             || strcasecmp(proto, lstn->ctx? "http": "https"))) {
             free(addr.ai_addr);
             return 1;
         }
     } else {
-        memcpy(&in6_addr, addr.ai_addr, sizeof(in6_addr));
         memcpy(&be6_addr, lstn->addr.ai_addr, sizeof(be6_addr));
         /*
          * check if the Location points to the Listener but with the wrong port or protocol
          */
-        if(memcmp(&be6_addr.sin6_addr.s6_addr, &in6_addr.sin6_addr.s6_addr, sizeof(in6_addr.sin6_addr.s6_addr)) == 0
+        if((memcmp(&be6_addr.sin6_addr.s6_addr, &in6_addr.sin6_addr.s6_addr, sizeof(in6_addr.sin6_addr.s6_addr)) == 0
+          || strcasecmp(host, buf) == 0)
         && (memcmp(&be6_addr.sin6_port, &in6_addr.sin6_port, sizeof(in6_addr.sin6_port)) != 0
             || strcasecmp(proto, lstn->ctx? "http": "https"))) {
             free(addr.ai_addr);
@@ -1434,19 +1448,27 @@ do_RSAgen(void)
     return;
 }
 
-/* #include    "dh512.h" */
-/* #include    "dh1024.h" */
-#include    "dh2048.h"
+#include    "dh512.h"
 
-/* static DH   *DH512_params, *DH1024_params; */
-static DH   *DH2048_params;
+#if DH_LEN == 1024
+#include    "dh1024.h"
+static DH   *DH512_params, *DH1024_params;
 
 DH *
 DH_tmp_callback(/* not used */SSL *s, /* not used */int is_export, int keylength)
 {
-    /* return keylength == 512? DH512_params: DH1024_params; */
-  return DH2048_params;
+    return keylength == 512? DH512_params: DH1024_params;
 }
+#else
+#include    "dh2048.h"
+static DH   *DH512_params, *DH2048_params;
+
+DH *
+DH_tmp_callback(/* not used */SSL *s, /* not used */int is_export, int keylength)
+{
+    return keylength == 512? DH512_params: DH2048_params;
+}
+#endif
 
 static time_t   last_RSA, last_rescale, last_alive, last_expire;
 
@@ -1477,9 +1499,12 @@ init_timer(void)
     /* pthread_mutex_init() always returns 0 */
     pthread_mutex_init(&RSA_mut, NULL);
 
-    /* DH512_params = get_dh512(); */
-    /* DH1024_params = get_dh1024(); */
+    DH512_params = get_dh512();
+#if DH_LEN == 1024
+    DH1024_params = get_dh1024();
+#else
     DH2048_params = get_dh2048();
+#endif
 
     return;
 }
@@ -1642,7 +1667,7 @@ thr_control(void *arg)
 {
     CTRL_CMD        cmd;
     struct sockaddr sa;
-    int             ctl, dummy, ret_val;
+    int             ctl, dummy, n, ret_val;
     LISTENER        *lstn, dummy_lstn;
     SERVICE         *svc, dummy_svc;
     BACKEND         *be, dummy_be;
@@ -1680,6 +1705,8 @@ thr_control(void *arg)
         switch(cmd.cmd) {
         case CTRL_LST:
             /* logmsg(LOG_INFO, "thr_control() list"); */
+            n = get_thr_qlen();
+            (void)write(ctl, (void *)&n, sizeof(n));
             for(lstn = listeners; lstn; lstn = lstn->next) {
                 (void)write(ctl, (void *)lstn, sizeof(LISTENER));
                 (void)write(ctl, lstn->addr.ai_addr, lstn->addr.ai_addrlen);
@@ -1781,7 +1808,7 @@ thr_control(void *arg)
                 logmsg(LOG_WARNING, "thr_control() add session lock: %s", strerror(ret_val));
             t_add(svc->sessions, cmd.key, &be, sizeof(be));
             if(ret_val = pthread_mutex_unlock(&svc->mut))
-                logmsg(LOG_WARNING, "thr_control() add session unlock: %s", strerror(ret_val));
+                logmsg(LOG_WARNING, "thoriginalfiler_control() add session unlock: %s", strerror(ret_val));
             break;
         case CTRL_DEL_SESS:
             if((svc = sel_svc(&cmd)) == NULL) {
@@ -1808,27 +1835,20 @@ SSLINFO_callback(const SSL *ssl, int where, int rc)
     RENEG_STATE *reneg_state;
 
     /* Get our thr_arg where we're tracking this connection info */
-    if ((reneg_state = (RENEG_STATE *)SSL_get_app_data(ssl)) == NULL) return;
+    if((reneg_state = (RENEG_STATE *)SSL_get_app_data(ssl)) == NULL)
+        return;
 
     /* If we're rejecting renegotiations, move to ABORT if Client Hello is being read. */
-    if ((where & SSL_CB_ACCEPT_LOOP) && *reneg_state == RENEG_REJECT) {
-        int state = SSL_get_state(ssl);
+    if((where & SSL_CB_ACCEPT_LOOP) && *reneg_state == RENEG_REJECT) {
+        int state;
 
+        state = SSL_get_state(ssl);
         if (state == SSL3_ST_SR_CLNT_HELLO_A || state == SSL23_ST_SR_CLNT_HELLO_A) {
            *reneg_state = RENEG_ABORT;
            logmsg(LOG_WARNING,"rejecting client initiated renegotiation");
         }
-    }
-    else if (where & SSL_CB_HANDSHAKE_DONE && *reneg_state == RENEG_INIT) {
+    } else if(where & SSL_CB_HANDSHAKE_DONE && *reneg_state == RENEG_INIT) {
        // Reject any followup renegotiations
        *reneg_state = RENEG_REJECT;
     }
-
-    //if (where & SSL_CB_HANDSHAKE_START) logmsg(LOG_DEBUG, "handshake start");
-    //else if (where & SSL_CB_HANDSHAKE_DONE) logmsg(LOG_DEBUG, "handshake done");
-    //else if (where & SSL_CB_LOOP) logmsg(LOG_DEBUG, "loop");
-    //else if (where & SSL_CB_READ) logmsg(LOG_DEBUG, "read");
-    //else if (where & SSL_CB_WRITE) logmsg(LOG_DEBUG, "write");
-    //else if (where & SSL_CB_ALERT) logmsg(LOG_DEBUG, "alert");
 }
-