]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.9-20110706
authorWietse Venema <wietse@porcupine.org>
Wed, 6 Jul 2011 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:37:23 +0000 (06:37 +0000)
16 files changed:
postfix/HISTORY
postfix/README_FILES/PACKAGE_README
postfix/README_FILES/SASL_README
postfix/WISHLIST
postfix/html/PACKAGE_README.html
postfix/html/SASL_README.html
postfix/html/postconf.5.html
postfix/man/man5/postconf.5
postfix/postfix-install
postfix/proto/PACKAGE_README.html
postfix/proto/SASL_README.html
postfix/proto/postconf.proto
postfix/src/global/mail_version.h
postfix/src/global/smtp_reply_footer.c
postfix/src/smtpd/smtpd_check.c
postfix/src/util/sys_defs.h

index eca95e4d580b31e79bbe2d54f12b4ab0f0400679..e2dd02635485d4a52e3e9e34bf31f5c64d82c3c8 100644 (file)
@@ -16841,3 +16841,12 @@ Apologies for any names omitted.
        IP queries" even if the name has an alphanumerical prefix.
        We play safe, and skip both RHSBL and RHSWL queries for
        names ending in a numerical suffix.  File: smtpd/smtpd_check.c.
+
+20110624
+
+       Cleanup: added error checks for smtpd access primitives
+       that don't automatically terminate the program after table
+       lookup error: these primitives are permit_tls_clientcerts,
+       permit_tls_all_clientcerts, and check_address_map (the last
+       one is used in local_header_rewrite_clients only).  File:
+       smtpd/smtpd_check.c.
index 2d51e40f53f7e209995e0a125301b0acffd39c84..d9007833755e3e39b795d7d7e886aa6bacd44a03 100644 (file)
@@ -4,9 +4,9 @@ G\bGu\bui\bid\bde\bel\bli\bin\bne\bes\bs f\bfo\bor\br P\bPa\bac\bck\bka\bag\bge\be B\bBu\bui\bil\bld\bde\b
 
 P\bPu\bur\brp\bpo\bos\bse\be o\bof\bf t\bth\bhi\bis\bs d\bdo\boc\bcu\bum\bme\ben\bnt\bt
 
-This document has hints and tips for those who manage their own Postfix
-distribution for internal use, and for those who maintain Postfix distributions
-for general use.
+This document has hints and tips for those who manage their own Postfix binary
+distribution for internal use, and for those who maintain Postfix binary
+distributions for general use.
 
 G\bGe\ben\bne\ber\bra\bal\bl d\bdi\bis\bst\btr\bri\bib\bbu\but\bti\bio\bon\bns\bs:\b: p\bpl\ble\bea\bas\bse\be p\bpr\bro\bov\bvi\bid\bde\be a\ba s\bsm\bma\bal\bll\bl d\bde\bef\bfa\bau\bul\blt\bt m\bma\bai\bin\bn.\b.c\bcf\bf f\bfi\bil\ble\be
 
index 2ebd342cde3430dee644162b9a339195eb037991..54c9fb352d35e1e87d73869c518a5b809f1148d6 100644 (file)
@@ -922,21 +922,34 @@ named `test' with password `testpass'.
 You can use one of the following commands to generate base64 encoded
 authentication information:
 
-    % g\bge\ben\bn-\b-a\bau\but\bth\bh p\bpl\bla\bai\bin\bn
-    username: u\bus\bse\ber\brn\bna\bam\bme\be
-    password:
+  * Using a recent version of the b\bba\bas\bsh\bh shell:
 
-The g\bge\ben\bn-\b-a\bau\but\bth\bh Perl script was written by John Jetmore and can be found at http:/
-/jetmore.org/john/code/gen-auth.
+        % e\bec\bch\bho\bo -\b-n\bne\be '\b'\\b\0\b00\b00\b0u\bus\bse\ber\brn\bna\bam\bme\be\\b\0\b00\b00\b0p\bpa\bas\bss\bsw\bwo\bor\brd\bd'\b' |\b| o\bop\bpe\ben\bns\bss\bsl\bl b\bba\bas\bse\be6\b64\b4
 
