Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from

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__.
........
This commit is contained in:
Georg Brandl 2008-06-10 17:40:04 +00:00
parent 4066186c89
commit f78e02b798
42 changed files with 421 additions and 265 deletions

View File

@ -44,8 +44,8 @@ The module defines the following items:
the method call ``login(user, passwd, acct)`` is made (where *passwd* and the method call ``login(user, passwd, acct)`` is made (where *passwd* and
*acct* default to the empty string when not given). The optional *timeout* *acct* default to the empty string when not given). The optional *timeout*
parameter specifies a timeout in seconds for blocking operations like the parameter specifies a timeout in seconds for blocking operations like the
connection attempt (if is not specified, or passed as None, the global connection attempt (if is not specified, the global default timeout setting
default timeout setting will be used). will be used).
.. attribute:: all_errors .. attribute:: all_errors
@ -123,10 +123,8 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
made. made.
The optional *timeout* parameter specifies a timeout in seconds for the The optional *timeout* parameter specifies a timeout in seconds for the
connection attempt. If is not specified, or passed as None, the object connection attempt. If no *timeout* is passed, the global default timeout
timeout is used (the timeout that you passed when instantiating the class); setting will be used.
if the object timeout is also None, the global default timeout setting will
be used.
.. method:: FTP.getwelcome() .. method:: FTP.getwelcome()

View 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 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 status line. If the optional *timeout* parameter is given, blocking
operations (like connection attempts) will timeout after that many seconds 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 For example, the following calls all create instances that connect to the server
at the same host and port:: at the same host and port::

View 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 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) 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 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 connection attempt (if not specified, the global default timeout setting will
timeout setting will be used). be used).
.. class:: POP3_SSL(host[, port[, keyfile[, certfile]]]) .. class:: POP3_SSL(host[, port[, keyfile[, certfile]]])

View File

@ -25,8 +25,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
with those parameters during initialization. An :exc:`SMTPConnectError` is with those parameters during initialization. An :exc:`SMTPConnectError` is
raised if the specified host doesn't respond correctly. The optional raised if the specified host doesn't respond correctly. The optional
*timeout* parameter specifies a timeout in seconds for blocking operations *timeout* parameter specifies a timeout in seconds for blocking operations
like the connection attempt (if not specified, or passed as None, the global like the connection attempt (if not specified, the global default timeout
default timeout setting will be used). setting will be used).
For normal use, you should only require the initialization/connect, For normal use, you should only require the initialization/connect,
:meth:`sendmail`, and :meth:`quit` methods. An example is included below. :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 *certfile* are also optional, and can contain a PEM formatted private key
and certificate chain file for the SSL connection. The optional *timeout* and certificate chain file for the SSL connection. The optional *timeout*
parameter specifies a timeout in seconds for blocking operations like the parameter specifies a timeout in seconds for blocking operations like the
connection attempt (if not specified, or passed as None, the global default connection attempt (if not specified, the global default timeout setting
timeout setting will be used). will be used).
.. class:: LMTP([host[, port[, local_hostname]]]) .. class:: LMTP([host[, port[, local_hostname]]])

View File

@ -197,12 +197,11 @@ The module :mod:`socket` exports the following constants and functions:
.. function:: create_connection(address[, timeout]) .. function:: create_connection(address[, timeout])
Connects to the *address* received (as usual, a ``(host, port)`` pair), with an Convenience function. Connect to *address* (a 2-tuple ``(host, port)``),
optional timeout for the connection. Especially useful for higher-level and return the socket object. Passing the optional *timeout* parameter will
protocols, it is not normally used directly from application-level code. set the timeout on the socket instance before attempting to connect. If no
Passing the optional *timeout* parameter will set the timeout on the socket *timeout* is supplied, the global default timeout setting returned by
instance (if it is not given or ``None``, the global default timeout setting is :func:`getdefaulttimeout` is used.
used).
.. function:: getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]]) .. function:: getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])

View 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 :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 initially not connected by default; the :meth:`open` method must be used to
establish a connection. Alternatively, the host name and optional port 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 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 the server will be established before the constructor returns. The optional
*timeout* parameter specifies a timeout in seconds for blocking operations *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 Connect to a host. The optional second argument is the port number, which
defaults to the standard Telnet port (23). The optional *timeout* parameter defaults to the standard Telnet port (23). The optional *timeout* parameter
specifies a timeout in seconds for blocking operations like the connection specifies a timeout in seconds for blocking operations like the connection
attempt (if not specified, or passed as None, the global default timeout attempt (if not specified, the global default timeout setting will be used).
setting will be used).
Do not try to reopen an already connected instance. Do not try to reopen an already connected instance.

View File

@ -27,9 +27,9 @@ The :mod:`urllib2` module defines the following functions:
returns a string in this format. returns a string in this format.
The optional *timeout* parameter specifies a timeout in seconds for blocking The optional *timeout* parameter specifies a timeout in seconds for blocking
operations like the connection attempt (if not specified, or passed as operations like the connection attempt (if not specified, the global default
``None``, the global default timeout setting will be used). This actually timeout setting will be used). This actually only works for HTTP, HTTPS,
only works for HTTP, HTTPS, FTP and FTPS connections. FTP and FTPS connections.
This function returns a file-like object with two additional methods: 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` the same as those of :func:`urlopen` (which simply calls the :meth:`open`
method on the currently installed global :class:`OpenerDirector`). The method on the currently installed global :class:`OpenerDirector`). The
optional *timeout* parameter specifies a timeout in seconds for blocking optional *timeout* parameter specifies a timeout in seconds for blocking
operations like the connection attempt (if not specified, or passed as operations like the connection attempt (if not specified, the global default
``None``, the global default timeout setting will be used; this actually only timeout setting will be usedi). The timeout feature actually works only for
works for HTTP, HTTPS, FTP and FTPS connections). HTTP, HTTPS, FTP and FTPS connections).
.. method:: OpenerDirector.error(proto[, arg[, ...]]) .. method:: OpenerDirector.error(proto[, arg[, ...]])

View File

@ -431,6 +431,13 @@ extern int gethostname(char *, int);
extern char * _getpty(int *, int, mode_t, int); extern char * _getpty(int *, int, mode_t, int);
#endif #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_OPENPTY) || defined(HAVE_FORKPTY)
#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) #if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' /* BSDI does not supply a prototype for the 'openpty' and 'forkpty'

View File

@ -44,6 +44,7 @@ try:
from socket import getfqdn; socket.getfqdn = getfqdn; del getfqdn from socket import getfqdn; socket.getfqdn = getfqdn; del getfqdn
except ImportError: except ImportError:
import socket import socket
from socket import _GLOBAL_DEFAULT_TIMEOUT
__all__ = ["FTP","Netrc"] __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) # Line terminators (we always output CRLF, but accept any of CRLF, CR, LF)
CRLF = '\r\n' CRLF = '\r\n'
# The class itself # The class itself
class FTP: class FTP:
@ -110,14 +110,15 @@ class FTP:
# Initialize host to localhost, port to standard ftp port # Initialize host to localhost, port to standard ftp port
# Optional arguments are host (for connect()), # Optional arguments are host (for connect()),
# and user, passwd, acct (for login()) # 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 self.timeout = timeout
if host: if host:
self.connect(host) self.connect(host)
if user: if user:
self.login(user, passwd, acct) 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: '''Connect to host. Arguments are:
- host: hostname to connect to (string, default previous host) - host: hostname to connect to (string, default previous host)
- port: port to connect to (integer, default previous port) - port: port to connect to (integer, default previous port)
@ -126,7 +127,7 @@ class FTP:
self.host = host self.host = host
if port > 0: if port > 0:
self.port = port self.port = port
if timeout is not None: if timeout != -999:
self.timeout = timeout self.timeout = timeout
self.sock = socket.create_connection((self.host, self.port), self.timeout) self.sock = socket.create_connection((self.host, self.port), self.timeout)
self.af = self.sock.family self.af = self.sock.family

View File

@ -167,7 +167,7 @@ def heapreplace(heap, item):
def heappushpop(heap, item): def heappushpop(heap, item):
"""Fast version of a heappush followed by a heappop.""" """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 item, heap[0] = heap[0], item
_siftup(heap, 0) _siftup(heap, 0)
return item return item
@ -240,10 +240,11 @@ def _siftdown(heap, startpos, pos):
while pos > startpos: while pos > startpos:
parentpos = (pos - 1) >> 1 parentpos = (pos - 1) >> 1
parent = heap[parentpos] parent = heap[parentpos]
if parent <= newitem: if newitem < parent:
break
heap[pos] = parent heap[pos] = parent
pos = parentpos pos = parentpos
continue
break
heap[pos] = newitem heap[pos] = newitem
# The child indices of heap index pos are already heaps, and we want to make # 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: while childpos < endpos:
# Set childpos to index of smaller child. # Set childpos to index of smaller child.
rightpos = childpos + 1 rightpos = childpos + 1
if rightpos < endpos and heap[rightpos] <= heap[childpos]: if rightpos < endpos and not heap[childpos] < heap[rightpos]:
childpos = rightpos childpos = rightpos
# Move the smaller child up. # Move the smaller child up.
heap[pos] = heap[childpos] heap[pos] = heap[childpos]

View File

@ -664,7 +664,8 @@ class HTTPConnection:
debuglevel = 0 debuglevel = 0
strict = 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.timeout = timeout
self.sock = None self.sock = None
self._buffer = [] self._buffer = []
@ -996,7 +997,7 @@ else:
default_port = HTTPS_PORT default_port = HTTPS_PORT
def __init__(self, host, port=None, key_file=None, cert_file=None, 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) HTTPConnection.__init__(self, host, port, strict, timeout)
self.key_file = key_file self.key_file = key_file
self.cert_file = cert_file self.cert_file = cert_file

View 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.host = host
self.port = port self.port = port
self.sock = socket.create_connection((host, port), timeout) self.sock = socket.create_connection((host, port), timeout)

View File

@ -220,7 +220,8 @@ class SMTP:
ehlo_resp = None ehlo_resp = None
does_esmtp = 0 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. """Initialize a new instance.
If specified, `host' is the name of the remote host to which to 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. certificate chain file for the SSL connection.
""" """
def __init__(self, host='', port=0, local_hostname=None, 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.keyfile = keyfile
self.certfile = certfile self.certfile = certfile
SMTP.__init__(self, host, port, local_hostname, timeout) SMTP.__init__(self, host, port, local_hostname, timeout)

View File

@ -265,13 +265,17 @@ def getfqdn(name=''):
return name return name
def create_connection(address, timeout=None): _GLOBAL_DEFAULT_TIMEOUT = object()
"""Connect to address (host, port) with an optional timeout.
Provides access to socketobject timeout for higher-level def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT):
protocols. Passing a timeout will set the timeout on the """Connect to *address* and return the socket object.
socket instance (if not present, or passed as None, the
default global timeout setting will be 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.
""" """
msg = "getaddrinfo returns an empty list" msg = "getaddrinfo returns an empty list"
@ -281,7 +285,7 @@ def create_connection(address, timeout=None):
sock = None sock = None
try: try:
sock = socket(af, socktype, proto) sock = socket(af, socktype, proto)
if timeout is not None: if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
sock.settimeout(timeout) sock.settimeout(timeout)
sock.connect(sa) sock.connect(sa)
return sock return sock

View File

@ -292,6 +292,15 @@ class CursorTests(unittest.TestCase):
self.cu.execute("update test set name='bar'") self.cu.execute("update test set name='bar'")
self.failUnlessEqual(self.cu.rowcount, 2) 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): def CheckRowcountExecutemany(self):
self.cu.execute("delete from test") self.cu.execute("delete from test")
self.cu.executemany("insert into test(name) values (?)", [(1,), (2,), (3,)]) self.cu.executemany("insert into test(name) values (?)", [(1,), (2,), (3,)])

View 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. """Constructor.
When called without arguments, create an unconnected instance. When called without arguments, create an unconnected instance.
With a hostname argument, it connects the instance; a port With a hostname argument, it connects the instance; port number
number is optional. and timeout are optional.
""" """
self.debuglevel = DEBUGLEVEL self.debuglevel = DEBUGLEVEL
self.host = host self.host = host
@ -208,23 +208,21 @@ class Telnet:
if host is not None: if host is not None:
self.open(host, port, timeout) 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. """Connect to a host.
The optional second argument is the port number, which The optional second argument is the port number, which
defaults to the standard telnet port (23). defaults to the standard telnet port (23).
Don't try to reopen an already connected instance. Don't try to reopen an already connected instance.
""" """
self.eof = 0 self.eof = 0
if not port: if not port:
port = TELNET_PORT port = TELNET_PORT
self.host = host self.host = host
self.port = port self.port = port
if timeout is not None:
self.timeout = timeout self.timeout = timeout
self.sock = socket.create_connection((host, port), self.timeout) self.sock = socket.create_connection((host, port), timeout)
def __del__(self): def __del__(self):
"""Destructor -- close the connection.""" """Destructor -- close the connection."""

View 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, "one", "two") # too many args
self.assertRaises(TypeError, t.strftime, 42) # arg wrong type 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. # A naive object replaces %z and %Z w/ empty strings.
self.assertEqual(t.strftime("'%z' '%Z'"), "'' ''") self.assertEqual(t.strftime("'%z' '%Z'"), "'' ''")
def test_format(self): def test_format(self):
dt = self.theclass(2007, 9, 10) dt = self.theclass(2007, 9, 10)
self.assertEqual(dt.__format__(''), str(dt)) self.assertEqual(dt.__format__(''), str(dt))

