Exemple #1
0
 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))
Exemple #2
0
 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))
Exemple #3
0
    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])
Exemple #4
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
Exemple #5
0
 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))
Exemple #6
0
 def callback():
     self._connect_status = token.CompletionToken.Status
     self._events.close_event(efi.EFI_EVENT(
         token.CompletionToken.Event))
Exemple #7
0
 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))