-    % p\bpr\bri\bin\bnt\btf\bf '\b'\\b\0\b0u\bus\bse\ber\brn\bna\bam\bme\be\\b\0\b0p\bpa\bas\bss\bsw\bwo\bor\brd\bd'\b' |\b| m\bmm\bme\ben\bnc\bco\bod\bde\be
+    Some other shells support similar syntax.
 
-The m\bmm\bme\ben\bnc\bco\bod\bde\be command is part of the metamail software.
+  * Using the p\bpr\bri\bin\bnt\btf\bf command:
 
-    % p\bpe\ber\brl\bl -\b-M\bMM\bMI\bIM\bME\bE:\b::\b:B\bBa\bas\bse\be6\b64\b4 -\b-e\be \\b\
-        '\b'p\bpr\bri\bin\bnt\bt e\ben\bnc\bco\bod\bde\be_\b_b\bba\bas\bse\be6\b64\b4(\b("\b"\\b\0\b0u\bus\bse\ber\brn\bna\bam\bme\be\\b\0\b0p\bpa\bas\bss\bsw\bwo\bor\brd\bd"\b")\b);\b;'\b'
+        % p\bpr\bri\bin\bnt\btf\bf '\b'\\b\0\b0%\b%s\bs\\b\0\b0%\b%s\bs'\b' '\b'u\bus\bse\ber\brn\bna\bam\bme\be'\b' '\b'p\bpa\bas\bss\bsw\bwo\bor\brd\bd'\b' |\b| o\bop\bpe\ben\bns\bss\bsl\bl b\bba\bas\bse\be6\b64\b4
+        % p\bpr\bri\bin\bnt\btf\bf '\b'\\b\0\b0%\b%s\bs\\b\0\b0%\b%s\bs'\b' '\b'u\bus\bse\ber\brn\bna\bam\bme\be'\b' '\b'p\bpa\bas\bss\bsw\bwo\bor\brd\bd'\b' |\b| m\bmm\bme\ben\bnc\bco\bod\bde\be
 
-MIME::Base64 is available from http://www.cpan.org/.
+    The m\bmm\bme\ben\bnc\bco\bod\bde\be command is part of the metamail software.
+
+  * Using Perl M\bMI\bIM\bME\bE:\b::\b:B\bBa\bas\bse\be6\b64\b4:
+
+        % p\bpe\ber\brl\bl -\b-M\bMM\bMI\bIM\bME\bE:\b::\b:B\bBa\bas\bse\be6\b64\b4 -\b-e\be \\b\
+            '\b'p\bpr\bri\bin\bnt\bt e\ben\bnc\bco\bod\bde\be_\b_b\bba\bas\bse\be6\b64\b4(\b("\b"\\b\0\b0u\bus\bse\ber\brn\bna\bam\bme\be\\b\0\b0p\bpa\bas\bss\bsw\bwo\bor\brd\bd"\b")\b);\b;'\b'
+
+    MIME::Base64 is available from http://www.cpan.org/.
+
+  * Using the g\bge\ben\bn-\b-a\bau\but\bth\bh script:
+
+        % g\bge\ben\bn-\b-a\bau\but\bth\bh p\bpl\bla\bai\bin\bn
+        username: u\bus\bse\ber\brn\bna\bam\bme\be
+        password:
+
+    The g\bge\ben\bn-\b-a\bau\but\bth\bh Perl script was written by John Jetmore and can be found at
+    http://jetmore.org/john/code/gen-auth.
 
 C\bCo\bon\bnf\bfi\big\bgu\bur\bri\bin\bng\bg S\bSA\bAS\bSL\bL a\bau\but\bth\bhe\ben\bnt\bti\bic\bca\bat\bti\bio\bon\bn i\bin\bn t\bth\bhe\be P\bPo\bos\bst\btf\bfi\bix\bx S\bSM\bMT\bTP\bP/\b/L\bLM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bt
 
index 4f0ce0caed87d67bc6d09238c0513307be0ccc5f..0f11b8c6b577b6f9405743a816c2a3142a9c75ac 100644 (file)
@@ -40,8 +40,17 @@ Wish list:
        into doubles (converting only some leads to a documentation
        nightmare).
 
