]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
- #119833 - close socket in smtplib if there was an error connecting
authorMoshe Zadka <moshez@math.huji.ac.il>
Sat, 31 Mar 2001 09:12:51 +0000 (09:12 +0000)
committerMoshe Zadka <moshez@math.huji.ac.il>
Sat, 31 Mar 2001 09:12:51 +0000 (09:12 +0000)
- #126863 - getopt long option handling fixed

Lib/getopt.py
Lib/smtplib.py
Misc/NEWS

index a6ddf44bb05b1982928b0febb2b3c505a33cd7f9..a8ad645bee6480a371883beba1d424bf83a93013 100644 (file)
@@ -65,8 +65,7 @@ def getopt(args, shortopts, longopts = []):
         longopts = [longopts]
     else:
         longopts = list(longopts)
-    longopts.sort()
-    while args and args[0][:1] == '-' and args[0] != '-':
+    while args and args[0].startswith('-') and args[0] != '-':
         if args[0] == '--':
             args = args[1:]
             break
@@ -80,9 +79,10 @@ def getopt(args, shortopts, longopts = []):
 def do_longs(opts, opt, longopts, args):
     try:
         i = opt.index('=')
-        opt, optarg = opt[:i], opt[i+1:]
     except ValueError:
         optarg = None
+    else:
+        opt, optarg = opt[:i], opt[i+1:]
 
     has_arg, opt = long_has_args(opt, longopts)
     if has_arg:
@@ -99,18 +99,25 @@ def do_longs(opts, opt, longopts, args):
 #   has_arg?
 #   full option name
 def long_has_args(opt, longopts):
-    optlen = len(opt)
-    for i in range(len(longopts)):
-        x, y = longopts[i][:optlen], longopts[i][optlen:]
-        if opt != x:
-            continue
-        if y != '' and y != '=' and i+1 < len(longopts):
-            if opt == longopts[i+1][:optlen]:
-                raise GetoptError('option --%s not a unique prefix' % opt, opt)
-        if longopts[i][-1:] in ('=', ):
-            return 1, longopts[i][:-1]
-        return 0, longopts[i]
-    raise GetoptError('option --%s not recognized' % opt, opt)
+    possibilities = [o for o in longopts if o.startswith(opt)]
+    if not possibilities:
+        raise GetoptError('option --%s not recognized' % opt, opt)
+    # Is there an exact match?
+    if opt in possibilities:
+        return 0, opt
+    elif opt + '=' in possibilities:
+        return 1, opt
+    # No exact match, so better be unique.
+    if len(possibilities) > 1:
+        # XXX since possibilities contains all valid continuations, might be
+        # nice to work them into the error msg
+        raise GetoptError('option --%s not a unique prefix' % opt, opt)
+    assert len(possibilities) == 1
+    unique_match = possibilities[0]
+    has_arg = unique_match.endswith('=')
+    if has_arg:
+        unique_match = unique_match[:-1]
+    return has_arg, unique_match
 
 def do_shorts(opts, optstring, shortopts, args):
     while optstring != '':
index 6536371846be50e888f101c9bf5b5cce18f0d454..77cd22304cf7fd2ae141a881d49e074771ca09e0 100755 (executable)
@@ -214,7 +214,11 @@ class SMTP:
         if not port: port = SMTP_PORT
         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         if self.debuglevel > 0: print 'connect:', (host, port)
-        self.sock.connect((host, port))
+        try:
+            self.sock.connect((host, port))
+        except socket.error:
+            self.close()
+            raise
         (code,msg)=self.getreply()
         if self.debuglevel >0 : print "connect:", msg
         return (code,msg)
index 7bc5b56b17eeb51d42b3816a059f2990052cf406..6b4b13432cda8d5ce3008733058e70754c83ca83 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -85,6 +85,13 @@ http://sourceforge.net/tracker/index.php?func=detail&aid=<id>&group_id=5470&atid
 
 - #233200 - cPickle did not use Py_BEGIN_ALLOW_THREADS.
 
+- #125452 - shlex.shlex hungs when it encounters a string with an unmatched 
+            quote
+
+- #119833 - close socket in smtplib if there was an error connecting
+
+- #126863 - getopt long option handling fixed
+
 What's New in Python 2.0?
 =========================