diff options
author | Jeff Forcier <jeff@bitprophet.org> | 2022-05-13 13:49:33 -0400 |
---|---|---|
committer | Jeff Forcier <jeff@bitprophet.org> | 2022-05-13 13:49:33 -0400 |
commit | ab54ef473d5f9cd5f6015987fc065f19671eff91 (patch) | |
tree | d6d537e45d25a9dc537070336e5fffbaf078d679 /paramiko/win_openssh.py | |
parent | 7a768fd8cf873cff7666cf98d15088d4bf2e4c43 (diff) | |
parent | 2f34e302a069a5e47468723253356ea253a1da1a (diff) | |
download | paramiko-ab54ef473d5f9cd5f6015987fc065f19671eff91.tar.gz |
Merge branch '2.10'
Diffstat (limited to 'paramiko/win_openssh.py')
-rw-r--r-- | paramiko/win_openssh.py | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/paramiko/win_openssh.py b/paramiko/win_openssh.py index 5dd71cd4..614b5898 100644 --- a/paramiko/win_openssh.py +++ b/paramiko/win_openssh.py @@ -18,23 +18,39 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os.path +import time PIPE_NAME = r"\\.\pipe\openssh-ssh-agent" def can_talk_to_agent(): - return os.path.exists(PIPE_NAME) + # use os.listdir() instead of os.path.exists(), because os.path.exists() + # uses CreateFileW() API and the pipe cannot be reopen unless the server + # calls DisconnectNamedPipe(). + dir_, name = os.path.split(PIPE_NAME) + name = name.lower() + return any(name == n.lower() for n in os.listdir(dir_)) class OpenSSHAgentConnection: def __init__(self): - self._pipe = open(PIPE_NAME, "rb+", buffering=0) + while True: + try: + self._pipe = os.open(PIPE_NAME, os.O_RDWR | os.O_BINARY) + except OSError as e: + # retry when errno 22 which means that the server has not + # called DisconnectNamedPipe() yet. + if e.errno != 22: + raise + else: + break + time.sleep(0.1) def send(self, data): - return self._pipe.write(data) + return os.write(self._pipe, data) def recv(self, n): - return self._pipe.read(n) + return os.read(self._pipe, n) def close(self): - return self._pipe.close() + return os.close(self._pipe) |