def close(self): log("%s.close()", self) ph = self.pipe_handle if not ph: return self.pipe_handle = None def _close_err(fn, e): l = log.error try: code = e[0] except (IndexError, TypeError): #python3? code = 0 if code == ERROR_PIPE_NOT_CONNECTED: l = log.debug l("Error: %s(%s) %i: %s", fn, ph, code, e) try: FlushFileBuffers(ph) except Exception as e: _close_err("FlushFileBuffers", e) try: DisconnectNamedPipe(ph) except Exception as e: _close_err("DisconnectNamedPipe", e) try: CloseHandle(ph) except Exception as e: _close_err("CloseHandle", e)
def _pipe_write(self, buf): size = len(buf) log("pipe_write: %i bytes", size) #binascii.hexlify(buf)) written = c_ulong(0) r = WriteFile(self.pipe_handle, c_char_p(buf), len(buf), byref(written), byref(self.write_overlapped)) log("WriteFile(..)=%s, len=%i", r, written.value) if not r and self.pipe_handle: e = GetLastError() if e != ERROR_IO_PENDING: log("WriteFile: %s", IO_ERROR_STR.get(e, e)) r = WaitForSingleObject(self.write_event, INFINITE) log("WaitForSingleObject(..)=%s, len=%i", WAIT_STR.get(r, r), written.value) if not self.pipe_handle: #closed already! return written.value if r: raise Exception( "failed to write buffer to named pipe handle %s" % self.pipe_handle) if self.pipe_handle: if not GetOverlappedResult(self.pipe_handle, byref(self.write_overlapped), byref(written), False): e = GetLastError() raise Exception("overlapped write failed: %s" % IO_ERROR_STR.get(e, e)) log("pipe_write: %i bytes written", written.value) if self.pipe_handle: FlushFileBuffers(self.pipe_handle) #SetFilePointer(self.pipe_handle, 0, FILE_BEGIN) return written.value