-       postscreen: wait for DNS completion after early HANGUP
-       and log DNSBL.
+       postscreen: wait for DNS completion after early HANGUP and
+       log DNSBL results. If the client was still waiting for the
+       PREGREET timer, just flag the PREGREET test as (done, not
+       passed).  If the client was not waiting for the PREGREET
+       timer, just wait until DNSBL lookup (if any) completes.
+
+       Address verify cache: allow a negative cache "refresh"
+       result to purge a "positive" cache entry in some safe manner.
+       Currently, the negative cache "refresh" result is discarded,
+       address verify cache lookup returns OK, and each lookup
+       forces a "refresh" probe until the entry expires.
 
        Some Sendmail configurations trigger sub-optimal behavior
        when the postscreen_whitelist_interfaces parameter lists
@@ -73,6 +82,13 @@ Wish list:
        be sent. This reduces the time window for RFC 1047 message
        duplication, and may even prevent the delivery of some spam.
        http://www.exim.org/lurker/message/20070416.103159.9d5ff0ce.en.html
+       This requires splitting the SMTP server's commit operation
+       into two operations: first, a tentative commit operation
+       that performs most of the I/O and processing in milters and
+       in the cleanup server; second, a final commit operation
+       that is executed only if the remote SMTP client hasn't hung
+       up in the mean time. Unfortunately, SMTP-based before-queue
+       content filters don't support a tentative commit operation.
 
        Find out how to reproduce Berkeley DB bogus ENOENT errors.
        postscreen does not log this with Berkeley DB 1 (FreeBSD
index 9eec205a730a3b2eb69f20b1fd223c9529a37e40..5f651bc3e28cae9bbf7016527055b2b504523f53 100644 (file)
@@ -20,8 +20,8 @@
 <h2>Purpose of this document</h2>
 
 <p> This document has hints and tips for those who manage their
-own Postfix distribution for internal use, and for those who maintain
-Postfix distributions for general use.  </p>
+own Postfix binary distribution for internal use, and for those who
+maintain Postfix binary distributions for general use.  </p>
 
 <h2>General distributions: please provide a small default main.cf
 file</h2>
index bd5fac0e41a5b63a051a0872f84d2f7ad069a6ef..cc75f7bc2e09b213268aff4829f6812a51e32571 100644 (file)
@@ -1490,26 +1490,32 @@ to recover from the base64-encoded form. </p>
 <p> You can use one of the following commands to generate base64
 encoded authentication information: </p>
 
+<ul>
+
+<li> <p> Using a recent version of the <b>bash</b> shell: </p>
+
 <blockquote>
 <pre>
-% <strong>gen-auth plain</strong>
-username: <strong><em>username</em></strong>
-password:
+% <strong>echo -ne '\000username\000password' | openssl base64</strong>
 </pre>
 </blockquote>
 
-<p> The <strong>gen-auth</strong> Perl script was written by John
-Jetmore and can be found at <a href="http://jetmore.org/john/code/gen-auth">http://jetmore.org/john/code/gen-auth</a>. </p>
+<p> Some other shells support similar syntax. </p>
+
+<li> <p> Using the <b>printf</b> command: </p>
 
 <blockquote>
 <pre>
-% <strong>printf '\0<em>username</em>\0<em>password</em>' | mmencode</strong>
+% <strong>printf '\0%s\0%s' '<em>username</em>' '<em>password</em>' | openssl base64</strong>
+% <strong>printf '\0%s\0%s' '<em>username</em>' '<em>password</em>' | mmencode</strong>
 </pre>
 </blockquote>
 
 <p> The <strong>mmencode</strong> command is part of the metamail
 software. </p>
 
+<li> <p> Using Perl <b>MIME::Base64</b>: </p>
+
 <blockquote>
 <pre>
 % <strong>perl -MMIME::Base64 -e \
@@ -1519,6 +1525,21 @@ software. </p>
 
 <p> MIME::Base64 is available from <a href="http://www.cpan.org/">http://www.cpan.org/</a>. </p>
 
+<li> <p> Using the <b>gen-auth</b> script: </p>
+
+<blockquote>
+<pre>
+% <strong>gen-auth plain</strong>
+username: <strong><em>username</em></strong>
+password:
+</pre>
+</blockquote>
+
+<p> The <strong>gen-auth</strong> Perl script was written by John
+Jetmore and can be found at <a href="http://jetmore.org/john/code/gen-auth">http://jetmore.org/john/code/gen-auth</a>. </p>
+
+</ul>
+
 <h2><a name="client_sasl">Configuring SASL authentication in the Postfix SMTP/LMTP client</a></h2>
 
 <p> The Postfix SMTP and the LMTP client can authenticate with a
@@ -1912,7 +1933,7 @@ except for <code>GSSAPI</code> and <code>LOGIN</code>: </p>
 <blockquote>
 <pre>
 /etc/postfix/<a href="postconf.5.html">main.cf</a>:
-    <a href="postconf.5.html#smtp_sasl_mechanism_filter">smtp_sasl_mechanism_filter</a> = !gssapi, !login, static:all
+    <a href="postconf.5.html#smtp_sasl_mechanism_filter">smtp_sasl_mechanism_filter</a> = !gssapi, !login, <a href="DATABASE_README.html#types">static</a>:all
 </pre>
 </blockquote>
 
index 817eaa6b869944bc92363321f292743b61398888..1914a2ce5be572afa15b3442e2a42be50914a0a8 100644 (file)
@@ -7810,6 +7810,8 @@ Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
 </p>
 
+<p> This feature is available in Postfix 2.8 and later.  </p>
+
 
 </DD>
 
@@ -7843,6 +7845,8 @@ Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
 </p>
 
+<p> This feature is available in Postfix 2.8 and later.  </p>
+
 
 </DD>
 
index 4aecf46e19a7a3c6a87799ec1e26c63ffeaf0088..c8467e6695a8ff4ece30e41dafced62ed8d60251 100644 (file)
@@ -4502,6 +4502,8 @@ a request before it is terminated by a built-in watchdog timer.
 .PP
 Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
+.PP
+This feature is available in Postfix 2.8 and later.
 .SH qmgr_fudge_factor (default: 100)
 Obsolete feature: the percentage of delivery resources that a busy
 mail system will use up for delivery of a large mailing  list
@@ -4517,6 +4519,8 @@ software either retries or aborts the operation.
 .PP
 Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
+.PP
+This feature is available in Postfix 2.8 and later.
 .SH qmgr_message_active_limit (default: 20000)
 The maximal number of messages in the active queue.
 .SH qmgr_message_recipient_limit (default: 20000)
index f936b81a02bcd8f1c2d0b5ec36c89600752683d4..775b0acfe383f365ca55d37bb06093ea2b842ef6 100644 (file)
@@ -305,7 +305,7 @@ esac
 
 install_root_prompt="the prefix for installed file names. Specify
 this ONLY if you are building ready-to-install packages for
-distribution to other machines."
+distribution to OTHER machines. See PACKAGE_README for instructions."
 
 tempdir_prompt="a directory for scratch files while installing
 Postfix.  You must have write permission in this directory."
index cf5ee523d94255e8922cbf949fe97a40e2e0d5c6..1698f9a7a20747752ed93695873bfdfdde6810ee 100644 (file)
@@ -20,8 +20,8 @@
 <h2>Purpose of this document</h2>
 
 <p> This document has hints and tips for those who manage their
-own Postfix distribution for internal use, and for those who maintain
-Postfix distributions for general use.  </p>
+own Postfix binary distribution for internal use, and for those who
+maintain Postfix binary distributions for general use.  </p>
 
 <h2>General distributions: please provide a small default main.cf
 file</h2>
index 5ab745480d08fc52f7ce026fac577f055b66c94c..d73ae7726c7c4e203431ee10cb09654c57eb6385 100644 (file)
@@ -1490,26 +1490,32 @@ to recover from the base64-encoded form. </p>
 <p> You can use one of the following commands to generate base64
 encoded authentication information: </p>
 
+<ul>
+
+<li> <p> Using a recent version of the <b>bash</b> shell: </p>
+
 <blockquote>
 <pre>
-% <strong>gen-auth plain</strong>
-username: <strong><em>username</em></strong>
-password:
+% <strong>echo -ne '\000username\000password' | openssl base64</strong>
 </pre>
 </blockquote>
 
-<p> The <strong>gen-auth</strong> Perl script was written by John
-Jetmore and can be found at http://jetmore.org/john/code/gen-auth. </p>
+<p> Some other shells support similar syntax. </p>
+
+<li> <p> Using the <b>printf</b> command: </p>
 
 <blockquote>
 <pre>
-% <strong>printf '\0<em>username</em>\0<em>password</em>' | mmencode</strong>
+% <strong>printf '\0%s\0%s' '<em>username</em>' '<em>password</em>' | openssl base64</strong>
+% <strong>printf '\0%s\0%s' '<em>username</em>' '<em>password</em>' | mmencode</strong>
 </pre>
 </blockquote>
 
 <p> The <strong>mmencode</strong> command is part of the metamail
 software. </p>
 
+<li> <p> Using Perl <b>MIME::Base64</b>: </p>
+
 <blockquote>
 <pre>
 % <strong>perl -MMIME::Base64 -e \
@@ -1519,6 +1525,21 @@ software. </p>
 
 <p> MIME::Base64 is available from http://www.cpan.org/. </p>
 
+<li> <p> Using the <b>gen-auth</b> script: </p>
+
+<blockquote>
+<pre>
+% <strong>gen-auth plain</strong>
+username: <strong><em>username</em></strong>
+password:
+</pre>
+</blockquote>
+
+<p> The <strong>gen-auth</strong> Perl script was written by John
+Jetmore and can be found at http://jetmore.org/john/code/gen-auth. </p>
+
+</ul>
+
 <h2><a name="client_sasl">Configuring SASL authentication in the Postfix SMTP/LMTP client</a></h2>
 
 <p> The Postfix SMTP and the LMTP client can authenticate with a
index b27389ec35787a004b726c53c3c77303e2a6f3ed..bf53a24f82815d54ee33648e36a8e92e35c5b038 100644 (file)
@@ -13530,6 +13530,8 @@ Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
 </p>
 
+<p> This feature is available in Postfix 2.8 and later.  </p>
+
 %PARAM qmgr_daemon_timeout 1000s
 
 <p> How much time a Postfix queue manager process may take to handle
@@ -13541,6 +13543,8 @@ Time units: s (seconds), m (minutes), h (hours), d (days), w (weeks).
 The default time unit is s (seconds).
 </p>
 
+<p> This feature is available in Postfix 2.8 and later.  </p>
+
 %PARAM tls_preempt_cipherlist no
 
 <p> With SSLv3 and later, use the server's cipher preference order
index 03e67d803276723bfa7681f7c50ff334cc58d175..697904f2accee656aa5d9328c2d94c6754f21a80 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20110615"
+#define MAIL_RELEASE_DATE      "20110706"
 #define MAIL_VERSION_NUMBER    "2.9"
 
 #ifdef SNAPSHOT
index 5018a470672b8564f8257ccaca6bc762d4732d03..6e460f44293c7a45a1f6a92e4a1e653ef6b904a2 100644 (file)
@@ -15,8 +15,8 @@
 /*     const char *(*lookup) (const char *name, char *context);
 /*     char    *context;
 /* DESCRIPTION
-/*     smtp_reply_footer() expands a reply template to an existing
-/*     reply text.
+/*     smtp_reply_footer() expands a reply template, and appends
+/*     the result to an existing reply text.
 /*
 /*     Arguments:
 /* .IP buffer
index 2e14dae0d00511061b82bcbd6def811e7ce8d06d..46ee5a0558504f86b72a4d8ca3bf7e14d14ac8a8 100644 (file)
@@ -1220,13 +1220,15 @@ static int reject_unknown_mailhost(SMTPD_STATE *state, const char *name,
 
 static int permit_auth_destination(SMTPD_STATE *state, char *recipient);
 
-/* permit_tls_clientcerts - OK/DUNNO for message relaying */
+/* permit_tls_clientcerts - OK/DUNNO for message relaying, or set dict_errno */
 
 static int permit_tls_clientcerts(SMTPD_STATE *state, int permit_all_certs)
 {
 #ifdef USE_TLS
     const char *found;
 
+    dict_errno = 0;
+
     if (!state->tls_context)
        return SMTPD_CHECK_DUNNO;
 
@@ -1251,6 +1253,8 @@ static int permit_tls_clientcerts(SMTPD_STATE *state, int permit_all_certs)
            msg_info("relay_clientcerts: No match for fingerprint '%s'",
                     state->tls_context->peer_fingerprint);
     }
+#else
+    dict_errno = 0;
 #endif
     return (SMTPD_CHECK_DUNNO);
 }
