Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
 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