View File

@ -54,35 +54,52 @@ class GeneralTests(TestCase):
# connects # connects
ftp = ftplib.FTP(HOST) ftp = ftplib.FTP(HOST)
self.evt.wait() self.evt.wait()
ftp.sock.close() ftp.close()
def testTimeoutDefault(self): def testTimeoutDefault(self):
# default # default -- use global socket timeout
ftp = ftplib.FTP(HOST) 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.assertTrue(ftp.sock.gettimeout() is None)
self.evt.wait() self.evt.wait()
ftp.sock.close() ftp.close()
def testTimeoutValue(self): def testTimeoutValue(self):
# a value # a value
ftp = ftplib.FTP(HOST, timeout=30) ftp = ftplib.FTP(HOST, timeout=30)
self.assertEqual(ftp.sock.gettimeout(), 30) self.assertEqual(ftp.sock.gettimeout(), 30)
self.evt.wait() self.evt.wait()
ftp.sock.close() ftp.close()
def testTimeoutConnect(self): def testTimeoutConnect(self):
ftp = ftplib.FTP() ftp = ftplib.FTP()
ftp.connect(HOST, timeout=30) ftp.connect(HOST, timeout=30)
self.assertEqual(ftp.sock.gettimeout(), 30) self.assertEqual(ftp.sock.gettimeout(), 30)
self.evt.wait() self.evt.wait()
ftp.sock.close() ftp.close()
def testTimeoutDifferentOrder(self): def testTimeoutDifferentOrder(self):
ftp = ftplib.FTP(timeout=30) ftp = ftplib.FTP(timeout=30)
ftp.connect(HOST) ftp.connect(HOST)
self.assertEqual(ftp.sock.gettimeout(), 30) self.assertEqual(ftp.sock.gettimeout(), 30)
self.evt.wait() self.evt.wait()
ftp.sock.close() ftp.close()
def testTimeoutDirectAccess(self): def testTimeoutDirectAccess(self):
ftp = ftplib.FTP() ftp = ftplib.FTP()
@ -90,18 +107,6 @@ class GeneralTests(TestCase):
ftp.connect(HOST) ftp.connect(HOST)
self.assertEqual(ftp.sock.gettimeout(), 30) self.assertEqual(ftp.sock.gettimeout(), 30)
self.evt.wait() 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() ftp.close()

View File

@ -215,27 +215,32 @@ class TimeoutTest(TestCase):
# This will prove that the timeout gets through HTTPConnection # This will prove that the timeout gets through HTTPConnection
# and into the socket. # and into the socket.
# default # default -- use global socket timeout
self.assert_(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(30)
try:
httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT) httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT)
httpConn.connect() httpConn.connect()
self.assertTrue(httpConn.sock.gettimeout() is None) finally:
httpConn.close() socket.setdefaulttimeout(None)
# a value
httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, timeout=30)
httpConn.connect()
self.assertEqual(httpConn.sock.gettimeout(), 30) self.assertEqual(httpConn.sock.gettimeout(), 30)
httpConn.close() httpConn.close()
# None, having other default # no timeout -- do not use global socket default
previous = socket.getdefaulttimeout() self.assert_(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
try: try:
httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT, httpConn = httplib.HTTPConnection(HOST, TimeoutTest.PORT,
timeout=None) timeout=None)
httpConn.connect() httpConn.connect()
finally: 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) self.assertEqual(httpConn.sock.gettimeout(), 30)
httpConn.close() httpConn.close()

View File

@ -736,7 +736,7 @@ class MathTests(unittest.TestCase):
OverflowError), OverflowError),
([2.**1023, 2.**1023, -1e307], OverflowError), ([2.**1023, 2.**1023, -1e307], OverflowError),
([1e16, 1., 1e-16], 10000000000000002.0), ([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): for i, (vals, s) in enumerate(test_values):

View File

@ -40,28 +40,29 @@ class GeneralTests(TestCase):
pop.sock.close() pop.sock.close()
def testTimeoutDefault(self): def testTimeoutDefault(self):
# default self.assertTrue(socket.getdefaulttimeout() is None)
pop = poplib.POP3(HOST, self.port) socket.setdefaulttimeout(30)
self.assertTrue(pop.sock.gettimeout() is None) try:
pop.sock.close() pop = poplib.POP3("localhost", self.port)
finally:
def testTimeoutValue(self): socket.setdefaulttimeout(None)
# a value
pop = poplib.POP3(HOST, self.port, timeout=30)
self.assertEqual(pop.sock.gettimeout(), 30) self.assertEqual(pop.sock.gettimeout(), 30)
pop.sock.close() pop.sock.close()
def testTimeoutNone(self): def testTimeoutNone(self):
# None, having other default self.assertTrue(socket.getdefaulttimeout() is None)
previous = socket.getdefaulttimeout()
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
try: try:
pop = poplib.POP3(HOST, self.port, timeout=None) pop = poplib.POP3(HOST, self.port, timeout=None)
finally: finally:
socket.setdefaulttimeout(previous) socket.setdefaulttimeout(None)
self.assertEqual(pop.sock.gettimeout(), 30) self.assertTrue(pop.sock.gettimeout() is None)
pop.sock.close() 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): def test_main(verbose=None):

View File

