summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--paramiko/win_pageant.py18
-rw-r--r--setup.py5
2 files changed, 13 insertions, 10 deletions
diff --git a/paramiko/win_pageant.py b/paramiko/win_pageant.py
index 17d7f5b3..0410a995 100644
--- a/paramiko/win_pageant.py
+++ b/paramiko/win_pageant.py
@@ -23,11 +23,12 @@ Functions for communicating with Pageant, the basic windows ssh agent program.
import struct
import threading
-import mmap
import array
import platform
import ctypes.wintypes
+import jaraco.windows.mmap as mmap
+
_AGENT_COPYDATA_ID = 0x804e50ba
_AGENT_MAX_MSGLEN = 8192
# Note: The WM_COPYDATA value is pulled from win32con, as a workaround
@@ -61,19 +62,21 @@ class COPYDATASTRUCT(ctypes.Structure):
]
def _query_pageant(msg):
+ """
+ Communication with the Pageant process is done through a shared
+ memory-mapped file.
+ """
hwnd = _get_pageant_window_object()
if not hwnd:
# Raise a failure to connect exception, pageant isn't running anymore!
return None
+ # create a name for the mmap
map_name = 'PageantRequest%08x' % threading.current_thread().ident
- # Create the shared memory from which Pageant will read the request
- pymap = mmap.mmap(-1, _AGENT_MAX_MSGLEN, tagname=map_name,
- access=mmap.ACCESS_WRITE)
- try:
+ pymap = mmap.MemoryMap(map_name, _AGENT_MAX_MSGLEN)
+ with pymap:
pymap.write(msg)
-
# Create an array buffer containing the mapped filename
char_buffer = array.array("c", map_name + '\0')
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
@@ -90,9 +93,6 @@ def _query_pageant(msg):
retlen = struct.unpack('>I', datalen)[0]
return datalen + pymap.read(retlen)
return None
- finally:
- pymap.close()
-
class PageantConnection (object):
"""
diff --git a/setup.py b/setup.py
index 73407b03..209fa78f 100644
--- a/setup.py
+++ b/setup.py
@@ -40,7 +40,10 @@ import sys
try:
from setuptools import setup
kw = {
- 'install_requires': 'pycrypto >= 2.1, != 2.4',
+ 'install_requires': [
+ 'pycrypto >= 2.1, != 2.4',
+ 'jaraco.windows >= 2.10, <3.0dev',
+ ],
}
except ImportError:
from distutils.core import setup