def callback(): if token.CompletionToken.Status: self._accept_queue.append( (False, token.CompletionToken.Status)) else: self._accept_queue.append((True, token.NewChildHandle)) self._accept_running = False self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event))
def callback(): if token.CompletionToken.Status: if token.CompletionToken.Status == efi.EFI_CONNECTION_FIN: self._recv_shutdown = True else: self._recv_queue.append(token.CompletionToken.Status) else: if sizeof(buf) != rx.DataLength: resize(buf, rx.DataLength) self._recv_queue.append(buf) self._recv_running = False self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event))
def sendall(self, data, flags=0): """sendall(data[, flags]) Send a data string to the socket. For the optional flags argument, see the Unix manual. This calls send() repeatedly until all data is sent. If an error occurs, it's impossible to tell how much data has been sent.""" if isinstance(data, memoryview): data = data.tobytes() # ctypes can't handle memoryview directly data = (c_uint8 * len(data)).from_buffer_copy(data) tx = efi.EFI_TCP4_TRANSMIT_DATA() tx.DataLength = len(data) tx.FragmentCount = 1 tx.FragmentTable[0].FragmentLength = len(data) tx.FragmentTable[0].FragmentBuffer = cast(data, c_void_p) token = efi.EFI_TCP4_IO_TOKEN() send_status = [] def callback(): _ = data, tx # Reference objects EFI will access, to keep them alive send_status.append(token.CompletionToken.Status) self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event)) token.CompletionToken.Event = self._events.create_event( callback, abort=self._abort) token.Packet.TxData = pointer(tx) status = self._tcp4.Transmit(self._tcp4, byref(token)) if status: self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event)) efi.check_status(status) return while not send_status: self._poll() efi.check_status(send_status[0])
def close(self): """"close() Close the socket. It cannot be used after this call.""" if hasattr(self, "closed") and self.closed: return token = efi.EFI_TCP4_CLOSE_TOKEN() def callback(): if token.CompletionToken.Status: print("EFI_TCP4_PROTOCOL Close completed with an error:") print(efi.EFIException(token.CompletionToken.Status)) self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event)) token.CompletionToken.Event = self._events.create_event( callback, abort=self._abort) token.AbortOnClose = False status = self._tcp4.Close(self._tcp4, byref(token)) if status: self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event)) efi.check_status(status) self.closed = True
def callback(): _ = data, tx # Reference objects EFI will access, to keep them alive send_status.append(token.CompletionToken.Status) self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event))
def callback(): self._connect_status = token.CompletionToken.Status self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event))
def callback(): if token.CompletionToken.Status: print("EFI_TCP4_PROTOCOL Close completed with an error:") print(efi.EFIException(token.CompletionToken.Status)) self._events.close_event(efi.EFI_EVENT( token.CompletionToken.Event))