From a8d912827a946a951a071da52d6539643917cbcf Mon Sep 17 00:00:00 2001 From: Daira Hopwood Date: Tue, 27 Oct 2015 14:47:11 +0000 Subject: [PATCH] Improve all of the Windows-specific error reporting. Also make the Windows function declarations more readable and consistent. Signed-off-by: Daira Hopwood --- src/allmydata/util/fileutil.py | 25 ++++++++++++++++--------- src/allmydata/windows/inotify.py | 26 +++++++++++++++++--------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/allmydata/util/fileutil.py b/src/allmydata/util/fileutil.py index 29e6d1b1..1133c261 100644 --- a/src/allmydata/util/fileutil.py +++ b/src/allmydata/util/fileutil.py @@ -521,8 +521,10 @@ def get_available_space(whichdir, reserved_space): if sys.platform == "win32": # - CreateFileW = WINFUNCTYPE(HANDLE, LPCWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE) \ - (("CreateFileW", windll.kernel32)) + CreateFileW = WINFUNCTYPE( + HANDLE, LPCWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE, + use_last_error=True + )(("CreateFileW", windll.kernel32)) GENERIC_WRITE = 0x40000000 FILE_SHARE_READ = 0x00000001 @@ -531,10 +533,16 @@ if sys.platform == "win32": INVALID_HANDLE_VALUE = 0xFFFFFFFF # - FlushFileBuffers = WINFUNCTYPE(BOOL, HANDLE)(("FlushFileBuffers", windll.kernel32)) + FlushFileBuffers = WINFUNCTYPE( + BOOL, HANDLE, + use_last_error=True + )(("FlushFileBuffers", windll.kernel32)) # - CloseHandle = WINFUNCTYPE(BOOL, HANDLE)(("CloseHandle", windll.kernel32)) + CloseHandle = WINFUNCTYPE( + BOOL, HANDLE, + use_last_error=True + )(("CloseHandle", windll.kernel32)) # def flush_volume(path): @@ -549,10 +557,10 @@ if sys.platform == "win32": None ) if hVolume == INVALID_HANDLE_VALUE: - raise WinError() + raise WinError(get_last_error()) if FlushFileBuffers(hVolume) == 0: - raise WinError() + raise WinError(get_last_error()) CloseHandle(hVolume) else: @@ -575,10 +583,9 @@ def reraise(wrapper): if sys.platform == "win32": # ReplaceFileW = WINFUNCTYPE( - BOOL, - LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID, + BOOL, LPCWSTR, LPCWSTR, LPCWSTR, DWORD, LPVOID, LPVOID, use_last_error=True - )(("ReplaceFileW", windll.kernel32)) + )(("ReplaceFileW", windll.kernel32)) REPLACEFILE_IGNORE_MERGE_ERRORS = 0x00000002 diff --git a/src/allmydata/windows/inotify.py b/src/allmydata/windows/inotify.py index 1a719f9a..c5099ca4 100644 --- a/src/allmydata/windows/inotify.py +++ b/src/allmydata/windows/inotify.py @@ -23,15 +23,18 @@ from allmydata.util.encodingutil import quote_output from allmydata.util import log, fileutil from allmydata.util.pollmixin import PollMixin -from ctypes import WINFUNCTYPE, WinError, windll, POINTER, byref, create_string_buffer, addressof +from ctypes import WINFUNCTYPE, WinError, windll, POINTER, byref, create_string_buffer, \ + addressof, get_last_error from ctypes.wintypes import BOOL, HANDLE, DWORD, LPCWSTR, LPVOID # FILE_LIST_DIRECTORY = 1 # -CreateFileW = WINFUNCTYPE(HANDLE, LPCWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE) \ - (("CreateFileW", windll.kernel32)) +CreateFileW = WINFUNCTYPE( + HANDLE, LPCWSTR, DWORD, DWORD, LPVOID, DWORD, DWORD, HANDLE, + use_last_error=True +)(("CreateFileW", windll.kernel32)) FILE_SHARE_READ = 0x00000001 FILE_SHARE_WRITE = 0x00000002 @@ -42,11 +45,16 @@ OPEN_EXISTING = 3 FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 # -CloseHandle = WINFUNCTYPE(BOOL, HANDLE)(("CloseHandle", windll.kernel32)) +CloseHandle = WINFUNCTYPE( + BOOL, HANDLE, + use_last_error=True +)(("CloseHandle", windll.kernel32)) # -ReadDirectoryChangesW = WINFUNCTYPE(BOOL, HANDLE, LPVOID, DWORD, BOOL, DWORD, POINTER(DWORD), LPVOID, LPVOID) \ - (("ReadDirectoryChangesW", windll.kernel32)) +ReadDirectoryChangesW = WINFUNCTYPE( + BOOL, HANDLE, LPVOID, DWORD, BOOL, DWORD, POINTER(DWORD), LPVOID, LPVOID, + use_last_error=True +)(("ReadDirectoryChangesW", windll.kernel32)) FILE_NOTIFY_CHANGE_FILE_NAME = 0x00000001 FILE_NOTIFY_CHANGE_DIR_NAME = 0x00000002 @@ -121,7 +129,7 @@ class FileNotifyInformation(object): None # NULL -> no completion routine ) if r == 0: - raise WinError() + raise WinError(get_last_error()) self.data = self.buffer.raw[:bytes_returned.value] def __iter__(self): @@ -157,8 +165,8 @@ def _open_directory(path_u): None # no template file ) if hDirectory == INVALID_HANDLE_VALUE: - e = WinError() - raise OSError("Opening directory %s gave Windows error %r: %s" % (quote_output(path_u), e.args[0], e.args[1])) + e = WinError(get_last_error()) + raise OSError("Opening directory %s gave WinError: %s" % (quote_output(path_u), e)) return hDirectory -- 2.45.2