Exemplo n.º 1
0
/*
  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);
	}
}
Exemplo n.º 2
0
/*
  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;
}