static void xfrout_senddone(isc_task_t *task, isc_event_t *event) { isc_socketevent_t *sev = (isc_socketevent_t *)event; xfrout_ctx_t *xfr = (xfrout_ctx_t *)event->ev_arg; isc_result_t evresult = sev->result; UNUSED(task); INSIST(event->ev_type == ISC_SOCKEVENT_SENDDONE); isc_event_free(&event); xfr->sends--; INSIST(xfr->sends == 0); (void)isc_timer_touch(xfr->client->timer); if (xfr->shuttingdown == ISC_TRUE) { xfrout_maybe_destroy(xfr); } else if (evresult != ISC_R_SUCCESS) { xfrout_fail(xfr, evresult, "send"); } else if (xfr->end_of_stream == ISC_FALSE) { sendstream(xfr); } else { /* End of zone transfer stream. */ inc_stats(xfr->zone, dns_nsstatscounter_xfrdone); xfrout_log(xfr, ISC_LOG_INFO, "%s ended", xfr->mnemonic); ns_client_next(xfr->client, ISC_R_SUCCESS); xfrout_ctx_destroy(&xfr); } }
static void xfrout_maybe_destroy(xfrout_ctx_t *xfr) { INSIST(xfr->shuttingdown == ISC_TRUE); if (xfr->sends > 0) { /* * If we are currently sending, cancel it and wait for * cancel event before destroying the context. */ isc_socket_cancel(xfr->client->tcpsocket, xfr->client->task, ISC_SOCKCANCEL_SEND); } else { ns_client_next(xfr->client, ISC_R_CANCELED); xfrout_ctx_destroy(&xfr); } }
static void respond(ns_client_t *client, isc_result_t result) { dns_rcode_t rcode; dns_message_t *message; isc_result_t msg_result; message = client->message; rcode = dns_result_torcode(result); msg_result = dns_message_reply(message, ISC_TRUE); if (msg_result != ISC_R_SUCCESS) msg_result = dns_message_reply(message, ISC_FALSE); if (msg_result != ISC_R_SUCCESS) { ns_client_next(client, msg_result); return; } message->rcode = rcode; if (rcode == dns_rcode_noerror) message->flags |= DNS_MESSAGEFLAG_AA; else message->flags &= ~DNS_MESSAGEFLAG_AA; ns_client_send(client); }