@ -54,41 +54,43 @@ class GeneralTests(TestCase):
def testBasic1(self): def testBasic1(self):
# connects # connects
smtp = smtplib.SMTP(HOST, self.port) smtp = smtplib.SMTP(HOST, self.port)
smtp.sock.close() smtp.close()
def testBasic2(self): def testBasic2(self):
# connects, include port in host name # connects, include port in host name
smtp = smtplib.SMTP("%s:%s" % (HOST, self.port)) smtp = smtplib.SMTP("%s:%s" % (HOST, self.port))
smtp.sock.close() smtp.close()
def testLocalHostName(self): def testLocalHostName(self):
# check that supplied local_hostname is used # check that supplied local_hostname is used
smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost") smtp = smtplib.SMTP(HOST, self.port, local_hostname="testhost")
self.assertEqual(smtp.local_hostname, "testhost") self.assertEqual(smtp.local_hostname, "testhost")
smtp.sock.close() smtp.close()
def testTimeoutDefault(self): def testTimeoutDefault(self):
# default self.assertTrue(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(30)
try:
smtp = smtplib.SMTP(HOST, self.port) smtp = smtplib.SMTP(HOST, self.port)
self.assertTrue(smtp.sock.gettimeout() is None) finally:
smtp.sock.close() socket.setdefaulttimeout(None)
def testTimeoutValue(self):
# a value
smtp = smtplib.SMTP(HOST, self.port, timeout=30)
self.assertEqual(smtp.sock.gettimeout(), 30) self.assertEqual(smtp.sock.gettimeout(), 30)
smtp.sock.close() smtp.close()
def testTimeoutNone(self): def testTimeoutNone(self):
# None, having other default self.assertTrue(socket.getdefaulttimeout() is None)
previous = socket.getdefaulttimeout()
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
try: try:
smtp = smtplib.SMTP(HOST, self.port, timeout=None) smtp = smtplib.SMTP(HOST, self.port, timeout=None)
finally: 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) self.assertEqual(smtp.sock.gettimeout(), 30)
smtp.sock.close() smtp.close()
# Test server thread using the specified SMTP server class # Test server thread using the specified SMTP server class

View File

@ -929,8 +929,25 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
testTimeoutDefault = _justAccept testTimeoutDefault = _justAccept
def _testTimeoutDefault(self): def _testTimeoutDefault(self):
# 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)) self.cli = socket.create_connection((HOST, self.port))
self.assertTrue(self.cli.gettimeout() is None) 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 testTimeoutValueNamed = _justAccept
def _testTimeoutValueNamed(self): def _testTimeoutValueNamed(self):
@ -942,17 +959,6 @@ class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
self.cli = socket.create_connection((HOST, self.port), 30) self.cli = socket.create_connection((HOST, self.port), 30)
self.assertEqual(self.cli.gettimeout(), 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): class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):

View File

@ -40,34 +40,36 @@ class GeneralTests(TestCase):
telnet.sock.close() telnet.sock.close()
def testTimeoutDefault(self): def testTimeoutDefault(self):
# default self.assertTrue(socket.getdefaulttimeout() is None)
telnet = telnetlib.Telnet(HOST, self.port) socket.setdefaulttimeout(30)
self.assertTrue(telnet.sock.gettimeout() is None) try:
telnet.sock.close() telnet = telnetlib.Telnet("localhost", self.port)
finally:
def testTimeoutValue(self): socket.setdefaulttimeout(None)
# 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.assertEqual(telnet.sock.gettimeout(), 30) self.assertEqual(telnet.sock.gettimeout(), 30)
telnet.sock.close() telnet.sock.close()
def testTimeoutNone(self): def testTimeoutNone(self):
# None, having other default # None, having other default
previous = socket.getdefaulttimeout() self.assertTrue(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(30) socket.setdefaulttimeout(30)
try: try:
telnet = telnetlib.Telnet(HOST, self.port, timeout=None) telnet = telnetlib.Telnet(HOST, self.port, timeout=None)
finally: 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) self.assertEqual(telnet.sock.gettimeout(), 30)
telnet.sock.close() 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): def test_main(verbose=None):

View File

@ -568,6 +568,7 @@ class Pathname_Tests(unittest.TestCase):
# . Facundo # . Facundo
# #
# def server(evt): # def server(evt):
# import socket, time
# serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# serv.settimeout(3) # serv.settimeout(3)
# serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
@ -592,6 +593,7 @@ class Pathname_Tests(unittest.TestCase):
# class FTPWrapperTests(unittest.TestCase): # class FTPWrapperTests(unittest.TestCase):
# #
# def setUp(self): # def setUp(self):
# import ftplib, time, threading
# ftplib.FTP.port = 9093 # ftplib.FTP.port = 9093
# self.evt = threading.Event() # self.evt = threading.Event()
# threading.Thread(target=server, args=(self.evt,)).start() # threading.Thread(target=server, args=(self.evt,)).start()
@ -603,31 +605,37 @@ class Pathname_Tests(unittest.TestCase):
# def testBasic(self): # def testBasic(self):
# # connects # # connects
# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) # 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)
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.ftp.sock.close()
# #
# def testTimeoutNone(self): # def testTimeoutNone(self):
# # None, having other default # # global default timeout is ignored
# previous = socket.getdefaulttimeout() # import socket
# self.assert_(socket.getdefaulttimeout() is None)
# socket.setdefaulttimeout(30) # socket.setdefaulttimeout(30)
# try: # try:
# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, []) # ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [])
# finally: # finally:
# socket.setdefaulttimeout(previous) # socket.setdefaulttimeout(None)
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30) # self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.ftp.close() # ftp.close()
# #
# 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(None)
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.close()
#
# def testTimeoutValue(self):
# ftp = urllib.ftpwrapper("myuser", "mypass", "localhost", 9093, [],
# timeout=30)
# self.assertEqual(ftp.ftp.sock.gettimeout(), 30)
# ftp.close()

View File

@ -3,6 +3,7 @@ from test import support
import os import os
import io import io
import socket
import urllib2 import urllib2
from urllib2 import Request, OpenerDirector from urllib2 import Request, OpenerDirector
@ -546,14 +547,15 @@ class HandlerTests(unittest.TestCase):
class NullFTPHandler(urllib2.FTPHandler): class NullFTPHandler(urllib2.FTPHandler):
def __init__(self, data): self.data = data 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.user, self.passwd = user, passwd
self.host, self.port = host, port self.host, self.port = host, port
self.dirs = dirs self.dirs = dirs
self.ftpwrapper = MockFTPWrapper(self.data) self.ftpwrapper = MockFTPWrapper(self.data)
return self.ftpwrapper return self.ftpwrapper
import ftplib, socket import ftplib
data = "rheum rhaponicum" data = "rheum rhaponicum"
h = NullFTPHandler(data) h = NullFTPHandler(data)
o = h.parent = MockOpener() o = h.parent = MockOpener()
@ -686,7 +688,7 @@ class HandlerTests(unittest.TestCase):
self.req_headers = [] self.req_headers = []
self.data = None self.data = None
self.raise_on_endheaders = False self.raise_on_endheaders = False
def __call__(self, host, timeout=None): def __call__(self, host, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
self.host = host self.host = host
self.timeout = timeout self.timeout = timeout
return self return self

View File

@ -188,46 +188,58 @@ class OtherNetworkTests(unittest.TestCase):
class TimeoutTest(unittest.TestCase): class TimeoutTest(unittest.TestCase):
def test_http_basic(self): def test_http_basic(self):
self.assertTrue(socket.getdefaulttimeout() is None)
u = _urlopen_with_retry("http://www.python.org") u = _urlopen_with_retry("http://www.python.org")
self.assertTrue(u.fp.raw.fp._sock.gettimeout() is None) self.assertTrue(u.fp.raw.fp._sock.gettimeout() is None)
def test_http_NoneWithdefault(self): def test_http_default_timeout(self):
prev = socket.getdefaulttimeout() 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) socket.setdefaulttimeout(60)
try: try:
u = _urlopen_with_retry("http://www.python.org", timeout=None) u = _urlopen_with_retry("http://www.python.org", timeout=None)
self.assertTrue(u.fp.raw.fp._sock.gettimeout(), 60)
finally: 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) u = _urlopen_with_retry("http://www.python.org", timeout=120)
self.assertEqual(u.fp.raw.fp._sock.gettimeout(), 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/" FTP_HOST = "ftp://ftp.mirror.nl/pub/mirror/gnu/"
def test_ftp_basic(self): def test_ftp_basic(self):
self.assertTrue(socket.getdefaulttimeout() is None)
u = _urlopen_with_retry(self.FTP_HOST) u = _urlopen_with_retry(self.FTP_HOST)
self.assertTrue(u.fp.fp.raw._sock.gettimeout() is None) self.assertTrue(u.fp.fp.raw._sock.gettimeout() is None)
def test_ftp_NoneWithdefault(self): def test_ftp_default_timeout(self):
prev = socket.getdefaulttimeout() self.assertTrue(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(60)
try:
u = _urlopen_with_retry(self.FTP_HOST)
finally:
socket.setdefaulttimeout(None)
self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
def test_ftp_no_timeout(self):
self.assertTrue(socket.getdefaulttimeout() is None)
socket.setdefaulttimeout(60) socket.setdefaulttimeout(60)
try: try:
u = _urlopen_with_retry(self.FTP_HOST, timeout=None) u = _urlopen_with_retry(self.FTP_HOST, timeout=None)
self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)
finally: finally:
socket.setdefaulttimeout(prev) socket.setdefaulttimeout(None)
def test_ftp_NoneNodefault(self):
u = _urlopen_with_retry(self.FTP_HOST, timeout=None)
self.assertTrue(u.fp.fp.raw._sock.gettimeout() is 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) u = _urlopen_with_retry(self.FTP_HOST, timeout=60)
self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60) self.assertEqual(u.fp.fp.raw._sock.gettimeout(), 60)

View File

