~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Andrew Bennetts
  • Date: 2010-10-08 04:25:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5472.
  • Revision ID: andrew.bennetts@canonical.com-20101008042510-sg9vdhmnggilzxsk
Fix stray TAB in source.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Robey Pointer <robey@lag.net>
 
1
# Copyright (C) 2006-2010 Robey Pointer <robey@lag.net>
2
2
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
359
359
        # whatever) chunks.
360
360
        try:
361
361
            my_sock, subproc_sock = socket.socketpair()
362
 
            osutils.set_fd_cloexec(my_sock)
363
362
        except (AttributeError, socket.error):
364
363
            # This platform doesn't support socketpair(), so just use ordinary
365
364
            # pipes instead.
366
365
            stdin = stdout = subprocess.PIPE
367
 
            my_sock, subproc_sock = None, None
 
366
            sock = None
368
367
        else:
369
368
            stdin = stdout = subproc_sock
 
369
            sock = my_sock
370
370
        proc = subprocess.Popen(argv, stdin=stdin, stdout=stdout,
371
371
                                **os_specific_subprocess_params())
372
 
        if subproc_sock is not None:
373
 
            subproc_sock.close()
374
 
        return SSHSubprocessConnection(proc, sock=my_sock)
 
372
        return SSHSubprocessConnection(proc, sock=sock)
375
373
 
376
374
    def connect_sftp(self, username, password, host, port):
377
375
        try:
655
653
import weakref
656
654
_subproc_weakrefs = set()
657
655
 
658
 
def _close_ssh_proc(proc, sock):
 
656
def _close_ssh_proc(proc):
659
657
    """Carefully close stdin/stdout and reap the SSH process.
660
658
 
661
659
    If the pipes are already closed and/or the process has already been
662
660
    wait()ed on, that's ok, and no error is raised.  The goal is to do our best
663
661
    to clean up (whether or not a clean up was already tried).
664
662
    """
665
 
    funcs = []
666
 
    for closeable in (proc.stdin, proc.stdout, sock):
667
 
        # We expect that either proc (a subprocess.Popen) will have stdin and
668
 
        # stdout streams to close, or that we will have been passed a socket to
669
 
        # close, with the option not in use being None.
670
 
        if closeable is not None:
671
 
            funcs.append(closeable.close)
672
 
    funcs.append(proc.wait)
673
 
    for func in funcs:
674
 
        try:
675
 
            func()
 
663
    dotted_names = ['stdin.close', 'stdout.close', 'wait']
 
664
    for dotted_name in dotted_names:
 
665
        attrs = dotted_name.split('.')
 
666
        try:
 
667
            obj = proc
 
668
            for attr in attrs:
 
669
                obj = getattr(obj, attr)
 
670
        except AttributeError:
 
671
            # It's ok for proc.stdin or proc.stdout to be None.
 
672
            continue
 
673
        try:
 
674
            obj()
676
675
        except OSError:
677
676
            # It's ok for the pipe to already be closed, or the process to
678
677
            # already be finished.
717
716
        # to avoid leaving processes lingering indefinitely.
718
717
        def terminate(ref):
719
718
            _subproc_weakrefs.remove(ref)
720
 
            _close_ssh_proc(proc, sock)
 
719
            _close_ssh_proc(proc)
721
720
        _subproc_weakrefs.add(weakref.ref(self, terminate))
722
721
 
723
722
    def send(self, data):
733
732
            return os.read(self.proc.stdout.fileno(), count)
734
733
 
735
734
    def close(self):
736
 
        _close_ssh_proc(self.proc, self._sock)
 
735
        _close_ssh_proc(self.proc)
737
736
 
738
737
    def get_sock_or_pipes(self):
739
738
        if self._sock is not None: