From 9539076399f963c14b6fa6e5e95e6671cbefb8af Mon Sep 17 00:00:00 2001 From: Moshe Zadka Date: Sat, 31 Mar 2001 09:12:51 +0000 Subject: - #119833 - close socket in smtplib if there was an error connecting - #126863 - getopt long option handling fixed --- Lib/getopt.py | 37 ++++++++++++++++++++++--------------- Lib/smtplib.py | 6 +++++- Misc/NEWS | 7 +++++++ 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Lib/getopt.py b/Lib/getopt.py index a6ddf44..a8ad645 100644 --- a/Lib/getopt.py +++ b/Lib/getopt.py @@ -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 != '': diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 6536371..77cd223 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 7bc5b56..6b4b134 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -85,6 +85,13 @@ http://sourceforge.net/tracker/index.php?func=detail&aid=&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? ========================= -- cgit v0.12