Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/smtpd.py

    r2 r391  
    3535and if remoteport is not given, then 25 is used.
    3636"""
    37 
    38 
    3937
    4038# Overview:
     
    9896
    9997
    100 
    101 
    10298def usage(code, msg=''):
    10399    print >> sys.stderr, __doc__ % globals()
     
    105101        print >> sys.stderr, msg
    106102    sys.exit(code)
    107 
    108 
    109103
    110104
     
    125119        self.__data = ''
    126120        self.__fqdn = socket.getfqdn()
    127         self.__peer = conn.getpeername()
     121        try:
     122            self.__peer = conn.getpeername()
     123        except socket.error, err:
     124            # a race condition  may occur if the other end is closing
     125            # before we can get the peername
     126            self.close()
     127            if err[0] != errno.ENOTCONN:
     128                raise
     129            return
    128130        print >> DEBUGSTREAM, 'Peer:', repr(self.__peer)
    129131        self.push('220 %s %s' % (self.__fqdn, __version__))
     
    272274
    273275
    274 
    275 
    276276class SMTPServer(asyncore.dispatcher):
    277277    def __init__(self, localaddr, remoteaddr):
     
    279279        self._remoteaddr = remoteaddr
    280280        asyncore.dispatcher.__init__(self)
    281         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
    282         # try to re-use a server port if possible
    283         self.set_reuse_addr()
    284         self.bind(localaddr)
    285         self.listen(5)
    286         print >> DEBUGSTREAM, \
    287               '%s started at %s\n\tLocal addr: %s\n\tRemote addr:%s' % (
    288             self.__class__.__name__, time.ctime(time.time()),
    289             localaddr, remoteaddr)
     281        try:
     282            self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
     283            # try to re-use a server port if possible
     284            self.set_reuse_addr()
     285            self.bind(localaddr)
     286            self.listen(5)
     287        except:
     288            # cleanup asyncore.socket_map before raising
     289            self.close()
     290            raise
     291        else:
     292            print >> DEBUGSTREAM, \
     293                  '%s started at %s\n\tLocal addr: %s\n\tRemote addr:%s' % (
     294                self.__class__.__name__, time.ctime(time.time()),
     295                localaddr, remoteaddr)
    290296
    291297    def handle_accept(self):
    292         conn, addr = self.accept()
    293         print >> DEBUGSTREAM, 'Incoming connection from %s' % repr(addr)
    294         channel = SMTPChannel(self, conn, addr)
     298        pair = self.accept()
     299        if pair is not None:
     300            conn, addr = pair
     301            print >> DEBUGSTREAM, 'Incoming connection from %s' % repr(addr)
     302            channel = SMTPChannel(self, conn, addr)
    295303
    296304    # API for "doing something useful with the message"
     
    318326        """
    319327        raise NotImplementedError
    320 
    321 
    322328
    323329
     
    335341            print line
    336342        print '------------ END MESSAGE ------------'
    337 
    338 
    339343
    340344
     
    377381                refused[r] = (errcode, errmsg)
    378382        return refused
    379 
    380 
    381383
    382384
     
    459461
    460462
    461 
    462 
    463463class Options:
    464464    setuid = 1
    465465    classname = 'PureProxy'
    466 
    467 
    468466
    469467
     
    524522
    525523
    526 
    527 
    528524if __name__ == '__main__':
    529525    options = parseargs()
    530526    # Become nobody
     527    classname = options.classname
     528    if "." in classname:
     529        lastdot = classname.rfind(".")
     530        mod = __import__(classname[:lastdot], globals(), locals(), [""])
     531        classname = classname[lastdot+1:]
     532    else:
     533        import __main__ as mod
     534    class_ = getattr(mod, classname)
     535    proxy = class_((options.localhost, options.localport),
     536                   (options.remotehost, options.remoteport))
    531537    if options.setuid:
    532538        try:
     
    544550                  'Cannot setuid "nobody"; try running with -n option.'
    545551            sys.exit(1)
    546     classname = options.classname
    547     if "." in classname:
    548         lastdot = classname.rfind(".")
    549         mod = __import__(classname[:lastdot], globals(), locals(), [""])
    550         classname = classname[lastdot+1:]
    551     else:
    552         import __main__ as mod
    553     class_ = getattr(mod, classname)
    554     proxy = class_((options.localhost, options.localport),
    555                    (options.remotehost, options.remoteport))
    556552    try:
    557553        asyncore.loop()
Note: See TracChangeset for help on using the changeset viewer.