1135446Strhodes/* 2193149Sdougb * Copyright (C) 2004, 2005, 2007, 2008 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 2000, 2001 Internet Software Consortium. 4135446Strhodes * 5186462Sdougb * Permission to use, copy, modify, and/or distribute this software for any 6135446Strhodes * purpose with or without fee is hereby granted, provided that the above 7135446Strhodes * copyright notice and this permission notice appear in all copies. 8135446Strhodes * 9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11135446Strhodes * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15135446Strhodes * PERFORMANCE OF THIS SOFTWARE. 16135446Strhodes */ 17135446Strhodes 18234010Sdougb/* $Id: lwdnoop.c,v 1.13 2008/01/22 23:28:04 tbox Exp $ */ 19135446Strhodes 20170222Sdougb/*! \file */ 21170222Sdougb 22135446Strhodes#include <config.h> 23135446Strhodes 24135446Strhodes#include <isc/socket.h> 25135446Strhodes#include <isc/util.h> 26135446Strhodes 27135446Strhodes#include <named/types.h> 28135446Strhodes#include <named/lwdclient.h> 29135446Strhodes 30135446Strhodesvoid 31135446Strhodesns_lwdclient_processnoop(ns_lwdclient_t *client, lwres_buffer_t *b) { 32135446Strhodes lwres_nooprequest_t *req; 33135446Strhodes lwres_noopresponse_t resp; 34135446Strhodes isc_result_t result; 35135446Strhodes lwres_result_t lwres; 36135446Strhodes isc_region_t r; 37135446Strhodes lwres_buffer_t lwb; 38135446Strhodes 39135446Strhodes REQUIRE(NS_LWDCLIENT_ISRECVDONE(client)); 40135446Strhodes INSIST(client->byaddr == NULL); 41135446Strhodes 42135446Strhodes req = NULL; 43135446Strhodes 44135446Strhodes result = lwres_nooprequest_parse(client->clientmgr->lwctx, 45135446Strhodes b, &client->pkt, &req); 46135446Strhodes if (result != LWRES_R_SUCCESS) 47186462Sdougb goto send_error; 48135446Strhodes 49135446Strhodes client->pkt.recvlength = LWRES_RECVLENGTH; 50135446Strhodes client->pkt.authtype = 0; /* XXXMLG */ 51135446Strhodes client->pkt.authlength = 0; 52135446Strhodes client->pkt.result = LWRES_R_SUCCESS; 53135446Strhodes 54135446Strhodes resp.datalength = req->datalength; 55135446Strhodes resp.data = req->data; 56135446Strhodes 57135446Strhodes lwres = lwres_noopresponse_render(client->clientmgr->lwctx, &resp, 58135446Strhodes &client->pkt, &lwb); 59135446Strhodes if (lwres != LWRES_R_SUCCESS) 60186462Sdougb goto cleanup_req; 61135446Strhodes 62135446Strhodes r.base = lwb.base; 63135446Strhodes r.length = lwb.used; 64135446Strhodes client->sendbuf = r.base; 65135446Strhodes client->sendlength = r.length; 66135446Strhodes result = ns_lwdclient_sendreply(client, &r); 67135446Strhodes if (result != ISC_R_SUCCESS) 68186462Sdougb goto cleanup_lwb; 69135446Strhodes 70135446Strhodes /* 71135446Strhodes * We can now destroy request. 72135446Strhodes */ 73135446Strhodes lwres_nooprequest_free(client->clientmgr->lwctx, &req); 74135446Strhodes 75135446Strhodes NS_LWDCLIENT_SETSEND(client); 76135446Strhodes 77135446Strhodes return; 78135446Strhodes 79186462Sdougb cleanup_lwb: 80186462Sdougb lwres_context_freemem(client->clientmgr->lwctx, lwb.base, lwb.length); 81135446Strhodes 82186462Sdougb cleanup_req: 83186462Sdougb lwres_nooprequest_free(client->clientmgr->lwctx, &req); 84135446Strhodes 85186462Sdougb send_error: 86135446Strhodes ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE); 87135446Strhodes} 88