* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: update.c,v 1.78 2000/12/16 00:58:01 gson Exp $ */
+/* $Id: update.c,v 1.79 2000/12/28 01:29:09 marka Exp $ */
#include <config.h>
ISC_EVENT_COMMON(update_event_t);
dns_zone_t *zone;
isc_result_t result;
-
+ dns_message_t *answer;
};
/**************************************************************************/
static void update_action(isc_task_t *task, isc_event_t *event);
static void updatedone_action(isc_task_t *task, isc_event_t *event);
static isc_result_t send_forward_event(ns_client_t *client, dns_zone_t *zone);
+static void forward_done(isc_task_t *task, isc_event_t *event);
/**************************************************************************/
/*
*/
static void
-forward_fail(ns_client_t *client, isc_result_t result) {
- UNUSED(result);
+forward_fail(isc_task_t *task, isc_event_t *event) {
+ ns_client_t *client = (ns_client_t *)event->ev_arg;
+
+ UNUSED(task);
+
respond(client, DNS_R_SERVFAIL);
+ ns_client_detach(&client);
+ isc_event_free((isc_event_t **)&event);
}
+
static void
forward_callback(void *arg, isc_result_t result, dns_message_t *answer) {
- ns_client_t *client = arg;
+ update_event_t *uev = arg;
+ ns_client_t *client = uev->ev_arg;
- if (result != ISC_R_SUCCESS)
- forward_fail(client, result);
- else
- ns_client_sendraw(client, answer);
+ if (result != ISC_R_SUCCESS) {
+ INSIST(answer == NULL);
+ uev->ev_type = DNS_EVENT_UPDATEDONE;
+ uev->ev_action = forward_fail;
+ } else {
+ uev->ev_type = DNS_EVENT_UPDATEDONE;
+ uev->ev_action = forward_done;
+ uev->answer = answer;
+ }
+ isc_task_send(client->task, (isc_event_t**)&uev);
+}
+
+static void
+forward_done(isc_task_t *task, isc_event_t *event) {
+ update_event_t *uev = (update_event_t *) event;
+ ns_client_t *client = (ns_client_t *)event->ev_arg;
+
+ UNUSED(task);
+
+ ns_client_sendraw(client, uev->answer);
+ dns_message_destroy(&uev->answer);
+ isc_event_free((isc_event_t **)&event);
ns_client_detach(&client);
}
isc_result_t result;
result = dns_zone_forwardupdate(zone, client->message,
- forward_callback, client);
+ forward_callback, event);
if (result != ISC_R_SUCCESS) {
- forward_fail(client, result);
- ns_client_detach(&client);
+ uev->ev_type = DNS_EVENT_UPDATEDONE;
+ uev->ev_action = forward_fail;
+ isc_task_send(client->task, &event);
}
dns_zone_detach(&zone);
- isc_event_free(&event);
isc_task_detach(&task);
}
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: zone.h,v 1.94 2000/12/13 00:15:39 tale Exp $ */
+/* $Id: zone.h,v 1.95 2000/12/28 01:29:08 marka Exp $ */
#ifndef DNS_ZONE_H
#define DNS_ZONE_H 1
* Forward 'msg' to each master in turn until we get an answer or we
* have exausted the list of masters. 'callback' will be called with
* ISC_R_SUCCESS if we get an answer and the returned message will be
- * passed, otherwise a non ISC_R_SUCCESS result code will be passed and
- * msg will be NULL.
+ * passed as 'answer_message', otherwise a non ISC_R_SUCCESS result code
+ * will be passed and answer_message will be NULL. The callback function
+ * is responsible for destroying 'answer_message'.
* (callback)(callback_arg, result, answer_message);
*
* Require: