2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 08:05:21 +00:00

implemented idle timeout for outgoing zone transfer

This commit is contained in:
Andreas Gustafsson
1999-12-16 02:59:32 +00:00
parent a8f4de1bf1
commit e8d9413b89

View File

@@ -15,7 +15,7 @@
* SOFTWARE. * SOFTWARE.
*/ */
/* $Id: xfrout.c,v 1.28 1999/12/10 23:58:03 gson Exp $ */ /* $Id: xfrout.c,v 1.29 1999/12/16 02:59:32 gson Exp $ */
#include <config.h> #include <config.h>
@@ -752,7 +752,9 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client,
unsigned int id, dns_name_t *qname, dns_rdatatype_t qtype, unsigned int id, dns_name_t *qname, dns_rdatatype_t qtype,
dns_db_t *db, dns_dbversion_t *ver, dns_db_t *db, dns_dbversion_t *ver,
rrstream_t *stream, dns_tsigkey_t *tsigkey, rrstream_t *stream, dns_tsigkey_t *tsigkey,
dns_rdata_any_tsig_t *lasttsig, unsigned int timeout, dns_rdata_any_tsig_t *lasttsig,
unsigned int maxtime,
unsigned int idletime,
xfrout_ctx_t **xfrp); xfrout_ctx_t **xfrp);
static void sendstream(xfrout_ctx_t *xfr); static void sendstream(xfrout_ctx_t *xfr);
@@ -967,7 +969,8 @@ ns_xfr_start(ns_client_t *client, dns_rdatatype_t reqtype)
CHECK(xfrout_ctx_create(mctx, client, request->id, question_name, CHECK(xfrout_ctx_create(mctx, client, request->id, question_name,
reqtype, db, ver, stream, request->tsigkey, reqtype, db, ver, stream, request->tsigkey,
request->tsig, request->tsig,
2*3600, /* XXX need timeout config option */ dns_zone_getmaxxfrout(zone),
dns_zone_getidleout(zone),
&xfr)); &xfr));
stream = NULL; stream = NULL;
db = NULL; db = NULL;
@@ -1015,14 +1018,15 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id,
dns_name_t *qname, dns_rdatatype_t qtype, dns_name_t *qname, dns_rdatatype_t qtype,
dns_db_t *db, dns_dbversion_t *ver, dns_db_t *db, dns_dbversion_t *ver,
rrstream_t *stream, dns_tsigkey_t *tsigkey, rrstream_t *stream, dns_tsigkey_t *tsigkey,
dns_rdata_any_tsig_t *lasttsig, unsigned int timeout, dns_rdata_any_tsig_t *lasttsig, unsigned int maxtime,
xfrout_ctx_t **xfrp) unsigned int idletime, xfrout_ctx_t **xfrp)
{ {
xfrout_ctx_t *xfr; xfrout_ctx_t *xfr;
dns_result_t result; dns_result_t result;
unsigned int len; unsigned int len;
void *mem; void *mem;
isc_interval_t interval; isc_interval_t maxinterval, idleinterval;
isc_time_t expires;
INSIST(xfrp != NULL && *xfrp == NULL); INSIST(xfrp != NULL && *xfrp == NULL);
xfr = isc_mem_get(mctx, sizeof(*xfr)); xfr = isc_mem_get(mctx, sizeof(*xfr));
@@ -1060,7 +1064,7 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id,
mem = isc_mem_get(mctx, len); mem = isc_mem_get(mctx, len);
if (mem == NULL) { if (mem == NULL) {
result = DNS_R_NOMEMORY; result = DNS_R_NOMEMORY;
goto cleanup; goto failure;
} }
isc_buffer_init(&xfr->buf, mem, len, ISC_BUFFERTYPE_BINARY); isc_buffer_init(&xfr->buf, mem, len, ISC_BUFFERTYPE_BINARY);
@@ -1072,7 +1076,7 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id,
mem = isc_mem_get(mctx, len); mem = isc_mem_get(mctx, len);
if (mem == NULL) { if (mem == NULL) {
result = DNS_R_NOMEMORY; result = DNS_R_NOMEMORY;
goto cleanup; goto failure;
} }
isc_buffer_init(&xfr->txlenbuf, mem, 2, ISC_BUFFERTYPE_BINARY); isc_buffer_init(&xfr->txlenbuf, mem, 2, ISC_BUFFERTYPE_BINARY);
isc_buffer_init(&xfr->txbuf, (char *) mem + 2, len - 2, isc_buffer_init(&xfr->txbuf, (char *) mem + 2, len - 2,
@@ -1080,18 +1084,18 @@ xfrout_ctx_create(isc_mem_t *mctx, ns_client_t *client, unsigned int id,
xfr->txmem = mem; xfr->txmem = mem;
xfr->txmemlen = len; xfr->txmemlen = len;
isc_interval_set(&interval, timeout, 0); isc_interval_set(&maxinterval, maxtime, 0);
result = isc_timer_create(ns_g_timermgr, isc_timertype_once, CHECK(isc_time_nowplusinterval(&expires, &maxinterval));
NULL, &interval, isc_interval_set(&idleinterval, idletime, 0);
xfr->client->task,
xfrout_timeout, xfr, &xfr->timer); CHECK(isc_timer_create(ns_g_timermgr, isc_timertype_once,
if (result != DNS_R_SUCCESS) &expires, &idleinterval,
goto cleanup; xfr->client->task,
xfrout_timeout, xfr, &xfr->timer));
*xfrp = xfr; *xfrp = xfr;
return (DNS_R_SUCCESS); return (DNS_R_SUCCESS);
cleanup: failure:
xfrout_ctx_destroy(&xfr); xfrout_ctx_destroy(&xfr);
return (result); return (result);
} }