diff --git a/lib/ns/client.c b/lib/ns/client.c index 03975f6640..47270e9a30 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -1048,6 +1048,49 @@ ns_client_sendraw(ns_client_t *client, dns_message_t *message) { ns_client_next(client, result); } +static void +client_pseudosend(ns_client_t *client, uint16_t id) { + isc_result_t result; + unsigned char *data; + isc_buffer_t buffer; + isc_buffer_t tcpbuffer; + isc_region_t r; + unsigned char sendbuf[SEND_BUFFER_SIZE]; + result = client_allocsendbuf(client, &buffer, &tcpbuffer, 0, + sendbuf, &data); + if (result != ISC_R_SUCCESS) { + goto done; + } + + isc_buffer_putuint16(&buffer, id); + isc_buffer_putuint8(&buffer, 0x81); + isc_buffer_putuint8(&buffer, 0x80); + isc_buffer_putuint16(&buffer, 0); + isc_buffer_putuint16(&buffer, 0); + isc_buffer_putuint16(&buffer, 0); + isc_buffer_putuint16(&buffer, 0); + if (client->sendcb != NULL) { + client->sendcb(&buffer); + } else if (TCP_CLIENT(client)) { + isc_buffer_usedregion(&buffer, &r); + isc_buffer_putuint16(&tcpbuffer, (uint16_t) r.length); + isc_buffer_add(&tcpbuffer, r.length); + result = client_sendpkg(client, &tcpbuffer); + } else { + result = client_sendpkg(client, &buffer); + } + if (result == ISC_R_SUCCESS) { + return; + } +done: + if (client->tcpbuf != NULL) { + isc_mem_put(client->mctx, client->tcpbuf, TCP_BUFFER_SIZE); + client->tcpbuf = NULL; + } + ns_client_next(client, result); + +} + static void client_send(ns_client_t *client) { isc_result_t result; @@ -2346,7 +2389,6 @@ ns__client_request(isc_task_t *task, isc_event_t *event) { } isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr); - #if NS_CLIENT_DROPPORT if (ns_client_dropport(isc_sockaddr_getport(&client->peeraddr)) == DROPPORT_REQUEST) { @@ -2403,6 +2445,8 @@ ns__client_request(isc_task_t *task, isc_event_t *event) { ns_client_next(client, result); return; } + client_pseudosend(client, id); + return; /* * The client object handles requests, not responses.