#include "syncptr.h"
-#include <isc/event.h>
-#include <isc/eventclass.h>
+#include <isc/async.h>
#include <isc/netaddr.h>
-#include <isc/task.h>
#include <isc/util.h>
#include <dns/byaddr.h>
#include "instance.h"
#include "util.h"
-/* Almost random value. See eventclass.h */
-#define SYNCPTR_WRITE_EVENT (ISC_EVENTCLASS(1025) + 1)
-
/*
* Event used for making changes to reverse zones.
*/
-typedef struct syncptrevent syncptrevent_t;
-struct syncptrevent {
- ISC_EVENT_COMMON(syncptrevent_t);
+typedef struct syncptr syncptr_t;
+struct syncptr {
isc_mem_t *mctx;
dns_zone_t *zone;
dns_diff_t diff;
*
*/
static void
-syncptr_write(isc_task_t *task, isc_event_t *event) {
- syncptrevent_t *pevent = (syncptrevent_t *)event;
+syncptr_write(void *arg) {
+ syncptr_t *syncptr = (syncptr_t *)arg;
dns_dbversion_t *version = NULL;
dns_db_t *db = NULL;
isc_result_t result;
- REQUIRE(event->ev_type == SYNCPTR_WRITE_EVENT);
-
- UNUSED(task);
-
log_write(ISC_LOG_INFO, "ENTER: syncptr_write");
- result = dns_zone_getdb(pevent->zone, &db);
+ result = dns_zone_getdb(syncptr->zone, &db);
if (result != ISC_R_SUCCESS) {
log_write(ISC_LOG_ERROR,
"syncptr_write: dns_zone_getdb -> %s\n",
isc_result_totext(result));
goto cleanup;
}
- result = dns_diff_apply(&pevent->diff, db, version);
+ result = dns_diff_apply(&syncptr->diff, db, version);
if (result != ISC_R_SUCCESS) {
log_write(ISC_LOG_ERROR,
"syncptr_write: dns_diff_apply -> %s\n",
}
dns_db_detach(&db);
}
- dns_zone_detach(&pevent->zone);
- dns_diff_clear(&pevent->diff);
- isc_event_free(&event);
+ dns_zone_detach(&syncptr->zone);
+ dns_diff_clear(&syncptr->diff);
+ isc_mem_putanddetach(&syncptr->mctx, syncptr, sizeof(*syncptr));
}
/*
dns_rdata_ptr_t ptr_struct;
dns_rdata_t ptr_rdata = DNS_RDATA_INIT;
dns_difftuple_t *tp = NULL;
- isc_task_t *task = NULL;
- syncptrevent_t *pevent = NULL;
+ syncptr_t *syncptr = NULL;
dns_fixedname_init(&ptr_name);
DNS_RDATACOMMON_INIT(&ptr_struct, dns_rdatatype_ptr, dns_rdataclass_in);
dns_name_init(&ptr_struct.ptr, NULL);
- pevent = (syncptrevent_t *)isc_event_allocate(
- inst->mctx, inst, SYNCPTR_WRITE_EVENT, syncptr_write, NULL,
- sizeof(syncptrevent_t));
- isc_buffer_init(&pevent->b, pevent->buf, sizeof(pevent->buf));
- dns_fixedname_init(&pevent->ptr_target_name);
+ syncptr = isc_mem_getx(mctx, sizeof(*syncptr), ISC_MEM_ZERO);
+ isc_mem_attach(mctx, &syncptr->mctx);
+ isc_buffer_init(&syncptr->b, syncptr->buf, sizeof(syncptr->buf));
+ dns_fixedname_init(&syncptr->ptr_target_name);
/* Check if reverse zone is managed by this driver */
result = syncptr_find_zone(inst, addr_rdata,
}
/* Reverse zone is managed by this driver, prepare PTR record */
- pevent->zone = NULL;
- dns_zone_attach(ptr_zone, &pevent->zone);
- dns_name_copy(name, dns_fixedname_name(&pevent->ptr_target_name));
- dns_name_clone(dns_fixedname_name(&pevent->ptr_target_name),
+ dns_zone_attach(ptr_zone, &syncptr->zone);
+ dns_name_copy(name, dns_fixedname_name(&syncptr->ptr_target_name));
+ dns_name_clone(dns_fixedname_name(&syncptr->ptr_target_name),
&ptr_struct.ptr);
- dns_diff_init(inst->mctx, &pevent->diff);
+ dns_diff_init(inst->mctx, &syncptr->diff);
result = dns_rdata_fromstruct(&ptr_rdata, dns_rdataclass_in,
dns_rdatatype_ptr, &ptr_struct,
- &pevent->b);
+ &syncptr->b);
if (result != ISC_R_SUCCESS) {
log_write(ISC_LOG_ERROR,
"syncptr: dns_rdata_fromstruct -> %s\n",
isc_result_totext(result));
goto cleanup;
}
- dns_diff_append(&pevent->diff, &tp);
+ dns_diff_append(&syncptr->diff, &tp);
/*
* Send update event to the reverse zone.
* It will be processed asynchronously.
*/
- dns_zone_gettask(ptr_zone, &task);
- isc_task_send(task, (isc_event_t **)&pevent);
+ isc_async_run(dns_zone_getloop(ptr_zone), syncptr_write, syncptr);
+ syncptr = NULL;
cleanup:
if (ptr_zone != NULL) {
if (tp != NULL) {
dns_difftuple_free(&tp);
}
- if (task != NULL) {
- isc_task_detach(&task);
- }
- if (pevent != NULL) {
- isc_event_free((isc_event_t **)&pevent);
+ if (syncptr != NULL) {
+ isc_mem_put(mctx, syncptr, sizeof(*syncptr));
}
return (result);