@ -776,7 +776,8 @@ def noheaders():
class ftpwrapper: class ftpwrapper:
"""Class used by open_ftp() for cache of open FTP connections.""" """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.user = user
self.passwd = passwd self.passwd = passwd
self.host = host self.host = host

View File

@ -115,7 +115,7 @@ from urllib import localhost, url2pathname, getproxies
__version__ = sys.version[:3] __version__ = sys.version[:3]
_opener = None _opener = None
def urlopen(url, data=None, timeout=None): def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
global _opener global _opener
if _opener is None: if _opener is None:
_opener = build_opener() _opener = build_opener()
@ -357,7 +357,7 @@ class OpenerDirector:
if result is not None: if result is not None:
return result 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 # accept a URL or a Request object
if isinstance(fullurl, str): if isinstance(fullurl, str):
req = Request(fullurl, data) req = Request(fullurl, data)

View File

@ -20406,6 +20406,9 @@ case "$host" in
i?86-*-solaris2.1[0-9]*) i?86-*-solaris2.1[0-9]*)
TARGET=X86_64; TARGETDIR=x86 TARGET=X86_64; TARGETDIR=x86
;; ;;
i*86-*-nto-qnx*)
TARGET=X86; TARGETDIR=x86
;;
i?86-*-*) i?86-*-*)
TARGET=X86; TARGETDIR=x86 TARGET=X86; TARGETDIR=x86
;; ;;

View File

@ -86,6 +86,9 @@ case "$host" in
i?86-*-solaris2.1[[0-9]]*) i?86-*-solaris2.1[[0-9]]*)
TARGET=X86_64; TARGETDIR=x86 TARGET=X86_64; TARGETDIR=x86
;; ;;
i*86-*-nto-qnx*)
TARGET=X86; TARGETDIR=x86
;;
i?86-*-*) i?86-*-*)
TARGET=X86; TARGETDIR=x86 TARGET=X86; TARGETDIR=x86
;; ;;

View File

@ -44,7 +44,11 @@ static void more_core(void)
} }
#else #else
if (!_pagesize) { if (!_pagesize) {
#ifdef _SC_PAGESIZE
_pagesize = sysconf(_SC_PAGESIZE);
#else
_pagesize = getpagesize(); _pagesize = getpagesize();
#endif
} }
#endif #endif

View File

@ -8,6 +8,25 @@ annotated by Fran
#include "Python.h" #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 static int
_siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos) _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){ while (pos > startpos){
parentpos = (pos - 1) >> 1; parentpos = (pos - 1) >> 1;
parent = PyList_GET_ITEM(heap, parentpos); parent = PyList_GET_ITEM(heap, parentpos);
cmp = PyObject_RichCompareBool(parent, newitem, Py_LE); cmp = cmp_lt(newitem, parent);
if (cmp == -1) { if (cmp == -1) {
Py_DECREF(newitem); Py_DECREF(newitem);
return -1; return -1;
} }
if (cmp == 1) if (cmp == 0)
break; break;
Py_INCREF(parent); Py_INCREF(parent);
Py_DECREF(PyList_GET_ITEM(heap, pos)); 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. */ /* Set childpos to index of smaller child. */
rightpos = childpos + 1; rightpos = childpos + 1;
if (rightpos < endpos) { if (rightpos < endpos) {
cmp = PyObject_RichCompareBool( cmp = cmp_lt(
PyList_GET_ITEM(heap, rightpos),
PyList_GET_ITEM(heap, childpos), PyList_GET_ITEM(heap, childpos),
Py_LE); PyList_GET_ITEM(heap, rightpos));
if (cmp == -1) { if (cmp == -1) {
Py_DECREF(newitem); Py_DECREF(newitem);
return -1; return -1;
} }
if (cmp == 1) if (cmp == 0)
childpos = rightpos; childpos = rightpos;
} }
/* Move the smaller child up. */ /* Move the smaller child up. */
@ -214,10 +232,10 @@ heappushpop(PyObject *self, PyObject *args)
return item; 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) if (cmp == -1)
return NULL; return NULL;
if (cmp == 1) { if (cmp == 0) {
Py_INCREF(item); Py_INCREF(item);
return item; return item;
} }
@ -270,6 +288,7 @@ nlargest(PyObject *self, PyObject *args)
{ {
PyObject *heap=NULL, *elem, *iterable, *sol, *it, *oldelem; PyObject *heap=NULL, *elem, *iterable, *sol, *it, *oldelem;
Py_ssize_t i, n; Py_ssize_t i, n;
int cmp;
if (!PyArg_ParseTuple(args, "nO:nlargest", &n, &iterable)) if (!PyArg_ParseTuple(args, "nO:nlargest", &n, &iterable))
return NULL; return NULL;
@ -312,7 +331,12 @@ nlargest(PyObject *self, PyObject *args)
else else
goto sortit; 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); Py_DECREF(elem);
continue; continue;
} }
@ -362,12 +386,12 @@ _siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)
while (pos > startpos){ while (pos > startpos){
parentpos = (pos - 1) >> 1; parentpos = (pos - 1) >> 1;
parent = PyList_GET_ITEM(heap, parentpos); parent = PyList_GET_ITEM(heap, parentpos);
cmp = PyObject_RichCompareBool(newitem, parent, Py_LE); cmp = cmp_lt(parent, newitem);
if (cmp == -1) { if (cmp == -1) {
Py_DECREF(newitem); Py_DECREF(newitem);
return -1; return -1;
} }
if (cmp == 1) if (cmp == 0)
break; break;
Py_INCREF(parent); Py_INCREF(parent);
Py_DECREF(PyList_GET_ITEM(heap, pos)); 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. */ /* Set childpos to index of smaller child. */
rightpos = childpos + 1; rightpos = childpos + 1;
if (rightpos < endpos) { if (rightpos < endpos) {
cmp = PyObject_RichCompareBool( cmp = cmp_lt(
PyList_GET_ITEM(heap, childpos),
PyList_GET_ITEM(heap, rightpos), PyList_GET_ITEM(heap, rightpos),
Py_LE); PyList_GET_ITEM(heap, childpos));
if (cmp == -1) { if (cmp == -1) {
Py_DECREF(newitem); Py_DECREF(newitem);
return -1; return -1;
} }
if (cmp == 1) if (cmp == 0)
childpos = rightpos; childpos = rightpos;
} }
/* Move the smaller child up. */ /* Move the smaller child up. */
@ -434,6 +457,7 @@ nsmallest(PyObject *self, PyObject *args)
{ {
PyObject *heap=NULL, *elem, *iterable, *los, *it, *oldelem; PyObject *heap=NULL, *elem, *iterable, *los, *it, *oldelem;
Py_ssize_t i, n; Py_ssize_t i, n;
int cmp;
if (!PyArg_ParseTuple(args, "nO:nsmallest", &n, &iterable)) if (!PyArg_ParseTuple(args, "nO:nsmallest", &n, &iterable))
return NULL; return NULL;
@ -477,7 +501,12 @@ nsmallest(PyObject *self, PyObject *args)
else else
goto sortit; 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); Py_DECREF(elem);
continue; continue;
} }

View File

@ -101,10 +101,7 @@ int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject* kwargs
self->arraysize = 1; self->arraysize = 1;
self->rowcount = PyLong_FromLong(-1L); self->rowcount = -1L;
if (!self->rowcount) {
return -1;
}
Py_INCREF(Py_None); Py_INCREF(Py_None);
self->row_factory = 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->row_cast_map);
Py_XDECREF(self->description); Py_XDECREF(self->description);
Py_XDECREF(self->lastrowid); Py_XDECREF(self->lastrowid);
Py_XDECREF(self->rowcount);
Py_XDECREF(self->row_factory); Py_XDECREF(self->row_factory);
Py_XDECREF(self->next_row); Py_XDECREF(self->next_row);
@ -418,12 +414,12 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
int statement_type; int statement_type;
PyObject* descriptor; PyObject* descriptor;
PyObject* second_argument = NULL; PyObject* second_argument = NULL;
long rowcount = 0;
int allow_8bit_chars; int allow_8bit_chars;
if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) { if (!pysqlite_check_thread(self->connection) || !pysqlite_check_connection(self->connection)) {
return NULL; return NULL;
} }
/* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */ /* 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) && allow_8bit_chars = ((self->connection->text_factory != (PyObject*)&PyUnicode_Type) &&
(self->connection->text_factory != (PyObject*)&PyUnicode_Type && pysqlite_OptimizedUnicode)); (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) if (operation == NULL)
goto error; goto error;
/* reset description */ /* reset description and rowcount */
Py_DECREF(self->description); Py_DECREF(self->description);
Py_INCREF(Py_None); Py_INCREF(Py_None);
self->description = Py_None; self->description = Py_None;
self->rowcount = -1L;
func_args = PyTuple_New(1); func_args = PyTuple_New(1);
if (!func_args) { if (!func_args) {
@ -723,7 +720,10 @@ PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject*
case STATEMENT_DELETE: case STATEMENT_DELETE:
case STATEMENT_INSERT: case STATEMENT_INSERT:
case STATEMENT_REPLACE: 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); Py_DECREF(self->lastrowid);
@ -757,13 +757,9 @@ error:
Py_XDECREF(parameters_list); Py_XDECREF(parameters_list);
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
Py_DECREF(self->rowcount); self->rowcount = -1L;
self->rowcount = PyLong_FromLong(-1L);
return NULL; return NULL;
} else { } else {
Py_DECREF(self->rowcount);
self->rowcount = PyLong_FromLong(rowcount);
Py_INCREF(self); Py_INCREF(self);
return (PyObject*)self; return (PyObject*)self;
} }
@ -1053,7 +1049,7 @@ static struct PyMemberDef cursor_members[] =
{"description", T_OBJECT, offsetof(pysqlite_Cursor, description), READONLY}, {"description", T_OBJECT, offsetof(pysqlite_Cursor, description), READONLY},
{"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0}, {"arraysize", T_INT, offsetof(pysqlite_Cursor, arraysize), 0},
{"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY}, {"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}, {"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0},
{NULL} {NULL}
}; };

View File

@ -37,7 +37,7 @@ typedef struct
PyObject* row_cast_map; PyObject* row_cast_map;
int arraysize; int arraysize;
PyObject* lastrowid; PyObject* lastrowid;
PyObject* rowcount; long rowcount;
PyObject* row_factory; PyObject* row_factory;
pysqlite_Statement* statement; pysqlite_Statement* statement;

View File

@ -1201,17 +1201,17 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
PyObject *Zreplacement = NULL; /* py string, replacement for %Z */ PyObject *Zreplacement = NULL; /* py string, replacement for %Z */
PyObject *freplacement = NULL; /* py string, replacement for %f */ PyObject *freplacement = NULL; /* py string, replacement for %f */
const char *pin;/* pointer to next char in input format */ const char *pin; /* pointer to next char in input format */
Py_ssize_t flen;/* length of input format */ Py_ssize_t flen; /* length of input format */
char ch; /* next char in input format */ char ch; /* next char in input format */
PyObject *newfmt = NULL; /* py string, the output format */ PyObject *newfmt = NULL; /* py string, the output format */
char *pnew; /* pointer to available byte in output format */ char *pnew; /* pointer to available byte in output format */
int totalnew; /* number bytes total in output format buffer, size_t totalnew; /* number bytes total in output format buffer,
exclusive of trailing \0 */ exclusive of trailing \0 */
int usednew; /* number bytes used so far in output format buffer */ 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 */ Py_ssize_t ntoappend; /* # of bytes to append to output buffer */
assert(object && format && timetuple); assert(object && format && timetuple);
@ -1335,7 +1335,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
assert(ptoappend != NULL); assert(ptoappend != NULL);
assert(ntoappend > 0); assert(ntoappend > 0);
while (usednew + ntoappend > totalnew) { while (usednew + ntoappend > totalnew) {
int bigger = totalnew << 1; size_t bigger = totalnew << 1;
if ((bigger >> 1) != totalnew) { /* overflow */ if ((bigger >> 1) != totalnew) { /* overflow */
PyErr_NoMemory(); PyErr_NoMemory();
goto Done; goto Done;
@ -2444,8 +2444,8 @@ date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)
* timetuple() method appropriate to self's class. * timetuple() method appropriate to self's class.
*/ */
PyObject *result; PyObject *result;
PyObject *format;
PyObject *tuple; PyObject *tuple;
PyObject *format;
static char *keywords[] = {"format", NULL}; static char *keywords[] = {"format", NULL};
if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
@ -3211,8 +3211,8 @@ static PyObject *
time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw) time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
{ {
PyObject *result; PyObject *result;
PyObject *format;
PyObject *tuple; PyObject *tuple;
PyObject *format;
static char *keywords[] = {"format", NULL}; static char *keywords[] = {"format", NULL};
if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords,
@ -3232,7 +3232,8 @@ time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)
if (tuple == NULL) if (tuple == NULL)
return NULL; return NULL;
assert(PyTuple_Size(tuple) == 9); 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); Py_DECREF(tuple);
return result; return result;
} }

View File

@ -373,14 +373,20 @@ FUNC1(tanh, tanh, 0,
value semantics across iterations (i.e. handling -Inf + Inf). value semantics across iterations (i.e. handling -Inf + Inf).
Note 2: No provision is made for intermediate overflow handling; 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 sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
overflow of the first partial sum. overflow of the first partial sum.
Note 3: Aggressively optimizing compilers can potentially eliminate the Note 3: The itermediate values lo, yr, and hi are declared volatile so
residual values needed for accurate summation. For instance, the statements aggressive compilers won't algebraicly reduce lo to always be exactly 0.0.
"hi = x + y; lo = y - (hi - x);" could be mis-transformed to Also, the volatile declaration forces the values to be stored in memory as
"hi = x + y; lo = 0.0;" which defeats the computation of residuals. 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. Note 4: A similar implementation is in Modules/cmathmodule.c.
Be sure to update both when making changes. Be sure to update both when making changes.
@ -457,7 +463,8 @@ math_sum(PyObject *self, PyObject *seq)
{ {
PyObject *item, *iter, *sum = NULL; PyObject *item, *iter, *sum = NULL;
Py_ssize_t i, j, n = 0, m = NUM_PARTIALS; 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); iter = PyObject_GetIter(seq);
if (iter == NULL) if (iter == NULL)
@ -483,10 +490,12 @@ math_sum(PyObject *self, PyObject *seq)
for (i = j = 0; j < n; j++) { /* for y in partials */ for (i = j = 0; j < n; j++) { /* for y in partials */
y = p[j]; y = p[j];
if (fabs(x) < fabs(y)) {
t = x; x = y; y = t;
}
hi = x + y; hi = x + y;
lo = fabs(x) < fabs(y) yr = hi - x;
? x - (hi - y) lo = y - yr;
: y - (hi - x);
if (lo != 0.0) if (lo != 0.0)
p[i++] = lo; p[i++] = lo;
x = hi; x = hi;
@ -506,38 +515,41 @@ math_sum(PyObject *self, PyObject *seq)
} }
} }
hi = 0.0;
if (n > 0) { if (n > 0) {
hi = p[--n]; hi = p[--n];
if (Py_IS_FINITE(hi)) { if (Py_IS_FINITE(hi)) {
/* sum_exact(ps, hi) from the top, stop when the sum becomes inexact. */ /* sum_exact(ps, hi) from the top, stop when the sum becomes inexact. */
while (n > 0) { while (n > 0) {
x = p[--n]; x = hi;
y = hi; y = p[--n];
assert(fabs(y) < fabs(x));
hi = x + y; hi = x + y;
assert(fabs(x) < fabs(y)); yr = hi - x;
lo = x - (hi - y); lo = y - yr;
if (lo != 0.0) if (lo != 0.0)
break; break;
} }
/* Little dance to allow half-even rounding across multiple partials. /* Make half-even rounding work across multiple partials. Needed
Needed so that sum([1e-16, 1, 1e16]) will round-up to two instead so that sum([1e-16, 1, 1e16]) will round-up the last digit to
of down to zero (the 1e16 makes the 1 slightly closer to two). */ 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) || if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
(lo > 0.0 && p[n-1] > 0.0))) { (lo > 0.0 && p[n-1] > 0.0))) {
y = lo * 2.0; y = lo * 2.0;
x = hi + y; x = hi + y;
if (y == (x - hi)) yr = x - hi;
if (y == yr)
hi = x; hi = x;
} }
} }
else { /* raise corresponding error */ else { /* raise exception corresponding to a special value */
errno = Py_IS_NAN(hi) ? EDOM : ERANGE; errno = Py_IS_NAN(hi) ? EDOM : ERANGE;
if (is_error(hi)) if (is_error(hi))
goto _sum_error; goto _sum_error;
} }
} }
else /* default */
hi = 0.0;
sum = PyFloat_FromDouble(hi); sum = PyFloat_FromDouble(hi);
_sum_error: _sum_error:

View File

@ -44,6 +44,10 @@
Name="PythonExe" Name="PythonExe"
Value="$(SolutionDir)\python.exe" Value="$(SolutionDir)\python.exe"
/> />
<UserMacro
Name="externalsDir"
Value="..\.."
/>
<UserMacro <UserMacro
Name="bsddbDir" Name="bsddbDir"
Value="$(bsddb44Dir)" Value="$(bsddb44Dir)"
@ -54,7 +58,7 @@
/> />
<UserMacro <UserMacro
Name="bsddb44Dir" Name="bsddb44Dir"
Value="..\..\db-4.4.20\build_win32" Value="$(externalsDir)\db-4.4.20\build_win32"
/> />
<UserMacro <UserMacro
Name="bsddb44DepLibs" Name="bsddb44DepLibs"
@ -62,7 +66,7 @@
/> />
<UserMacro <UserMacro
Name="bsddb45Dir" Name="bsddb45Dir"
Value="..\..\db-4.5.20.x\build_windows" Value="$(externalsDir)\db-4.5.20.x\build_windows"
/> />
<UserMacro <UserMacro
Name="bsddb45DepLibs" Name="bsddb45DepLibs"
@ -70,23 +74,23 @@
/> />
<UserMacro <UserMacro
Name="sqlite3Dir" Name="sqlite3Dir"
Value="..\..\sqlite-source-3.3.4" Value="$(externalsDir)\sqlite-source-3.3.4"
/> />
<UserMacro <UserMacro
Name="bz2Dir" Name="bz2Dir"
Value="..\..\bzip2-1.0.3" Value="$(externalsDir)\bzip2-1.0.3"
/> />
<UserMacro <UserMacro
Name="opensslDir" Name="opensslDir"
Value="..\..\openssl-0.9.8g" Value="$(externalsDir)\openssl-0.9.8g"
/> />
<UserMacro <UserMacro
Name="tcltkDir" Name="tcltkDir"
Value="..\..\tcltk" Value="$(externalsDir)\tcltk"
/> />
<UserMacro <UserMacro
Name="tcltk64Dir" Name="tcltk64Dir"
Value="..\..\tcltk64" Value="$(externalsDir)\tcltk64"
/> />
<UserMacro <UserMacro
Name="tcltkLib" Name="tcltkLib"

View File

@ -54,18 +54,28 @@ int
PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va) PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
{ {
int len; /* # bytes written, excluding \0 */ 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; char *buffer;
#endif #endif
assert(str != NULL); assert(str != NULL);
assert(size > 0); assert(size > 0);
assert(format != NULL); 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 #ifdef HAVE_SNPRINTF
len = vsnprintf(str, size, format, va); len = vsnprintf(str, size, format, va);
#else #else
/* Emulate it. */ /* Emulate it. */
buffer = PyMem_MALLOC(size + 512); buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE);
if (buffer == NULL) { if (buffer == NULL) {
len = -666; len = -666;
goto Done; goto Done;
@ -75,7 +85,7 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
if (len < 0) if (len < 0)
/* ignore the error */; /* 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"); Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");
else { else {
@ -86,8 +96,10 @@ PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
str[to_copy] = '\0'; str[to_copy] = '\0';
} }
PyMem_FREE(buffer); PyMem_FREE(buffer);
Done:
#endif #endif
Done:
if (size > 0)
str[size-1] = '\0'; str[size-1] = '\0';
return len; return len;
#undef _PyOS_vsnprintf_EXTRA_SPACE
} }

View 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, # On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined,
# even though select is a POSIX function. Reported by J. Ribbens. # 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. # 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 define_xopen_source=no
# OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is
# also defined. This can be overridden by defining _BSD_SOURCE # also defined. This can be overridden by defining _BSD_SOURCE
@ -265,6 +265,11 @@ case $ac_sys_system/$ac_sys_release in
Darwin/@<:@789@:>@.*) Darwin/@<:@789@:>@.*)
define_xopen_source=no 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 esac
@ -549,6 +554,10 @@ then
LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";;
Monterey64*) Monterey64*)
LINKCC="$LINKCC -L/usr/lib/ia64l64";; LINKCC="$LINKCC -L/usr/lib/ia64l64";;
QNX*)
# qcc must be used because the other compilers do not
# support -N.
LINKCC=qcc;;
esac esac
fi fi
AC_MSG_RESULT($LINKCC) 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/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/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/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/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 \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \
bluetooth/bluetooth.h linux/tipc.h) bluetooth/bluetooth.h linux/tipc.h)
@ -1517,7 +1526,7 @@ then
fi fi
fi fi
;; ;;
Linux*|GNU*) LDSHARED='$(CC) -shared';; Linux*|GNU*|QNX*) LDSHARED='$(CC) -shared';;
BSD/OS*/4*) LDSHARED="gcc -shared";; BSD/OS*/4*) LDSHARED="gcc -shared";;
FreeBSD*) FreeBSD*)
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]] if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
@ -1641,6 +1650,13 @@ then
then then
LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)' LINKFORSHARED='-Wl,--out-implib=$(LDLIBRARY)'
fi;; 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 esac
fi fi
AC_MSG_RESULT($LINKFORSHARED) AC_MSG_RESULT($LINKFORSHARED)

View File

@ -691,6 +691,9 @@
/* Define to 1 if you have the <sys/stat.h> header file. */ /* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H #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. */ /* Define to 1 if you have the <sys/times.h> header file. */
#undef HAVE_SYS_TIMES_H #undef HAVE_SYS_TIMES_H

View File

@ -939,7 +939,7 @@ class PyBuildExt(build_ext):
missing.append('resource') missing.append('resource')
# Sun yellow pages. Some systems have the functions in libc. # 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')): if (self.compiler.find_library_file(lib_dirs, 'nsl')):
libs = ['nsl'] libs = ['nsl']
else: else: