]> granicus.if.org Git - python/commitdiff
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887...
authorGeorg Brandl <georg@python.org>
Tue, 10 Jun 2008 17:40:04 +0000 (17:40 +0000)
committerGeorg Brandl <georg@python.org>
Tue, 10 Jun 2008 17:40:04 +0000 (17:40 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r63562 | martin.v.loewis | 2008-05-23 17:06:50 +0200 (Fri, 23 May 2008) | 2 lines

  Patch #1722225: Support QNX 6.
........
  r63570 | trent.nelson | 2008-05-23 22:33:14 +0200 (Fri, 23 May 2008) | 1 line

  Introduce a user macro named $(externalsDir), which should point to the root directory of where all the external sources should live.  Developers can change this value if their external sources live elsewhere.  The default of '..\..' matches the current status quo.
........
  r63728 | gregory.p.smith | 2008-05-26 23:16:34 +0200 (Mon, 26 May 2008) | 4 lines

  Fix issue2589: there was a potential integer overflow leading to
  memory corruption on esoteric platforms and incorrect behavior on
  normal platforms.
........
  r63734 | gregory.p.smith | 2008-05-27 00:07:28 +0200 (Tue, 27 May 2008) | 3 lines

  Fix issue2588: Do not execute str[size-1] = '\0' when a 0 size is
  passed in.  (The assert won't prevent this in non-debug builds).
........
  r63784 | raymond.hettinger | 2008-05-29 10:38:23 +0200 (Thu, 29 May 2008) | 1 line

  Fix two typos.
........
  r63788 | facundo.batista | 2008-05-29 18:39:26 +0200 (Thu, 29 May 2008) | 6 lines

  Fixed the semantic of timeout for socket.create_connection and
  all the upper level libraries that use it, including urllib2.
  Added and fixed some tests, and changed docs correspondingly.
  Thanks to John J Lee for the patch and the pusing, :)
........
  r63802 | mark.dickinson | 2008-05-30 04:46:53 +0200 (Fri, 30 May 2008) | 2 lines

  Fix typo in testSum
........
  r63817 | raymond.hettinger | 2008-05-30 20:20:50 +0200 (Fri, 30 May 2008) | 8 lines

  * Mark intermedidate computes values (hi, lo, yr) as volatile.
  * Expand comments.
  * Swap variable names in the sum_exact code so that x and y
    are consistently chosen as the larger and smaller magnitude
    values respectively.
........
  r63827 | raymond.hettinger | 2008-05-31 05:24:31 +0200 (Sat, 31 May 2008) | 1 line

  Implement heapq in terms of less-than (to match list.sort()).
........
  r63839 | gerhard.haering | 2008-05-31 23:33:27 +0200 (Sat, 31 May 2008) | 2 lines

  Fixed rowcount for SELECT statements. They're -1 now (again), for better DB-API 2.0 compliance.
........
  r63887 | gregory.p.smith | 2008-06-02 06:05:52 +0200 (Mon, 02 Jun 2008) | 4 lines

  Fix issue 2782: be less strict about the format string type in strftime.
  Accept unicode and anything else ParseTuple "s#" can deal with.  This
  matches the time.strftime behavior.
........
  r63975 | neal.norwitz | 2008-06-06 06:47:01 +0200 (Fri, 06 Jun 2008) | 3 lines

  Aldo Cortesi confirmed this is still needed for OpenBSD 4.2 and 4.3.
  (I didn't regen configure, since I don't have a working autoconf.)
........
  r63998 | raymond.hettinger | 2008-06-06 23:47:51 +0200 (Fri, 06 Jun 2008) | 1 line

  Issue 3501: Make heapq support both __le__ and __lt__.
........

42 files changed:
Doc/library/ftplib.rst
Doc/library/http.client.rst
Doc/library/poplib.rst
Doc/library/smtplib.rst
Doc/library/socket.rst
Doc/library/telnetlib.rst
Doc/library/urllib2.rst
Include/pyport.h
Lib/ftplib.py
Lib/heapq.py
Lib/http/client.py
Lib/poplib.py
Lib/smtplib.py
Lib/socket.py
Lib/sqlite3/test/dbapi.py
Lib/telnetlib.py
Lib/test/test_datetime.py
Lib/test/test_ftplib.py
Lib/test/test_httplib.py
Lib/test/test_math.py
Lib/test/test_poplib.py
Lib/test/test_smtplib.py
Lib/test/test_socket.py
Lib/test/test_telnetlib.py
Lib/test/test_urllib.py
Lib/test/test_urllib2.py
Lib/test/test_urllib2net.py
Lib/urllib.py
Lib/urllib2.py
Modules/_ctypes/libffi/configure
Modules/_ctypes/libffi/configure.ac
Modules/_ctypes/malloc_closure.c
Modules/_heapqmodule.c
Modules/_sqlite/cursor.c
Modules/_sqlite/cursor.h
Modules/datetimemodule.c
Modules/mathmodule.c
PCbuild/pyproject.vsprops
Python/mysnprintf.c
configure.in
pyconfig.h.in
setup.py

index 99aae0d22f6d361ff7fe951b0582c0efe3bc881c..8a35a408b797bfebbce214a00c1bceff41929ef0 100644 (file)
@@ -44,8 +44,8 @@ The module defines the following items:
    the method call ``login(user, passwd, acct)`` is made (where *passwd* and
    *acct* default to the empty string when not given).  The optional *timeout*
    parameter specifies a timeout in seconds for blocking operations like the
-   connection attempt (if is not specified, or passed as None, the global
-   default timeout setting will be used).
+   connection attempt (if is not specified, the global default timeout setting
+   will be used).
 
 
    .. attribute:: all_errors
@@ -123,10 +123,8 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
    made.
 
    The optional *timeout* parameter specifies a timeout in seconds for the
-   connection attempt. If is not specified, or passed as None, the object
-   timeout is used (the timeout that you passed when instantiating the class);
-   if the object timeout is also None, the global default timeout setting will
-   be used.
+   connection attempt. If no *timeout* is passed, the global default timeout
+   setting will be used.
 
 
 .. method:: FTP.getwelcome()
index 6903b6a903ccf1c8abb30e70e870224c34f107f9..9c895633c908c420184e122b7c4570b408d7cfce 100644 (file)
@@ -33,7 +33,7 @@ The module provides the following classes:
    be raised if the status line can't be parsed as a valid HTTP/1.0 or 1.1
    status line.  If the optional *timeout* parameter is given, blocking
    operations (like connection attempts) will timeout after that many seconds
-   (if it is not given or ``None``, the global default timeout setting is used).
+   (if it is not given, the global default timeout setting is used).
 
    For example, the following calls all create instances that connect to the server
    at the same host and port::
index 893296fadedf558eb72273c48099bea4e24ca823..0b2c033af59fafe49465431314f55e33a3bd465d 100644 (file)
@@ -29,8 +29,8 @@ A single class is provided by the :mod:`poplib` module:
    This class implements the actual POP3 protocol.  The connection is created when
    the instance is initialized. If *port* is omitted, the standard POP3 port (110)
    is used. The optional *timeout* parameter specifies a timeout in seconds for the
-   connection attempt (if not specified, or passed as None, the global default
-   timeout setting will be used).
+   connection attempt (if not specified, the global default timeout setting will
+   be used).
 
 
 .. class:: POP3_SSL(host[, port[, keyfile[, certfile]]])
index 602edb6a3f144dba6809729f411805cc5a718ea3..31f1ad6e11dafea5f9b3c8be1d3a5a1522dc5c36 100644 (file)
@@ -25,8 +25,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
    with those parameters during initialization.  An :exc:`SMTPConnectError` is
    raised if the specified host doesn't respond correctly. The optional
    *timeout* parameter specifies a timeout in seconds for blocking operations
-   like the connection attempt (if not specified, or passed as None, the global
-   default timeout setting will be used).
+   like the connection attempt (if not specified, the global default timeout
+   setting will be used).
 
    For normal use, you should only require the initialization/connect,
    :meth:`sendmail`, and :meth:`quit` methods.  An example is included below.
@@ -42,8 +42,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
    and *certfile* are also optional, and can contain a PEM formatted private key
    and certificate chain file for the SSL connection. The optional *timeout*
    parameter specifies a timeout in seconds for blocking operations like the
-   connection attempt (if not specified, or passed as None, the global default
-   timeout setting will be used).
+   connection attempt (if not specified, the global default timeout setting
+   will be used).
 
 
 .. class:: LMTP([host[, port[, local_hostname]]])
index 8fefce6942472fa5b0bca78a99fbaa1090e0ac58..15e66c70a4b1f1c79d4ea3197453955d1cd8c866 100644 (file)
@@ -197,12 +197,11 @@ The module :mod:`socket` exports the following constants and functions:
 
 .. function:: create_connection(address[, timeout])
 
-   Connects to the *address* received (as usual, a ``(host, port)`` pair), with an
-   optional timeout for the connection.  Especially useful for higher-level
-   protocols, it is not normally used directly from application-level code.
-   Passing the optional *timeout* parameter will set the timeout on the socket
-   instance (if it is not given or ``None``, the global default timeout setting is
-   used).
+   Convenience function.  Connect to *address* (a 2-tuple ``(host, port)``),
+   and return the socket object.  Passing the optional *timeout* parameter will
+   set the timeout on the socket instance before attempting to connect.  If no
+   *timeout* is supplied, the global default timeout setting returned by
+   :func:`getdefaulttimeout` is used.
 
 
 .. function:: getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
index 8c8ddbb6ef2ee3a8830e50cb3afe6360bdeb863b..4fd88962cd0369a65d172227f735b552a1d461b0 100644 (file)
@@ -28,6 +28,11 @@ Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation Begin).
    :class:`Telnet` represents a connection to a Telnet server. The instance is
    initially not connected by default; the :meth:`open` method must be used to
    establish a connection.  Alternatively, the host name and optional port
+   and timeout can be passed to the constructor, in which case the connection to
+   the server will be established before the constructor returns.  The optional
+   *timeout* parameter specifies a timeout in seconds for the connection attempt (if
+   not specified, the global default timeout setting will be used).
+
    number can be passed to the constructor, to, in which case the connection to
    the server will be established before the constructor returns. The optional
    *timeout* parameter specifies a timeout in seconds for blocking operations
@@ -123,8 +128,7 @@ Telnet Objects
    Connect to a host. The optional second argument is the port number, which
    defaults to the standard Telnet port (23). The optional *timeout* parameter
    specifies a timeout in seconds for blocking operations like the connection
-   attempt (if not specified, or passed as None, the global default timeout
-   setting will be used).
+   attempt (if not specified, the global default timeout setting will be used).
 
    Do not try to reopen an already connected instance.
 
index 0462222e86fa1cd2d14eddaa5a5fa1bb61b6a48e..06dbb445a397149522aac24945ee4b97bb419708 100644 (file)
@@ -27,9 +27,9 @@ The :mod:`urllib2` module defines the following functions:
    returns a string in this format.
 
    The optional *timeout* parameter specifies a timeout in seconds for blocking
-   operations like the connection attempt (if not specified, or passed as
-   ``None``, the global default timeout setting will be used).  This actually
-   only works for HTTP, HTTPS, FTP and FTPS connections.
+   operations like the connection attempt (if not specified, the global default
+   timeout setting will be used).  This actually only works for HTTP, HTTPS,
+   FTP and FTPS connections.
 
    This function returns a file-like object with two additional methods:
 
@@ -404,9 +404,9 @@ OpenerDirector Objects
    the same as those of :func:`urlopen` (which simply calls the :meth:`open`
    method on the currently installed global :class:`OpenerDirector`).  The
    optional *timeout* parameter specifies a timeout in seconds for blocking
-   operations like the connection attempt (if not specified, or passed as
-   ``None``, the global default timeout setting will be used; this actually only
-   works for HTTP, HTTPS, FTP and FTPS connections).
+   operations like the connection attempt (if not specified, the global default
+   timeout setting will be usedi). The timeout feature actually works only for
+   HTTP, HTTPS, FTP and FTPS connections).
 
 
 .. method:: OpenerDirector.error(proto[, arg[, ...]])
index 0727d1073b28916505b59bb11854e1951db0d8fe..0095cc46496d65f8ba1ee9c7fe138ef832496707 100644 (file)
@@ -431,6 +431,13 @@ extern int gethostname(char *, int);
 extern char * _getpty(int *, int, mode_t, int);
 #endif
 