@@ -3958,8 +3962,12 @@ static int generic_checks(SMTPD_STATE *state, ARGV *restrictions,
 #endif
        } else if (strcasecmp(name, PERMIT_TLS_ALL_CLIENTCERTS) == 0) {
            status = permit_tls_clientcerts(state, 1);
+           if (dict_errno != 0) 
+               reject_dict_retry(state, reply_name);
        } else if (strcasecmp(name, PERMIT_TLS_CLIENTCERTS) == 0) {
            status = permit_tls_clientcerts(state, 0);
+           if (dict_errno != 0) 
+               reject_dict_retry(state, reply_name);
        } else if (strcasecmp(name, REJECT_UNKNOWN_RCPTDOM) == 0) {
            if (state->recipient)
                status = reject_unknown_address(state, state->recipient,
@@ -4106,13 +4114,19 @@ void    smtpd_check_rewrite(SMTPD_STATE *state)
        }
        if (strcasecmp(name, PERMIT_INET_INTERFACES) == 0) {
            status = permit_inet_interfaces(state);
+           /* dict errors are fatal */
        } else if (strcasecmp(name, PERMIT_MYNETWORKS) == 0) {
            status = permit_mynetworks(state);
+           /* dict errors are fatal */
        } else if (is_map_command(state, name, CHECK_ADDR_MAP, &cpp)) {
            if ((dict = dict_handle(*cpp)) == 0)
                msg_panic("%s: dictionary not found: %s", myname, *cpp);
+           dict_errno = 0;
+           /* for now, dict errors are fatal */
            if (dict_get(dict, state->addr) != 0)
                status = SMTPD_CHECK_OK;
+           else if (dict_errno != 0)
+               msg_fatal("%s: table lookup error", *cpp);
        } else if (strcasecmp(name, PERMIT_SASL_AUTH) == 0) {
 #ifdef USE_SASL_AUTH
            if (smtpd_sasl_is_active(state))
@@ -4121,8 +4135,18 @@ void    smtpd_check_rewrite(SMTPD_STATE *state)
 #endif
        } else if (strcasecmp(name, PERMIT_TLS_ALL_CLIENTCERTS) == 0) {
            status = permit_tls_clientcerts(state, 1);
+           /* for now, dict errors are fatal */
+#ifdef USE_TLS
+           if (dict_errno != 0)
+               msg_fatal("%s: table lookup error", var_smtpd_relay_ccerts);
+#endif
        } else if (strcasecmp(name, PERMIT_TLS_CLIENTCERTS) == 0) {
            status = permit_tls_clientcerts(state, 0);
+           /* for now, dict errors are fatal */
+#ifdef USE_TLS
+           if (dict_errno != 0)
+               msg_fatal("%s: table lookup error", var_smtpd_relay_ccerts);
+#endif
        } else {
            msg_warn("parameter %s: invalid request: %s",
                     VAR_LOC_RWR_CLIENTS, name);
index bbe370f2ba0ecd3107730f31cce28637dc979ffe..422219055104404fdfc27ea31e7b460029b1cda2 100644 (file)
@@ -1547,6 +1547,9 @@ typedef int pid_t;
   * Bit banging!! There is no official constant that defines the INT_MAX
   * equivalent of the off_t type. Wietse came up with the following macro
   * that works as long as off_t is some two's complement number.
+  * 
+  * Note, however, that C99 permits signed integer representations other than
+  * two's complement.
   */
 #include <limits.h>
 #define __MAXINT__(T) ((T) (((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ ((T) -1))))