/** * @brief Function to handle the state machine serial data exchange. */ bool nwk_task(void) { /* Rx processing */ if (data_length == 0) { /* No data to process, read the stream IO */ rx_index = 0; data_length = sio2ncp_rx(data, SIO_RX2NCP_BUF_SIZE); } else { /* Data has been received, process the data */ /* Process each single byte */ process_incoming_data(); data_length--; rx_index++; } /* Tx processing */ if (buf_count != 0) { if (sio2ncp_tx(sio_tx_buf[head], (sio_tx_buf[head][1] + 3)) != 0) { head++; head %= SIO_BUF_COUNT; buf_count--; } else { /* @ToDo what happens if none or only a part of the * bytes could be transmitted? */ } } return true; }
static ssize_t write_to_internal_pipe(struct pipes_struct *p, char *data, size_t n) { size_t data_left = n; while(data_left) { ssize_t data_used; DEBUG(10, ("write_to_pipe: data_left = %u\n", (unsigned int)data_left)); data_used = process_incoming_data(p, data, data_left); DEBUG(10, ("write_to_pipe: data_used = %d\n", (int)data_used)); if(data_used < 0) { return -1; } data_left -= data_used; data += data_used; } return n; }
static void named_pipe_packet_process(struct tevent_req *subreq) { struct named_pipe_client *npc = tevent_req_callback_data(subreq, struct named_pipe_client); struct _output_data *out = &npc->p->out_data; DATA_BLOB recv_buffer = data_blob_null; struct ncacn_packet *pkt; NTSTATUS status; ssize_t data_left; ssize_t data_used; char *data; uint32_t to_send; size_t i; bool ok; status = dcerpc_read_ncacn_packet_recv(subreq, npc, &pkt, &recv_buffer); TALLOC_FREE(subreq); if (!NT_STATUS_IS_OK(status)) { goto fail; } data_left = recv_buffer.length; data = (char *)recv_buffer.data; while (data_left) { data_used = process_incoming_data(npc->p, data, data_left); if (data_used < 0) { DEBUG(3, ("Failed to process dceprc request!\n")); status = NT_STATUS_UNEXPECTED_IO_ERROR; goto fail; } data_left -= data_used; data += data_used; } /* Do not leak this buffer, npc is a long lived context */ talloc_free(recv_buffer.data); talloc_free(pkt); /* this is needed because of the way DCERPC Binds work in * the RPC marshalling code */ to_send = out->frag.length - out->current_pdu_sent; if (to_send > 0) { npc->iov = talloc_zero(npc, struct iovec); if (!npc->iov) { status = NT_STATUS_NO_MEMORY; goto fail; } npc->count = 1; npc->iov[0].iov_base = out->frag.data + out->current_pdu_sent; npc->iov[0].iov_len = to_send; out->current_pdu_sent += to_send; }
void Socket::on_read_complete( const boost::system::error_code& error, size_t bytes_transferred ) { if( error ) { OnError( error ); return; } if( bytes_transferred > 0 ) { m_ReadBuffer->wr_ptr( bytes_transferred ); if( !process_incoming_data() ) { CloseSocket(); return; } } start_async_read(); }