+/* On QNX 6, struct termio must be declared by including sys/termio.h
+   if TCGETA, TCSETA, TCSETAW, or TCSETAF are used.  sys/termio.h must
+   be included before termios.h or it will generate an error. */
+#ifdef HAVE_SYS_TERMIO_H
+#include <sys/termio.h>
+#endif
+
 #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
 #if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
 /* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
index eec20f581dab9d9fefe1665aa000a0b3f8c89e0c..49557271477883b80408a95cea5d934954403cbb 100644 (file)
@@ -44,6 +44,7 @@ try:
     from socket import getfqdn; socket.getfqdn = getfqdn; del getfqdn
 except ImportError:
     import socket
+from socket import _GLOBAL_DEFAULT_TIMEOUT
 
 __all__ = ["FTP","Netrc"]
 
@@ -71,7 +72,6 @@ all_errors = (Error, IOError, EOFError)
 # Line terminators (we always output CRLF, but accept any of CRLF, CR, LF)
 CRLF = '\r\n'
 
-
 # The class itself
 class FTP:
 
@@ -110,14 +110,15 @@ class FTP:
     # Initialize host to localhost, port to standard ftp port
     # Optional arguments are host (for connect()),
     # and user, passwd, acct (for login())
-    def __init__(self, host='', user='', passwd='', acct='', timeout=None):
+    def __init__(self, host='', user='', passwd='', acct='',
+                 timeout=_GLOBAL_DEFAULT_TIMEOUT):
         self.timeout = timeout
         if host:
             self.connect(host)
             if user:
                 self.login(user, passwd, acct)
 
-    def connect(self, host='', port=0, timeout=None):
+    def connect(self, host='', port=0, timeout=-999):
         '''Connect to host.  Arguments are:
          - host: hostname to connect to (string, default previous host)
          - port: port to connect to (integer, default previous port)
@@ -126,7 +127,7 @@ class FTP:
             self.host = host
         if port > 0:
             self.port = port
-        if timeout is not None:
+        if timeout != -999:
             self.timeout = timeout
         self.sock = socket.create_connection((self.host, self.port), self.timeout)
         self.af = self.sock.family
index 71a12e7bf4424f7befa1e960499edd5c60c2c4d3..380fe1268bf834189a49aeb675d06ff4ed835401 100644 (file)
@@ -167,7 +167,7 @@ def heapreplace(heap, item):
 
 def heappushpop(heap, item):
     """Fast version of a heappush followed by a heappop."""
-    if heap and item > heap[0]:
+    if heap and heap[0] < item:
         item, heap[0] = heap[0], item
         _siftup(heap, 0)
     return item
@@ -240,10 +240,11 @@ def _siftdown(heap, startpos, pos):
     while pos > startpos:
         parentpos = (pos - 1) >> 1
         parent = heap[parentpos]
-        if parent <= newitem:
-            break
-        heap[pos] = parent
-        pos = parentpos
+        if newitem < parent:
+            heap[pos] = parent
+            pos = parentpos
+            continue
+        break
     heap[pos] = newitem
 
 # The child indices of heap index pos are already heaps, and we want to make
@@ -294,7 +295,7 @@ def _siftup(heap, pos):
     while childpos < endpos:
         # Set childpos to index of smaller child.
         rightpos = childpos + 1
-        if rightpos < endpos and heap[rightpos] <= heap[childpos]:
+        if rightpos < endpos and not heap[childpos] < heap[rightpos]:
             childpos = rightpos
         # Move the smaller child up.
         heap[pos] = heap[childpos]
index de27c17b4cff261b3f914b75ac64d167d477798e..c6e40e1cbb8d1458bb3242af795aa7b42582c3ea 100644 (file)
@@ -664,7 +664,8 @@ class HTTPConnection:
     debuglevel = 0
     strict = 0
 
-    def __init__(self, host, port=None, strict=None, timeout=None):
+    def __init__(self, host, port=None, strict=None,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         self.timeout = timeout
         self.sock = None
         self._buffer = []
@@ -996,7 +997,7 @@ else:
         default_port = HTTPS_PORT
 
         def __init__(self, host, port=None, key_file=None, cert_file=None,
-                     strict=None, timeout=None):
+                     strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
             HTTPConnection.__init__(self, host, port, strict, timeout)
             self.key_file = key_file
             self.cert_file = cert_file
index aa4600c4a8d4030769735c96c6064ca8edc13f4f..bd82841ef19ec297654688efc28112bddc3c043b 100644 (file)
@@ -76,7 +76,8 @@ class POP3:
     """
 
 
-    def __init__(self, host, port=POP3_PORT, timeout=None):
+    def __init__(self, host, port=POP3_PORT,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         self.host = host
         self.port = port
         self.sock = socket.create_connection((host, port), timeout)
index a3cc65d2951896ba0e368d69a3690ae4d8dd2a8e..e67f0d652077a11f5be7b06807754c37f6ced49b 100755 (executable)
@@ -220,7 +220,8 @@ class SMTP:
     ehlo_resp = None
     does_esmtp = 0
 
-    def __init__(self, host='', port=0, local_hostname=None, timeout=None):
+    def __init__(self, host='', port=0, local_hostname=None,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         """Initialize a new instance.
 
         If specified, `host' is the name of the remote host to which to
@@ -744,7 +745,8 @@ if _have_ssl:
         certificate chain file for the SSL connection.
         """
         def __init__(self, host='', port=0, local_hostname=None,
-                     keyfile=None, certfile=None, timeout=None):
+                     keyfile=None, certfile=None,
+                     timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
             self.keyfile = keyfile
             self.certfile = certfile
             SMTP.__init__(self, host, port, local_hostname, timeout)
index eb876731e351cd0b73226a1a521c8410b57e8686..fcbc545d5aca22a1678c12d6b1e8d0f3675df82f 100644 (file)
@@ -265,13 +265,17 @@ def getfqdn(name=''):
     return name
 
 
-def create_connection(address, timeout=None):
-    """Connect to address (host, port) with an optional timeout.
+_GLOBAL_DEFAULT_TIMEOUT = object()
 
-    Provides access to socketobject timeout for higher-level
-    protocols.  Passing a timeout will set the timeout on the
-    socket instance (if not present, or passed as None, the
-    default global timeout setting will be used).
+def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT):
+    """Connect to *address* and return the socket object.
+
+    Convenience function.  Connect to *address* (a 2-tuple ``(host,
+    port)``) and return the socket object.  Passing the optional
+    *timeout* parameter will set the timeout on the socket instance
+    before attempting to connect.  If no *timeout* is supplied, the
+    global default timeout setting returned by :func:`getdefaulttimeout`
+    is used.
     """
 
     msg = "getaddrinfo returns an empty list"
@@ -281,7 +285,7 @@ def create_connection(address, timeout=None):
         sock = None
         try:
             sock = socket(af, socktype, proto)
-            if timeout is not None:
+            if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
                 sock.settimeout(timeout)
             sock.connect(sa)
             return sock
index 8327aa195bfa2cc2f3fd921eee8581094065def0..d276a336c9c233d151ce07b11e6ee5c4642e92a8 100644 (file)
@@ -292,6 +292,15 @@ class CursorTests(unittest.TestCase):
         self.cu.execute("update test set name='bar'")
         self.failUnlessEqual(self.cu.rowcount, 2)
 
+    def CheckRowcountSelect(self):
+        """
+        pysqlite does not know the rowcount of SELECT statements, because we
+        don't fetch all rows after executing the select statement. The rowcount
+        has thus to be -1.
+        """
+        self.cu.execute("select 5 union select 6")
+        self.failUnlessEqual(self.cu.rowcount, -1)
+
     def CheckRowcountExecutemany(self):
         self.cu.execute("delete from test")
         self.cu.executemany("insert into test(name) values (?)", [(1,), (2,), (3,)])
index 33029e10471176e5350a177ee5d3b8345856be19..56c5d702b6489617190a9ce95513d7c966a5a55a 100644 (file)
@@ -184,13 +184,13 @@ class Telnet:
 
     """
 
-    def __init__(self, host=None, port=0, timeout=None):
+    def __init__(self, host=None, port=0,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         """Constructor.
 
         When called without arguments, create an unconnected instance.
-        With a hostname argument, it connects the instance; a port
-        number is optional.
-
+        With a hostname argument, it connects the instance; port number
+        and timeout are optional.
         """
         self.debuglevel = DEBUGLEVEL
         self.host = host
@@ -208,23 +208,21 @@ class Telnet:
         if host is not None:
             self.open(host, port, timeout)
 
-    def open(self, host, port=0, timeout=None):
+    def open(self, host, port=0, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         """Connect to a host.
 
         The optional second argument is the port number, which
         defaults to the standard telnet port (23).
 
         Don't try to reopen an already connected instance.
-
         """
         self.eof = 0
         if not port:
             port = TELNET_PORT
         self.host = host
         self.port = port
-        if timeout is not None:
-            self.timeout = timeout
-        self.sock = socket.create_connection((host, port), self.timeout)
+        self.timeout = timeout
+        self.sock = socket.create_connection((host, port), timeout)
 
     def __del__(self):
         """Destructor -- close the connection."""
index 2048fa0a426cbaaa69def9e87ebc3c7f4d703cc0..4b8ae82df77fcd101872453862ff90a5ab522504 100644 (file)
@@ -845,9 +845,13 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
         self.assertRaises(TypeError, t.strftime, "one", "two") # too many args
         self.assertRaises(TypeError, t.strftime, 42) # arg wrong type
 
+        # test that unicode input is allowed (issue 2782)
+        self.assertEqual(t.strftime("%m"), "03")
+
         # A naive object replaces %z and %Z w/ empty strings.
         self.assertEqual(t.strftime("'%z' '%Z'"), "'' ''")
 
+
     def test_format(self):
         dt = self.theclass(2007, 9, 10)
         self.assertEqual(dt.__format__(''), str(dt))
index b91588a3102e50012b0ab98c5451d7a45ca2cbe6..35e4746a8c56b73a76689f5512baaeacb5fea0e9 100644 (file)
@@ -54,35 +54,52 @@ class GeneralTests(TestCase):
         # connects
         ftp = ftplib.FTP(HOST)
         self.evt.wait()
-        ftp.sock.close()
+        ftp.close()
 
     def testTimeoutDefault(self):
-        # default
-        ftp = ftplib.FTP(HOST)
+        # default -- use global socket timeout
+        self.assert_(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            ftp = ftplib.FTP("localhost")
+        finally:
+            socket.setdefaulttimeout(None)
+        self.assertEqual(ftp.sock.gettimeout(), 30)
+        self.evt.wait()
+        ftp.close()
+
+    def testTimeoutNone(self):
+        # no timeout -- do not use global socket timeout
+        self.assert_(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            ftp = ftplib.FTP("localhost", timeout=None)
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertTrue(ftp.sock.gettimeout() is None)
         self.evt.wait()
-        ftp.sock.close()
+        ftp.close()
 
     def testTimeoutValue(self):
         # a value
         ftp = ftplib.FTP(HOST, timeout=30)
         self.assertEqual(ftp.sock.gettimeout(), 30)
         self.evt.wait()
-        ftp.sock.close()
+        ftp.close()
 
     def testTimeoutConnect(self):
         ftp = ftplib.FTP()
         ftp.connect(HOST, timeout=30)
         self.assertEqual(ftp.sock.gettimeout(), 30)
         self.evt.wait()
-        ftp.sock.close()
+        ftp.close()
 
     def testTimeoutDifferentOrder(self):
         ftp = ftplib.FTP(timeout=30)
         ftp.connect(HOST)
         self.assertEqual(ftp.sock.gettimeout(), 30)
         self.evt.wait()
-        ftp.sock.close()
+        ftp.close()
 
     def testTimeoutDirectAccess(self):
         ftp = ftplib.FTP()
@@ -90,18 +107,6 @@ class GeneralTests(TestCase):
         ftp.connect(HOST)
         self.assertEqual(ftp.sock.gettimeout(), 30)
         self.evt.wait()
-        ftp.sock.close()
-
-    def testTimeoutNone(self):
-        # None, having other default
-        previous = socket.getdefaulttimeout()
-        socket.setdefaulttimeout(30)
-        try:
-            ftp = ftplib.FTP(HOST, timeout=None)
-        finally:
-            socket.setdefaulttimeout(previous)
-        self.assertEqual(ftp.sock.gettimeout(), 30)
-        self.evt.wait()
         ftp.close()
 
 
index ff4cf9bd7194b5edd0809ddb187c47ed0a714e15..054825a5a330d23276ab373ae530edbc1e2f5563 100644 (file)
@@ -215,27 +215,32 @@ class TimeoutTest(TestCase):
         # This will prove that the timeout gets through HTTPConnection
         # and into the socket.
 
-        # default
-        httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT)
-        httpConn.connect()
-        self.assertTrue(httpConn.sock.gettimeout() is None)
-        httpConn.close()
-
-        # a value
-        httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
-        httpConn.connect()
+        # default -- use global socket timeout
+        self.assert_(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT)
+            httpConn.connect()
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertEqual(httpConn.sock.gettimeout(), 30)
         httpConn.close()
 
-        # None, having other default
-        previous = socket.getdefaulttimeout()
+        # no timeout -- do not use global socket default
+        self.assert_(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(30)
         try:
             httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT,
                                               timeout=None)
             httpConn.connect()
         finally:
-            socket.setdefaulttimeout(previous)
+            socket.setdefaulttimeout(None)
+        self.assertEqual(httpConn.sock.gettimeout(), None)
+        httpConn.close()
+
+        # a value
+        httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
+        httpConn.connect()
         self.assertEqual(httpConn.sock.gettimeout(), 30)
         httpConn.close()
 
index ae29cda667f4c084a7de7ea0225a2215d5ac014c..f4c27bb38959a766639bcc5f2b89eb082742a282 100644 (file)
@@ -736,7 +736,7 @@ class MathTests(unittest.TestCase):
              OverflowError),
             ([2.**1023, 2.**1023, -1e307], OverflowError),
             ([1e16, 1., 1e-16], 10000000000000002.0),
-            ([1e16-2., 1.-2.**53, -(1e16-2.), -(1.-2.**53)], 0.0),
+            ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0),
         ]
 
         for i, (vals, s) in enumerate(test_values):
index 14b46e31626d1e4845433587e66a2a6aedcd59a7..f9c52f911fd05cfe012fb947e599e8865ace1edb 100644 (file)
@@ -40,28 +40,29 @@ class GeneralTests(TestCase):
         pop.sock.close()
 
     def testTimeoutDefault(self):
-        # default
-        pop = poplib.POP3(HOST, self.port)
-        self.assertTrue(pop.sock.gettimeout() is None)
-        pop.sock.close()
-
-    def testTimeoutValue(self):
-        # a value
-        pop = poplib.POP3(HOST, self.port, timeout=30)
+        self.assertTrue(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            pop = poplib.POP3("localhost", self.port)
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertEqual(pop.sock.gettimeout(), 30)
         pop.sock.close()
 
     def testTimeoutNone(self):
-        # None, having other default
-        previous = socket.getdefaulttimeout()
+        self.assertTrue(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(30)
         try:
             pop = poplib.POP3(HOST, self.port, timeout=None)
         finally:
-            socket.setdefaulttimeout(previous)
-        self.assertEqual(pop.sock.gettimeout(), 30)
+            socket.setdefaulttimeout(None)
+        self.assertTrue(pop.sock.gettimeout() is None)
         pop.sock.close()
 
+    def testTimeoutValue(self):
+        pop = poplib.POP3("localhost", self.port, timeout=30)
+        self.assertEqual(pop.sock.gettimeout(), 30)
+        pop.sock.close()
 
 
 def test_main(verbose=None):
index 3d38d89d2702f42b4e08f0909b96fa94c049a1ae..81302520e6b0ef469bc9da6aab7454eed1e7fa42 100644 (file)
@@ -54,41 +54,43 @@ class GeneralTests(TestCase):
     def testBasic1(self):
         # connects
         smtp = smtplib.SMTP(HOST, self.port)
-        smtp.sock.close()
+        smtp.close()
 
     def testBasic2(self):
         # connects, include port in host name
         smtp = smtplib.SMTP("%s:%s" % (HOST, self.port))
-        smtp.sock.close()
+        smtp.close()
 
     def testLocalHostName(self):
         # check that supplied local_hostname is used
         smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost")
         self.assertEqual(smtp.local_hostname, "testhost")
-        smtp.sock.close()
+        smtp.close()
 
     def testTimeoutDefault(self):
-        # default
-        smtp = smtplib.SMTP(HOST, self.port)
-        self.assertTrue(smtp.sock.gettimeout() is None)
-        smtp.sock.close()
-
-    def testTimeoutValue(self):
-        # a value
-        smtp = smtplib.SMTP(HOST, self.port, timeout=30)
+        self.assertTrue(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            smtp = smtplib.SMTP(HOST, self.port)
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertEqual(smtp.sock.gettimeout(), 30)
-        smtp.sock.close()
+        smtp.close()
 
     def testTimeoutNone(self):
-        # None, having other default
-        previous = socket.getdefaulttimeout()
+        self.assertTrue(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(30)
         try:
             smtp = smtplib.SMTP(HOST, self.port, timeout=None)
         finally:
-            socket.setdefaulttimeout(previous)
+            socket.setdefaulttimeout(None)
+        self.assertTrue(smtp.sock.gettimeout() is None)
+        smtp.close()
+
+    def testTimeoutValue(self):
+        smtp = smtplib.SMTP(HOST, self.port, timeout=30)
         self.assertEqual(smtp.sock.gettimeout(), 30)
-        smtp.sock.close()
+        smtp.close()
 
 
 # Test server thread using the specified SMTP server class
index d6645822e5f1f664dd6a726fe85e0b30fc7cda8c..e62788ee279a0870a7ec1e075678b226cb4bbf40 100644 (file)
@@ -929,8 +929,25 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
 
     testTimeoutDefault = _justAccept
     def _testTimeoutDefault(self):
-        self.cli = socket.create_connection((HOST, self.port))
-        self.assertTrue(self.cli.gettimeout() is None)
+        # passing no explicit timeout uses socket's global default
+        self.assert_(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(42)
+        try:
+            self.cli = socket.create_connection((HOST, self.port))
+        finally:
+            socket.setdefaulttimeout(None)
+        self.assertEquals(self.cli.gettimeout(), 42)
+
+    testTimeoutNone = _justAccept
+    def _testTimeoutNone(self):
+        # None timeout means the same as sock.settimeout(None)
+        self.assert_(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            self.cli = socket.create_connection((HOST, self.port), timeout=None)
+        finally:
+            socket.setdefaulttimeout(None)
+        self.assertEqual(self.cli.gettimeout(), None)
 
     testTimeoutValueNamed = _justAccept
     def _testTimeoutValueNamed(self):
@@ -942,17 +959,6 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
         self.cli = socket.create_connection((HOST, self.port), 30)
         self.assertEqual(self.cli.gettimeout(), 30)
 
-    testTimeoutNone = _justAccept
-    def _testTimeoutNone(self):
-        previous = socket.getdefaulttimeout()
-        socket.setdefaulttimeout(30)
-        try:
-            self.cli = socket.create_connection((HOST, self.port), timeout=None)
-        finally:
-            socket.setdefaulttimeout(previous)
-        self.assertEqual(self.cli.gettimeout(), 30)
-
-
 class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
 
     def __init__(self, methodName='runTest'):
index c24d41d02d794d9114c5746ea6f7371c8689b01c..4ae6222f6ce7759ed2e4cb475b37967de68e1d3f 100644 (file)
@@ -40,34 +40,36 @@ class GeneralTests(TestCase):
         telnet.sock.close()
 
     def testTimeoutDefault(self):
-        # default
-        telnet = telnetlib.Telnet(HOST, self.port)
-        self.assertTrue(telnet.sock.gettimeout() is None)
-        telnet.sock.close()
-
-    def testTimeoutValue(self):
-        # a value
-        telnet = telnetlib.Telnet(HOST, self.port, timeout=30)
-        self.assertEqual(telnet.sock.gettimeout(), 30)
-        telnet.sock.close()
-
-    def testTimeoutDifferentOrder(self):
-        telnet = telnetlib.Telnet(timeout=30)
-        telnet.open(HOST, self.port)
+        self.assertTrue(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(30)
+        try:
+            telnet = telnetlib.Telnet("localhost", self.port)
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertEqual(telnet.sock.gettimeout(), 30)
         telnet.sock.close()
 
     def testTimeoutNone(self):
         # None, having other default
-        previous = socket.getdefaulttimeout()
+        self.assertTrue(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(30)
         try:
             telnet = telnetlib.Telnet(HOST, self.port, timeout=None)
         finally:
-            socket.setdefaulttimeout(previous)
+            socket.setdefaulttimeout(None)
+        self.assertTrue(telnet.sock.gettimeout() is None)
+        telnet.sock.close()
+
+    def testTimeoutValue(self):
+        telnet = telnetlib.Telnet("localhost", self.port, timeout=30)
         self.assertEqual(telnet.sock.gettimeout(), 30)
         telnet.sock.close()
 
+    def testTimeoutOpen(self):
+        telnet = telnetlib.Telnet()
+        telnet.open("localhost", self.port, timeout=30)
+        self.assertEqual(telnet.sock.gettimeout(), 30)
+        telnet.sock.close()
 
 
 def test_main(verbose=None):
index b14510fce211c53cd58cebb05ab80eb116e3a28c..26b51cb77ccc44cf419da7bff568832671c0cec3 100644 (file)
@@ -568,6 +568,7 @@ class Pathname_Tests(unittest.TestCase):
 # .   Facundo
 #
 # def server(evt):
+#     import socket, time
 #     serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 #     serv.settimeout(3)
 #     serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@@ -592,6 +593,7 @@ class Pathname_Tests(unittest.TestCase):
 # class FTPWrapperTests(unittest.TestCase):
 #
 #     def setUp(self):
+#         import ftplib, time, threading
 #         ftplib.FTP.port = 9093
 #         self.evt = threading.Event()
 #         threading.Thread(target=server, args=(self.evt,)).start()
@@ -603,31 +605,37 @@ class Pathname_Tests(unittest.TestCase):
 #     def testBasic(self):
 #         # connects
 #         ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
-#         ftp.ftp.sock.close()
+#         ftp.close()
 #
-#     def testTimeoutDefault(self):
-#         # default
-#         ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
-#         self.assertTrue(ftp.ftp.sock.gettimeout() is None)
-#         ftp.ftp.sock.close()
-#
-#     def testTimeoutValue(self):
-#         # a value
-#         ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [], timeout=30)
+#     def testTimeoutNone(self):
+#         # global default timeout is ignored
+#         import socket
+#         self.assert_(socket.getdefaulttimeout() is None)
+#         socket.setdefaulttimeout(30)
+#         try:
+#             ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
+#         finally:
+#             socket.setdefaulttimeout(None)
 #         self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
-#         ftp.ftp.sock.close()
+#         ftp.close()
 #
-#     def testTimeoutNone(self):
-#         # None, having other default
-#         previous = socket.getdefaulttimeout()
+#     def testTimeoutDefault(self):
+#         # global default timeout is used
+#         import socket
+#         self.assert_(socket.getdefaulttimeout() is None)
 #         socket.setdefaulttimeout(30)
 #         try:
 #             ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
 #         finally:
-#             socket.setdefaulttimeout(previous)
+#             socket.setdefaulttimeout(None)
 #         self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
-#         ftp.ftp.close()
+#         ftp.close()
 #
+#     def testTimeoutValue(self):
+#         ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [],
+#                                 timeout=30)
+#         self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
+#         ftp.close()
 
 
 
index 33868002fc25ffa243a1fe49bda38b21b494f666..c2d594b400316b7678363404b8fbbbdedd8dd968 100644 (file)
@@ -3,6 +3,7 @@ from test import support
 
 import os
 import io
+import socket
 
 import urllib2
 from urllib2 import Request, OpenerDirector
@@ -546,14 +547,15 @@ class HandlerTests(unittest.TestCase):
 
         class NullFTPHandler(urllib2.FTPHandler):
             def __init__(self, data): self.data = data
-            def connect_ftp(self, user, passwd, host, port, dirs, timeout=None):
+            def connect_ftp(self, user, passwd, host, port, dirs,
+                            timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
                 self.user, self.passwd = user, passwd
                 self.host, self.port = host, port
                 self.dirs = dirs
                 self.ftpwrapper = MockFTPWrapper(self.data)
                 return self.ftpwrapper
 
-        import ftplib, socket
+        import ftplib
         data = "rheum rhaponicum"
         h = NullFTPHandler(data)
         o = h.parent = MockOpener()
@@ -686,7 +688,7 @@ class HandlerTests(unittest.TestCase):
                 self.req_headers = []
                 self.data = None
                 self.raise_on_endheaders = False
-            def __call__(self, host, timeout=None):
+            def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
                 self.host = host
                 self.timeout = timeout
                 return self
index 990d3da536325bafed3012a2437c01a18f5f1664..752406c446b0e7703f91fcae7764df497bb49290 100644 (file)
@@ -188,46 +188,58 @@ class OtherNetworkTests(unittest.TestCase):
 
 class TimeoutTest(unittest.TestCase):
     def test_http_basic(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
         u = _urlopen_with_retry("http://www.python.org")
         self.assertTrue(u.fp.raw.fp._sock.gettimeout() is None)
 
-    def test_http_NoneWithdefault(self):
-        prev = socket.getdefaulttimeout()
+    def test_http_default_timeout(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(60)
+        try:
+            u = _urlopen_with_retry("http://www.python.org")
+        finally:
+            socket.setdefaulttimeout(None)
+        self.assertEqual(u.fp.raw.fp._sock.gettimeout(), 60)
+
+    def test_http_no_timeout(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(60)
         try:
             u = _urlopen_with_retry("http://www.python.org", timeout=None)
-            self.assertTrue(u.fp.raw.fp._sock.gettimeout(), 60)
         finally:
-            socket.setdefaulttimeout(prev)
+            socket.setdefaulttimeout(None)
+        self.assertTrue(u.fp.raw.fp._sock.gettimeout() is None)
 
-    def test_http_Value(self):
+    def test_http_timeout(self):
         u = _urlopen_with_retry("http://www.python.org", timeout=120)
         self.assertEqual(u.fp.raw.fp._sock.gettimeout(), 120)
 
-    def test_http_NoneNodefault(self):
-        u = _urlopen_with_retry("http://www.python.org", timeout=None)
-        self.assertTrue(u.fp.raw.fp._sock.gettimeout() is None)
-
     FTP_HOST = "ftp://ftp.mirror.nl/pub/mirror/gnu/"
 
     def test_ftp_basic(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
         u = _urlopen_with_retry(self.FTP_HOST)
         self.assertTrue(u.fp.fp.raw._sock.gettimeout() is None)
 
-    def test_ftp_NoneWithdefault(self):
-        prev = socket.getdefaulttimeout()
+    def test_ftp_default_timeout(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
         socket.setdefaulttimeout(60)
         try:
-            u = _urlopen_with_retry(self.FTP_HOST, timeout=None)
-            self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
+            u = _urlopen_with_retry(self.FTP_HOST)
         finally:
-            socket.setdefaulttimeout(prev)
+            socket.setdefaulttimeout(None)
+        self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
 
-    def test_ftp_NoneNodefault(self):
-        u = _urlopen_with_retry(self.FTP_HOST, timeout=None)
+    def test_ftp_no_timeout(self):
+        self.assertTrue(socket.getdefaulttimeout() is None)
+        socket.setdefaulttimeout(60)
+        try:
+            u = _urlopen_with_retry(self.FTP_HOST, timeout=None)
+        finally:
+            socket.setdefaulttimeout(None)
         self.assertTrue(u.fp.fp.raw._sock.gettimeout() is None)
 
-    def test_ftp_Value(self):
+    def test_ftp_timeout(self):
         u = _urlopen_with_retry(self.FTP_HOST, timeout=60)
         self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
 
index 2005baf1940226b26a2243449eec79ea60f648b2..fb936049025d632b11be0859dc9a955083bbb923 100644 (file)
@@ -776,7 +776,8 @@ def noheaders():
 class ftpwrapper:
     """Class used by open_ftp() for cache of open FTP connections."""
 
-    def __init__(self, user, passwd, host, port, dirs, timeout=None):
+    def __init__(self, user, passwd, host, port, dirs,
+                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         self.user = user
         self.passwd = passwd
         self.host = host
index 948c6c3c35ad07c01c416a87188ce9c56a66b50f..244d737819e29acfd1658e83914b14e6c7018468 100644 (file)
@@ -115,7 +115,7 @@ from urllib import localhost, url2pathname, getproxies
 __version__ = sys.version[:3]
 
 _opener = None
-def urlopen(url, data=None, timeout=None):
+def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
     global _opener
     if _opener is None:
         _opener = build_opener()
@@ -357,7 +357,7 @@ class OpenerDirector:
             if result is not None:
                 return result
 
-    def open(self, fullurl, data=None, timeout=None):
+    def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
         # accept a URL or a Request object
         if isinstance(fullurl, str):
             req = Request(fullurl, data)
index ee8f63650e16353d9fb16c12d55937e9e7081b3d..aaa79141902ced72d4338d9fe7f7b68be5719c98 100755 (executable)
@@ -20406,6 +20406,9 @@ case "$host" in
   i?86-*-solaris2.1[0-9]*)
        TARGET=X86_64; TARGETDIR=x86
        ;;
+  i*86-*-nto-qnx*)
+        TARGET=X86; TARGETDIR=x86
+        ;;
   i?86-*-*)
        TARGET=X86; TARGETDIR=x86
        ;;
index 0a85146b1adf35cdf2127410ac013bbdc5701ece..57c161befe16b6ae065ebc4e2693f7f6f8400b4c 100644 (file)
@@ -86,6 +86,9 @@ case "$host" in
   i?86-*-solaris2.1[[0-9]]*)
        TARGET=X86_64; TARGETDIR=x86
        ;;
+  i*86-*-nto-qnx*) 
+        TARGET=X86; TARGETDIR=x86
+        ;;
   i?86-*-*)
        TARGET=X86; TARGETDIR=x86
        ;;
index 29e9f4c4b2898efb6a85729411e0d705fdb9b039..b7d58c00bd7fb5f8aee2f3948331027f0ad31d53 100644 (file)
@@ -44,7 +44,11 @@ static void more_core(void)
        }
 #else
        if (!_pagesize) {
+#ifdef _SC_PAGESIZE
+               _pagesize = sysconf(_SC_PAGESIZE);
+#else
                _pagesize = getpagesize();
+#endif
        }
 #endif
 
index 97ccd86e4d9eadbffa8d688c751fc8e09c03a07f..a5a56053d6f592be7e88b6ef9871d7ebfe1266fd 100644 (file)
@@ -8,6 +8,25 @@ annotated by Fran
 
 #include "Python.h"
 
+/* Older implementations of heapq used Py_LE for comparisons.  Now, it uses
+   Py_LT so it will match min(), sorted(), and bisect().  Unfortunately, some
+   client code (Twisted for example) relied on Py_LE, so this little function
+   restores compatability by trying both.
+*/
+static int
+cmp_lt(PyObject *x, PyObject *y)
+{
+       int cmp;
+       cmp = PyObject_RichCompareBool(x, y, Py_LT);
+       if (cmp == -1 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
+               PyErr_Clear();
+               cmp = PyObject_RichCompareBool(y, x, Py_LE);
+               if (cmp != -1)
+                       cmp = 1 - cmp;
+       }
+       return cmp;
+}
+
 static int
 _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
 {
@@ -28,12 +47,12 @@ _siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
        while (pos > startpos){
                parentpos = (pos - 1) >> 1;
                parent = PyList_GET_ITEM(heap, parentpos);
-               cmp = PyObject_RichCompareBool(parent, newitem, Py_LE);
+               cmp = cmp_lt(newitem, parent);
                if (cmp == -1) {
                        Py_DECREF(newitem);
                        return -1;
                }
-               if (cmp == 1)
+               if (cmp == 0)
                        break;
                Py_INCREF(parent);
                Py_DECREF(PyList_GET_ITEM(heap, pos));
@@ -68,15 +87,14 @@ _siftup(PyListObject *heap, Py_ssize_t pos)
                /* Set childpos to index of smaller child.   */
                rightpos = childpos + 1;
                if (rightpos < endpos) {
-                       cmp = PyObject_RichCompareBool(
-                               PyList_GET_ITEM(heap, rightpos),
+                       cmp = cmp_lt(
                                PyList_GET_ITEM(heap, childpos),
-                               Py_LE);
+                               PyList_GET_ITEM(heap, rightpos));
                        if (cmp == -1) {
                                Py_DECREF(newitem);
                                return -1;
                        }
-                       if (cmp == 1)
+                       if (cmp == 0)
                                childpos = rightpos;
                }
                /* Move the smaller child up. */
@@ -214,10 +232,10 @@ heappushpop(PyObject *self, PyObject *args)
                return item;
        }
 
-       cmp = PyObject_RichCompareBool(item, PyList_GET_ITEM(heap, 0), Py_LE);
+       cmp = cmp_lt(PyList_GET_ITEM(heap, 0), item);
        if (cmp == -1)
                return NULL;
-       if (cmp == 1) {
+       if (cmp == 0) {
                Py_INCREF(item);
                return item;
        }
@@ -270,6 +288,7 @@ nlargest(PyObject *self, PyObject *args)
 {
        PyObject *heap=NULL, *elem, *iterable, *sol, *it, *oldelem;
        Py_ssize_t i, n;
+       int cmp;
 
        if (!PyArg_ParseTuple(args, "nO:nlargest", &n, &iterable))
                return NULL;
@@ -312,7 +331,12 @@ nlargest(PyObject *self, PyObject *args)
                        else
                                goto sortit;
                }
-               if (PyObject_RichCompareBool(elem, sol, Py_LE)) {
+               cmp = cmp_lt(sol, elem);
+               if (cmp == -1) {
+                       Py_DECREF(elem);
+                       goto fail;
+               }
+               if (cmp == 0) {
                        Py_DECREF(elem);
                        continue;
                }
@@ -362,12 +386,12 @@ _siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
        while (pos > startpos){
                parentpos = (pos - 1) >> 1;
                parent = PyList_GET_ITEM(heap, parentpos);
-               cmp = PyObject_RichCompareBool(newitem, parent, Py_LE);
+               cmp = cmp_lt(parent, newitem);
                if (cmp == -1) {
                        Py_DECREF(newitem);
                        return -1;
                }
-               if (cmp == 1)
+               if (cmp == 0)
                        break;
                Py_INCREF(parent);
                Py_DECREF(PyList_GET_ITEM(heap, pos));
@@ -402,15 +426,14 @@ _siftupmax(PyListObject *heap, Py_ssize_t pos)
                /* Set childpos to index of smaller child.   */
                rightpos = childpos + 1;
                if (rightpos < endpos) {
-                       cmp = PyObject_RichCompareBool(
-                               PyList_GET_ITEM(heap, childpos),
+                       cmp = cmp_lt(
                                PyList_GET_ITEM(heap, rightpos),
-                               Py_LE);
+                               PyList_GET_ITEM(heap, childpos));
                        if (cmp == -1) {
                                Py_DECREF(newitem);
                                return -1;
                        }
-                       if (cmp == 1)
+                       if (cmp == 0)
                                childpos = rightpos;
                }
                /* Move the smaller child up. */
@@ -434,6 +457,7 @@ nsmallest(PyObject *self, PyObject *args)
 {
        PyObject *heap=NULL, *elem, *iterable, *los, *it, *oldelem;
        Py_ssize_t i, n;
+       int cmp;
 
        if (!PyArg_ParseTuple(args, "nO:nsmallest", &n, &iterable))
                return NULL;
@@ -477,7 +501,12 @@ nsmallest(PyObject *self, PyObject *args)
                        else
                                goto sortit;
                }
-               if (PyObject_RichCompareBool(los, elem, Py_LE)) {
+               cmp = cmp_lt(elem, los);
+               if (cmp == -1) {
+                       Py_DECREF(elem);
+                       goto fail;
+               }
+               if (cmp == 0) {
                        Py_DECREF(elem);
                        continue;
                }
index 243b0b66cc5c992f53320b2a981a7d64198434d1..29d3ff4ee273dc1cf8c24f2a73acd91352c627a3 100644 (file)
@@ -101,10 +101,7 @@ int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs
 
     self->arraysize = 1;
 
-    self->rowcount = PyLong_FromLong(-1L);
-    if (!self->rowcount) {
-        return -1;
-    }
+    self->rowcount = -1L;
 
     Py_INCREF(Py_None);
     self->row_factory = Py_None;
@@ -130,7 +127,6 @@ void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
     Py_XDECREF(self->row_cast_map);
     Py_XDECREF(self->description);
     Py_XDECREF(self->lastrowid);
-    Py_XDECREF(self->rowcount);
     Py_XDECREF(self->row_factory);
     Py_XDECREF(self->next_row);
 
@@ -418,12 +414,12 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
     int statement_type;
     PyObject* descriptor;
     PyObject* second_argument = NULL;
-    long rowcount = 0;
     int allow_8bit_chars;
 
     if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
         return NULL;
     }
+
     /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */
     allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) &&
         (self->connection->text_factory != (PyObject*)&PyUnicode_Type && pysqlite_OptimizedUnicode));
@@ -498,10 +494,11 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
     if (operation == NULL)
         goto error;
 
-    /* reset description */
+    /* reset description and rowcount */
     Py_DECREF(self->description);
     Py_INCREF(Py_None);
     self->description = Py_None;
+    self->rowcount = -1L;
 
     func_args = PyTuple_New(1);
     if (!func_args) {
@@ -723,7 +720,10 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
             case STATEMENT_DELETE:
             case STATEMENT_INSERT:
             case STATEMENT_REPLACE:
-                rowcount += (long)sqlite3_changes(self->connection->db);
+                if (self->rowcount == -1L) {
+                    self->rowcount = 0L;
+                }
+                self->rowcount += (long)sqlite3_changes(self->connection->db);
         }
 
         Py_DECREF(self->lastrowid);
@@ -757,13 +757,9 @@ error:
     Py_XDECREF(parameters_list);
 
     if (PyErr_Occurred()) {
-        Py_DECREF(self->rowcount);
-        self->rowcount = PyLong_FromLong(-1L);
+        self->rowcount = -1L;
         return NULL;
     } else {
-        Py_DECREF(self->rowcount);
-        self->rowcount = PyLong_FromLong(rowcount);
-
         Py_INCREF(self);
         return (PyObject*)self;
     }
@@ -1053,7 +1049,7 @@ static struct PyMemberDef cursor_members[] =
     {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), READONLY},
     {"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0},
     {"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY},
-    {"rowcount", T_OBJECT, offsetof(pysqlite_Cursor, rowcount), READONLY},
+    {"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), READONLY},
     {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0},
     {NULL}
 };
index d916ca5fc6b44ee5b5ae9bff86655689e5aff419..54d816db91ba271d59946aac566d93bb384b0325 100644 (file)
@@ -37,7 +37,7 @@ typedef struct
     PyObject* row_cast_map;
     int arraysize;
     PyObject* lastrowid;
-    PyObject* rowcount;
+    long rowcount;
     PyObject* row_factory;
     pysqlite_Statement* statement;
 
index 0ad5b910629ef6ef12d6c32d0d5e4aa4451b3ec3..f37290c041c9993792ad972a686f045c0830e30f 100644 (file)
@@ -1201,17 +1201,17 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
        PyObject *Zreplacement = NULL;  /* py string, replacement for %Z */
        PyObject *freplacement = NULL;  /* py string, replacement for %f */
 
-       const char *pin;/* pointer to next char in input format */
-        Py_ssize_t flen;/* length of input format */
-       char ch;        /* next char in input format */
+       const char *pin;        /* pointer to next char in input format */
+       Py_ssize_t flen;        /* length of input format */
+       char ch;                /* next char in input format */
 
        PyObject *newfmt = NULL;        /* py string, the output format */
        char *pnew;     /* pointer to available byte in output format */
-       int totalnew;   /* number bytes total in output format buffer,
-                          exclusive of trailing \0 */
-       int usednew;    /* number bytes used so far in output format buffer */
+       size_t totalnew;        /* number bytes total in output format buffer,
+                                  exclusive of trailing \0 */
+       size_t usednew; /* number bytes used so far in output format buffer */
 
-       const char *ptoappend;/* pointer to string to append to output buffer */
+       const char *ptoappend;  /* ptr to string to append to output buffer */
        Py_ssize_t ntoappend;   /* # of bytes to append to output buffer */
 
        assert(object && format && timetuple);
@@ -1335,7 +1335,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                assert(ptoappend != NULL);
                assert(ntoappend > 0);
                while (usednew + ntoappend > totalnew) {
-                       int bigger = totalnew << 1;
+                       size_t bigger = totalnew << 1;
                        if ((bigger >> 1) != totalnew) { /* overflow */
                                PyErr_NoMemory();
                                goto Done;
@@ -2444,8 +2444,8 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
         * timetuple() method appropriate to self's class.
         */
        PyObject *result;
-       PyObject *format;
        PyObject *tuple;
+       PyObject *format;
        static char *keywords[] = {"format", NULL};
 
        if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
@@ -3211,8 +3211,8 @@ static PyObject *
 time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
 {
        PyObject *result;
-       PyObject *format;
        PyObject *tuple;
+       PyObject *format;
        static char *keywords[] = {"format", NULL};
 
        if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
@@ -3232,7 +3232,8 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
        if (tuple == NULL)
                return NULL;
        assert(PyTuple_Size(tuple) == 9);
-       result = wrap_strftime((PyObject *)self, format, tuple, Py_None);
+       result = wrap_strftime((PyObject *)self, format, tuple,
+                              Py_None);
        Py_DECREF(tuple);
        return result;
 }
index 5c5def23337cb80c2bd1d8671d549ca99b651688..16c829ac25ce5ce3e6085a47410deb2218e1e63b 100644 (file)
@@ -373,14 +373,20 @@ FUNC1(tanh, tanh, 0,
    value semantics across iterations (i.e. handling -Inf + Inf).
 
    Note 2:  No provision is made for intermediate overflow handling;
-   therefore, sum([1e+308, 1e-308, 1e+308]) returns result 1e+308 while
+   therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
    sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
    overflow of the first partial sum.
 
-   Note 3: Aggressively optimizing compilers can potentially eliminate the
-   residual values needed for accurate summation. For instance, the statements
-   "hi = x + y; lo = y - (hi - x);" could be mis-transformed to
-   "hi = x + y; lo = 0.0;" which defeats the computation of residuals.
+   Note 3: The itermediate values lo, yr, and hi are declared volatile so
+   aggressive compilers won't algebraicly reduce lo to always be exactly 0.0.
+   Also, the volatile declaration forces the values to be stored in memory as
+   regular doubles instead of extended long precision (80-bit) values.  This
+   prevents double rounding because any addition or substraction of two doubles
+   can be resolved exactly into double-sized hi and lo values.  As long as the 
+   hi value gets forced into a double before yr and lo are computed, the extra
+   bits in downstream extended precision operations (x87 for example) will be
+   exactly zero and therefore can be losslessly stored back into a double,
+   thereby preventing double rounding.
 
    Note 4: A similar implementation is in Modules/cmathmodule.c.
    Be sure to update both when making changes.
@@ -457,7 +463,8 @@ math_sum(PyObject *self, PyObject *seq)
 {
        PyObject *item, *iter, *sum = NULL;
        Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
-       double x, y, hi, lo=0.0, ps[NUM_PARTIALS], *p = ps;
+       double x, y, t, ps[NUM_PARTIALS], *p = ps;
+       volatile double hi, yr, lo;
 
        iter = PyObject_GetIter(seq);
        if (iter == NULL)
@@ -483,10 +490,12 @@ math_sum(PyObject *self, PyObject *seq)
 
                for (i = j = 0; j < n; j++) {       /* for y in partials */
                        y = p[j];
+                       if (fabs(x) < fabs(y)) {
+                                       t = x; x = y; y = t;
+                       }
                        hi = x + y;
-                       lo = fabs(x) < fabs(y)
-                          ? x - (hi - y)
-                          : y - (hi - x);
+                       yr = hi - x;
+                       lo = y - yr;
                        if (lo != 0.0)
                                p[i++] = lo;
                        x = hi;
@@ -506,38 +515,41 @@ math_sum(PyObject *self, PyObject *seq)
                }
        }
 
+       hi = 0.0;
        if (n > 0) {
                hi = p[--n];
                if (Py_IS_FINITE(hi)) {
                        /* sum_exact(ps, hi) from the top, stop when the sum becomes inexact. */
                        while (n > 0) {
-                               x = p[--n];
-                               y = hi;
+                               x = hi;
+                               y = p[--n];
+                               assert(fabs(y) < fabs(x));
                                hi = x + y;
-                               assert(fabs(x) < fabs(y));
-                               lo = x - (hi - y);
+                               yr = hi - x;
+                               lo = y - yr;
                                if (lo != 0.0)
                                        break;
                        }
-                       /* Little dance to allow half-even rounding across multiple partials.
-                           Needed so that sum([1e-16, 1, 1e16]) will round-up to two instead
-                           of down to zero (the 1e16 makes the 1 slightly closer to two). */
+                       /* Make half-even rounding work across multiple partials.  Needed 
+                          so that sum([1e-16, 1, 1e16]) will round-up the last digit to 
+                          two instead of down to zero (the 1e-16 makes the 1 slightly 
+                          closer to two).  With a potential 1 ULP rounding error fixed-up,
+                          math.sum() can guarantee commutativity. */
                        if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
                                      (lo > 0.0 && p[n-1] > 0.0))) {
                                y = lo * 2.0;
                                x = hi + y;
-                               if (y == (x - hi))
+                               yr = x - hi;
+                               if (y == yr)
                                        hi = x;
                        }
                }
-               else {  /* raise corresponding error */
+               else {  /* raise exception corresponding to a special value */
                        errno = Py_IS_NAN(hi) ? EDOM : ERANGE;
                        if (is_error(hi))
                                goto _sum_error;
                }
        }
-       else  /* default */
-               hi = 0.0;
        sum = PyFloat_FromDouble(hi);
 
 _sum_error:
index ccf579dcabd7db1f645d28815a7fb897340a9fa7..d1e5d86f708dd9b7881f967faa450baaccf21014 100644 (file)
                Name="PythonExe"
                Value="$(SolutionDir)\python.exe"
        />
+       <UserMacro
+               Name="externalsDir"
+               Value="..\.."
+       />
        <UserMacro
                Name="bsddbDir"
                Value="$(bsddb44Dir)"
@@ -54,7 +58,7 @@
        />
        <UserMacro
                Name="bsddb44Dir"
-               Value="..\..\db-4.4.20\build_win32"
+               Value="$(externalsDir)\db-4.4.20\build_win32"
        />
        <UserMacro
                Name="bsddb44DepLibs"
@@ -62,7 +66,7 @@
        />
        <UserMacro
                Name="bsddb45Dir"
-               Value="..\..\db-4.5.20.x\build_windows"
+               Value="$(externalsDir)\db-4.5.20.x\build_windows"
        />
        <UserMacro
                Name="bsddb45DepLibs"
        />
        <UserMacro
                Name="sqlite3Dir"
-               Value="..\..\sqlite-source-3.3.4"
+               Value="$(externalsDir)\sqlite-source-3.3.4"
        />
        <UserMacro
                Name="bz2Dir"
-               Value="..\..\bzip2-1.0.3"
+               Value="$(externalsDir)\bzip2-1.0.3"
        />
        <UserMacro
                Name="opensslDir"
-               Value="..\..\openssl-0.9.8g"
+               Value="$(externalsDir)\openssl-0.9.8g"
        />
        <UserMacro
                Name="tcltkDir"
-               Value="..\..\tcltk"
+               Value="$(externalsDir)\tcltk"
        />
        <UserMacro
                Name="tcltk64Dir"
-               Value="..\..\tcltk64"
+               Value="$(externalsDir)\tcltk64"
        />
        <UserMacro
                Name="tcltkLib"
index 4d3770d894359b14a78680051cf58c78bdfe8972..3173863c466f6aa16b3e1f682ee46de63f152c47 100644 (file)
@@ -54,18 +54,28 @@ int
 PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
 {
        int len;  /* # bytes written, excluding \0 */
-#ifndef HAVE_SNPRINTF
+#ifdef HAVE_SNPRINTF
+#define _PyOS_vsnprintf_EXTRA_SPACE 1
+#else
+#define _PyOS_vsnprintf_EXTRA_SPACE 512
        char *buffer;
 #endif
        assert(str != NULL);
        assert(size > 0);
        assert(format != NULL);
+       /* We take a size_t as input but return an int.  Sanity check
+        * our input so that it won't cause an overflow in the
+         * vsnprintf return value or the buffer malloc size.  */
+       if (size > INT_MAX - _PyOS_vsnprintf_EXTRA_SPACE) {
+               len = -666;
+               goto Done;
+       }
 
 #ifdef HAVE_SNPRINTF
        len = vsnprintf(str, size, format, va);
 #else
        /* Emulate it. */
-       buffer = PyMem_MALLOC(size + 512);
+       buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE);
        if (buffer == NULL) {
                len = -666;
                goto Done;
@@ -75,7 +85,7 @@ PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
        if (len < 0)
                /* ignore the error */;
 
-       else if ((size_t)len >= size + 512)
+       else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE)
                Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");
 
        else {
@@ -86,8 +96,10 @@ PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
                str[to_copy] = '\0';
        }
        PyMem_FREE(buffer);
-Done:
 #endif
-       str[size-1] = '\0';
+Done:
+       if (size > 0)
+               str[size-1] = '\0';
        return len;
+#undef _PyOS_vsnprintf_EXTRA_SPACE
 }
index fd6f68d1d18d92c633bf83713c13f4e097366a4f..baa305c1a66d785572c43d7e496143b30bc16e4b 100644 (file)
@@ -217,7 +217,7 @@ case $ac_sys_system/$ac_sys_release in
   # On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined,
   # even though select is a POSIX function. Reported by J. Ribbens.
   # Reconfirmed for OpenBSD 3.3 by Zachary Hamm, for 3.4 by Jason Ish.
-  OpenBSD/2.* | OpenBSD/3.@<:@0123456789@:>@ | OpenBSD/4.@<:@0@:>@) 
+  OpenBSD/2.* | OpenBSD/3.@<:@0123456789@:>@ | OpenBSD/4.@<:@0123@:>@) 
     define_xopen_source=no
     # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
     # also defined. This can be overridden by defining _BSD_SOURCE
@@ -265,6 +265,11 @@ case $ac_sys_system/$ac_sys_release in
   Darwin/@<:@789@:>@.*)
     define_xopen_source=no
     ;;
+  # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from
+  # defining NI_NUMERICHOST.
+  QNX/6.3.2)
+    define_xopen_source=no
+    ;;
 
 esac
 
