/* mark all pending requests as dead - called when a socket error happens */ static void wrepl_socket_dead(struct wrepl_socket *wrepl_socket, NTSTATUS status) { wrepl_socket->dead = True; if (wrepl_socket->packet) { packet_recv_disable(wrepl_socket->packet); packet_set_fde(wrepl_socket->packet, NULL); packet_set_socket(wrepl_socket->packet, NULL); } if (wrepl_socket->event.fde) { talloc_free(wrepl_socket->event.fde); wrepl_socket->event.fde = NULL; } if (wrepl_socket->sock) { talloc_free(wrepl_socket->sock); wrepl_socket->sock = NULL; } if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) { status = NT_STATUS_UNEXPECTED_NETWORK_ERROR; } while (wrepl_socket->recv_queue) { struct wrepl_request *req = wrepl_socket->recv_queue; DLIST_REMOVE(wrepl_socket->recv_queue, req); wrepl_request_finished(req, status); } talloc_set_destructor(wrepl_socket, NULL); if (wrepl_socket->free_skipped) { talloc_free(wrepl_socket); } }
/* handle recv events */ static NTSTATUS wrepl_finish_recv(void *private_data, DATA_BLOB packet_blob_in) { struct wrepl_socket *wrepl_socket = talloc_get_type(private_data, struct wrepl_socket); struct wrepl_request *req = wrepl_socket->recv_queue; DATA_BLOB blob; enum ndr_err_code ndr_err; if (!req) { DEBUG(1,("Received unexpected WINS packet of length %u!\n", (unsigned)packet_blob_in.length)); return NT_STATUS_INVALID_NETWORK_RESPONSE; } req->packet = talloc(req, struct wrepl_packet); NT_STATUS_HAVE_NO_MEMORY(req->packet); blob.data = packet_blob_in.data + 4; blob.length = packet_blob_in.length - 4; /* we have a full request - parse it */ ndr_err = ndr_pull_struct_blob(&blob, req->packet, wrepl_socket->iconv_convenience, req->packet, (ndr_pull_flags_fn_t)ndr_pull_wrepl_packet); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { NTSTATUS status = ndr_map_error2ntstatus(ndr_err); wrepl_request_finished(req, status); return NT_STATUS_OK; } if (DEBUGLVL(10)) { DEBUG(10,("Received WINS packet of length %u\n", (unsigned)packet_blob_in.length)); NDR_PRINT_DEBUG(wrepl_packet, req->packet); } wrepl_request_finished(req, NT_STATUS_OK); return NT_STATUS_OK; }