~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ftp.py

merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
import os
32
32
import urllib
33
33
import urlparse
 
34
import select
34
35
import stat
35
36
import threading
36
37
import time
47
48
    split_url,
48
49
    Transport,
49
50
    )
 
51
from bzrlib.transport.local import LocalURLServer
50
52
import bzrlib.ui
51
53
 
52
54
_have_medusa = False
550
552
        """This is used by medusa.ftp_server to log connections, etc."""
551
553
        self.logs.append(message)
552
554
 
553
 
    def setUp(self):
554
 
 
 
555
    def setUp(self, vfs_server=None):
555
556
        if not _have_medusa:
556
557
            raise RuntimeError('Must have medusa to run the FtpServer')
557
558
 
 
559
        assert vfs_server is None or isinstance(vfs_server, LocalURLServer), \
 
560
            "FtpServer currently assumes local transport, got %s" % vfs_server
 
561
 
558
562
        self._root = os.getcwdu()
559
563
        self._ftp_server = _ftp_server(
560
564
            authorizer=_test_authorizer(root=self._root),
566
570
        self._port = self._ftp_server.getsockname()[1]
567
571
        # Don't let it loop forever, or handle an infinite number of requests.
568
572
        # In this case it will run for 100s, or 1000 requests
569
 
        self._async_thread = threading.Thread(target=asyncore.loop,
 
573
        self._async_thread = threading.Thread(
 
574
                target=FtpServer._asyncore_loop_ignore_EBADF,
570
575
                kwargs={'timeout':0.1, 'count':1000})
571
576
        self._async_thread.setDaemon(True)
572
577
        self._async_thread.start()
578
583
        asyncore.close_all()
579
584
        self._async_thread.join()
580
585
 
 
586
    @staticmethod
 
587
    def _asyncore_loop_ignore_EBADF(*args, **kwargs):
 
588
        """Ignore EBADF during server shutdown.
 
589
 
 
590
        We close the socket to get the server to shutdown, but this causes
 
591
        select.select() to raise EBADF.
 
592
        """
 
593
        try:
 
594
            asyncore.loop(*args, **kwargs)
 
595
        except select.error, e:
 
596
            if e.args[0] != errno.EBADF:
 
597
                raise
 
598
 
581
599
 
582
600
_ftp_channel = None
583
601
_ftp_server = None