@@ -549,6 +554,10 @@ then
           LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";;
        Monterey64*)
           LINKCC="$LINKCC -L/usr/lib/ia64l64";;
+       QNX*)
+          # qcc must be used because the other compilers do not
+          # support -N.
+          LINKCC=qcc;;
        esac
 fi
 AC_MSG_RESULT($LINKCC)
@@ -1091,7 +1100,7 @@ unistd.h utime.h \
 sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \
 sys/lock.h sys/mkdev.h sys/modem.h \
 sys/param.h sys/poll.h sys/select.h sys/socket.h sys/statvfs.h sys/stat.h \
-sys/time.h \
+sys/termio.h sys/time.h \
 sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \
 sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \
 bluetooth/bluetooth.h linux/tipc.h)
@@ -1517,7 +1526,7 @@ then
                        fi
                fi
                ;;
-       Linux*|GNU*) LDSHARED='$(CC) -shared';;
+       Linux*|GNU*|QNX*) LDSHARED='$(CC) -shared';;
        BSD/OS*/4*) LDSHARED="gcc -shared";;
        FreeBSD*)
                if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
@@ -1641,6 +1650,13 @@ then
                then
                        LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
                fi;;
+       QNX*)
+               # -Wl,-E causes the symbols to be added to the dynamic
+               # symbol table so that they can be found when a module
+               # is loaded.  -N 2048K causes the stack size to be set
+               # to 2048 kilobytes so that the stack doesn't overflow
+               # when running test_compile.py.
+               LINKFORSHARED='-Wl,-E -N 2048K';;
        esac
 fi
 AC_MSG_RESULT($LINKFORSHARED)
index bbcc1d332cbd3d99fa51f37f57866cdb26a94252..d5ec2b01666d16d95a41cfc9765c7bd52cfc9a0e 100644 (file)
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
+/* Define to 1 if you have the <sys/termio.h> header file. */
+#undef HAVE_SYS_TERMIO_H
+
 /* Define to 1 if you have the <sys/times.h> header file. */
 #undef HAVE_SYS_TIMES_H
 
index 1c46305b9fc277c9c4d1bd983205c3204c939af1..38b8cc2b2e952dfbe42e6bde79ef02dfbbe63bdf 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -939,7 +939,7 @@ class PyBuildExt(build_ext):
                 missing.append('resource')
 
             # Sun yellow pages. Some systems have the functions in libc.
-            if platform not in ['cygwin', 'atheos']:
+            if platform not in ['cygwin', 'atheos', 'qnx6']:
                 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
                     libs = ['nsl']
                 else: