2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-04 08:35:31 +00:00

2849. [bug] Don't treat errors from the xml2 library as fatal.

[RT #20945]
This commit is contained in:
Mark Andrews
2010-02-04 00:57:25 +00:00
parent db95cc18d8
commit 8ac908b38a
3 changed files with 260 additions and 134 deletions

View File

@@ -1,3 +1,6 @@
2849. [bug] Don't treat errors from the xml2 library as fatal.
[RT #20945]
2848. [doc] Moved README.dnssec, README.libdns, README.pkcs11 and 2848. [doc] Moved README.dnssec, README.libdns, README.pkcs11 and
README.rfc5011 into the ARM. [RT #20899] README.rfc5011 into the ARM. [RT #20899]

View File

@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: statschannel.c,v 1.24 2009/10/20 03:30:07 marka Exp $ */ /* $Id: statschannel.c,v 1.25 2010/02/04 00:57:25 marka Exp $ */
/*! \file */ /*! \file */
@@ -71,6 +71,7 @@ stats_dumparg {
int ncounters; /* used for general statistics */ int ncounters; /* used for general statistics */
int *counterindices; /* used for general statistics */ int *counterindices; /* used for general statistics */
isc_uint64_t *countervalues; /* used for general statistics */ isc_uint64_t *countervalues; /* used for general statistics */
isc_result_t result;
} stats_dumparg_t; } stats_dumparg_t;
static isc_once_t once = ISC_ONCE_INIT; static isc_once_t once = ISC_ONCE_INIT;
@@ -96,6 +97,8 @@ static const char *sockstats_xmldesc[isc_sockstatscounter_max];
#define sockstats_xmldesc NULL #define sockstats_xmldesc NULL
#endif /* HAVE_LIBXML2 */ #endif /* HAVE_LIBXML2 */
#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
/*% /*%
* Mapping arrays to represent statistics counters in the order of our * Mapping arrays to represent statistics counters in the order of our
* preference, regardless of the order of counter indices. For example, * preference, regardless of the order of counter indices. For example,
@@ -438,7 +441,7 @@ generalstat_dump(isc_statscounter_t counter, isc_uint64_t val, void *arg) {
dumparg->countervalues[counter] = val; dumparg->countervalues[counter] = val;
} }
static void static isc_result_t
dump_counters(isc_stats_t *stats, statsformat_t type, void *arg, dump_counters(isc_stats_t *stats, statsformat_t type, void *arg,
const char *category, const char **desc, int ncounters, const char *category, const char **desc, int ncounters,
int *indices, isc_uint64_t *values, int options) int *indices, isc_uint64_t *values, int options)
@@ -449,6 +452,7 @@ dump_counters(isc_stats_t *stats, statsformat_t type, void *arg,
FILE *fp; FILE *fp;
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
xmlTextWriterPtr writer; xmlTextWriterPtr writer;
int xmlrc;
#endif #endif
#ifndef HAVE_LIBXML2 #ifndef HAVE_LIBXML2
@@ -481,31 +485,41 @@ dump_counters(isc_stats_t *stats, statsformat_t type, void *arg,
writer = arg; writer = arg;
if (category != NULL) { if (category != NULL) {
xmlTextWriterStartElement(writer, TRY0(xmlTextWriterStartElement(writer,
ISC_XMLCHAR ISC_XMLCHAR
category); category));
xmlTextWriterStartElement(writer, TRY0(xmlTextWriterStartElement(writer,
ISC_XMLCHAR "name"); ISC_XMLCHAR
xmlTextWriterWriteString(writer, ISC_XMLCHAR "name"));
desc[index]); TRY0(xmlTextWriterWriteString(writer,
xmlTextWriterEndElement(writer); /* name */ ISC_XMLCHAR
desc[index]));
TRY0(xmlTextWriterEndElement(writer)); /* name */
xmlTextWriterStartElement(writer, ISC_XMLCHAR TRY0(xmlTextWriterStartElement(writer,
"counter"); ISC_XMLCHAR
"counter"));
} else { } else {
xmlTextWriterStartElement(writer, ISC_XMLCHAR TRY0(xmlTextWriterStartElement(writer,
desc[index]); ISC_XMLCHAR
desc[index]));
} }
xmlTextWriterWriteFormatString(writer, TRY0(xmlTextWriterWriteFormatString(writer,
"%" ISC_PRINT_QUADFORMAT "%"
"u", value); ISC_PRINT_QUADFORMAT
xmlTextWriterEndElement(writer); /* counter */ "u", value));
TRY0(xmlTextWriterEndElement(writer)); /* counter */
if (category != NULL) if (category != NULL)
xmlTextWriterEndElement(writer); /* category */ TRY0(xmlTextWriterEndElement(writer)); /* category */
#endif #endif
break; break;
} }
} }
return (ISC_R_SUCCESS);
#ifdef HAVE_LIBXML2
error:
return (ISC_R_FAILURE);
#endif
} }
static void static void
@@ -516,6 +530,7 @@ rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
FILE *fp; FILE *fp;
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
xmlTextWriterPtr writer; xmlTextWriterPtr writer;
int xmlrc;
#endif #endif
if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_OTHERTYPE)
@@ -535,22 +550,28 @@ rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
writer = dumparg->arg; writer = dumparg->arg;
xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype"));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr));
xmlTextWriterEndElement(writer); /* name */ TRY0(xmlTextWriterEndElement(writer)); /* name */
xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"));
xmlTextWriterWriteFormatString(writer, TRY0(xmlTextWriterWriteFormatString(writer,
"%" ISC_PRINT_QUADFORMAT "u", "%" ISC_PRINT_QUADFORMAT "u",
val); val));
xmlTextWriterEndElement(writer); /* counter */ TRY0(xmlTextWriterEndElement(writer)); /* counter */
xmlTextWriterEndElement(writer); /* rdtype */ TRY0(xmlTextWriterEndElement(writer)); /* rdtype */
#endif #endif
break; break;
} }
return;
#ifdef HAVE_LIBXML2
error:
dumparg->result = ISC_R_FAILURE;
return;
#endif
} }
static void static void
@@ -562,6 +583,7 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
isc_boolean_t nxrrset = ISC_FALSE; isc_boolean_t nxrrset = ISC_FALSE;
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
xmlTextWriterPtr writer; xmlTextWriterPtr writer;
int xmlrc;
#endif #endif
if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) if ((DNS_RDATASTATSTYPE_ATTR(type) & DNS_RDATASTATSTYPE_ATTR_NXDOMAIN)
@@ -590,22 +612,28 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
writer = dumparg->arg; writer = dumparg->arg;
xmlTextWriterStartElement(writer, ISC_XMLCHAR "rrset"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rrset"));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
xmlTextWriterWriteFormatString(writer, "%s%s", TRY0(xmlTextWriterWriteFormatString(writer, "%s%s",
nxrrset ? "!" : "", typestr); nxrrset ? "!" : "", typestr));
xmlTextWriterEndElement(writer); /* name */ TRY0(xmlTextWriterEndElement(writer)); /* name */
xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"));
xmlTextWriterWriteFormatString(writer, TRY0(xmlTextWriterWriteFormatString(writer,
"%" ISC_PRINT_QUADFORMAT "u", "%" ISC_PRINT_QUADFORMAT "u",
val); val));
xmlTextWriterEndElement(writer); /* counter */ TRY0(xmlTextWriterEndElement(writer)); /* counter */
xmlTextWriterEndElement(writer); /* rrset */ TRY0(xmlTextWriterEndElement(writer)); /* rrset */
#endif #endif
break; break;
} }
return;
#ifdef HAVE_LIBXML2
error:
dumparg->result = ISC_R_FAILURE;
#endif
} }
static void static void
@@ -616,6 +644,7 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
stats_dumparg_t *dumparg = arg; stats_dumparg_t *dumparg = arg;
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
xmlTextWriterPtr writer; xmlTextWriterPtr writer;
int xmlrc;
#endif #endif
isc_buffer_init(&b, codebuf, sizeof(codebuf) - 1); isc_buffer_init(&b, codebuf, sizeof(codebuf) - 1);
@@ -631,30 +660,35 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
writer = dumparg->arg; writer = dumparg->arg;
xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode"));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf));
xmlTextWriterEndElement(writer); /* name */ TRY0(xmlTextWriterEndElement(writer)); /* name */
xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"));
xmlTextWriterWriteFormatString(writer, TRY0(xmlTextWriterWriteFormatString(writer,
"%" ISC_PRINT_QUADFORMAT "u", "%" ISC_PRINT_QUADFORMAT "u",
val); val));
xmlTextWriterEndElement(writer); /* counter */ TRY0(xmlTextWriterEndElement(writer)); /* counter */
xmlTextWriterEndElement(writer); /* opcode */ TRY0(xmlTextWriterEndElement(writer)); /* opcode */
#endif #endif
break; break;
} }
return;
#ifdef HAVE_LIBXML2
error:
dumparg->result = ISC_R_FAILURE;
return;
#endif
} }
#ifdef HAVE_LIBXML2 #ifdef HAVE_LIBXML2
/* XXXMLG below here sucks. */ /* XXXMLG below here sucks. */
#define TRY(a) do { result = (a); INSIST(result == ISC_R_SUCCESS); } while(0);
#define TRY0(a) do { xmlrc = (a); INSIST(xmlrc >= 0); } while(0);
static isc_result_t static isc_result_t
zone_xmlrender(dns_zone_t *zone, void *arg) { zone_xmlrender(dns_zone_t *zone, void *arg) {
@@ -664,49 +698,55 @@ zone_xmlrender(dns_zone_t *zone, void *arg) {
xmlTextWriterPtr writer = arg; xmlTextWriterPtr writer = arg;
isc_stats_t *zonestats; isc_stats_t *zonestats;
isc_uint64_t nsstat_values[dns_nsstatscounter_max]; isc_uint64_t nsstat_values[dns_nsstatscounter_max];
int xmlrc;
isc_result_t result;
xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"));
dns_zone_name(zone, buf, sizeof(buf)); dns_zone_name(zone, buf, sizeof(buf));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR buf); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
rdclass = dns_zone_getclass(zone); rdclass = dns_zone_getclass(zone);
dns_rdataclass_format(rdclass, buf, sizeof(buf)); dns_rdataclass_format(rdclass, buf, sizeof(buf));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdataclass"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdataclass"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR buf); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial"));
if (dns_zone_getserial2(zone, &serial) == ISC_R_SUCCESS) if (dns_zone_getserial2(zone, &serial) == ISC_R_SUCCESS)
xmlTextWriterWriteFormatString(writer, "%u", serial); TRY0(xmlTextWriterWriteFormatString(writer, "%u", serial));
else else
xmlTextWriterWriteString(writer, ISC_XMLCHAR "-"); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "-"));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
zonestats = dns_zone_getrequeststats(zone); zonestats = dns_zone_getrequeststats(zone);
if (zonestats != NULL) { if (zonestats != NULL) {
xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
dump_counters(zonestats, statsformat_xml, writer, NULL, result = dump_counters(zonestats, statsformat_xml, writer, NULL,
nsstats_xmldesc, dns_nsstatscounter_max, nsstats_xmldesc, dns_nsstatscounter_max,
nsstats_index, nsstat_values, nsstats_index, nsstat_values,
ISC_STATSDUMP_VERBOSE); ISC_STATSDUMP_VERBOSE);
xmlTextWriterEndElement(writer); /* counters */ if (result != ISC_R_SUCCESS)
goto error;
TRY0(xmlTextWriterEndElement(writer)); /* counters */
} }
xmlTextWriterEndElement(writer); /* zone */ TRY0(xmlTextWriterEndElement(writer)); /* zone */
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
error:
return (ISC_R_FAILURE);
} }
static void static isc_result_t
generatexml(ns_server_t *server, int *buflen, xmlChar **buf) { generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"]; char boottime[sizeof "yyyy-mm-ddThh:mm:ssZ"];
char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"]; char nowstr[sizeof "yyyy-mm-ddThh:mm:ssZ"];
isc_time_t now; isc_time_t now;
xmlTextWriterPtr writer; xmlTextWriterPtr writer = NULL;
xmlDocPtr doc; xmlDocPtr doc = NULL;
int xmlrc; int xmlrc;
dns_view_t *view; dns_view_t *view;
stats_dumparg_t dumparg; stats_dumparg_t dumparg;
@@ -715,12 +755,15 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
isc_uint64_t resstat_values[dns_resstatscounter_max]; isc_uint64_t resstat_values[dns_resstatscounter_max];
isc_uint64_t zonestat_values[dns_zonestatscounter_max]; isc_uint64_t zonestat_values[dns_zonestatscounter_max];
isc_uint64_t sockstat_values[isc_sockstatscounter_max]; isc_uint64_t sockstat_values[isc_sockstatscounter_max];
isc_result_t result;
isc_time_now(&now); isc_time_now(&now);
isc_time_formatISO8601(&ns_g_boottime, boottime, sizeof boottime); isc_time_formatISO8601(&ns_g_boottime, boottime, sizeof boottime);
isc_time_formatISO8601(&now, nowstr, sizeof nowstr); isc_time_formatISO8601(&now, nowstr, sizeof nowstr);
writer = xmlNewTextWriterDoc(&doc, 0); writer = xmlNewTextWriterDoc(&doc, 0);
if (writer == NULL)
goto error;
TRY0(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL)); TRY0(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL));
TRY0(xmlTextWriterWritePI(writer, ISC_XMLCHAR "xml-stylesheet", TRY0(xmlTextWriterWritePI(writer, ISC_XMLCHAR "xml-stylesheet",
ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\"")); ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\""));
@@ -744,27 +787,36 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
view = ISC_LIST_HEAD(server->viewlist); view = ISC_LIST_HEAD(server->viewlist);
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views"));
while (view != NULL) { while (view != NULL) {
xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"));
dns_zt_apply(view->zonetable, ISC_FALSE, zone_xmlrender, result = dns_zt_apply(view->zonetable, ISC_TRUE, zone_xmlrender,
writer); writer);
xmlTextWriterEndElement(writer); if (result != ISC_R_SUCCESS)
goto error;
TRY0(xmlTextWriterEndElement(writer));
if (view->resquerystats != NULL) { if (view->resquerystats != NULL) {
dumparg.result = ISC_R_SUCCESS;
dns_rdatatypestats_dump(view->resquerystats, dns_rdatatypestats_dump(view->resquerystats,
rdtypestat_dump, &dumparg, 0); rdtypestat_dump, &dumparg, 0);
if (dumparg.result != ISC_R_SUCCESS)
goto error;
} }
if (view->resstats != NULL) { if (view->resstats != NULL) {
dump_counters(view->resstats, statsformat_xml, writer, result = dump_counters(view->resstats, statsformat_xml,
"resstat", resstats_xmldesc, writer, "resstat",
dns_resstatscounter_max, resstats_index, resstats_xmldesc,
resstat_values, ISC_STATSDUMP_VERBOSE); dns_resstatscounter_max,
resstats_index, resstat_values,
ISC_STATSDUMP_VERBOSE);
if (result != ISC_R_SUCCESS)
goto error;
} }
cachestats = dns_db_getrrsetstats(view->cachedb); cachestats = dns_db_getrrsetstats(view->cachedb);
@@ -775,12 +827,15 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
ISC_XMLCHAR "name", ISC_XMLCHAR "name",
ISC_XMLCHAR ISC_XMLCHAR
dns_cache_getname(view->cache))); dns_cache_getname(view->cache)));
dumparg.result = ISC_R_SUCCESS;
dns_rdatasetstats_dump(cachestats, rdatasetstats_dump, dns_rdatasetstats_dump(cachestats, rdatasetstats_dump,
&dumparg, 0); &dumparg, 0);
if (dumparg.result != ISC_R_SUCCESS)
goto error;
TRY0(xmlTextWriterEndElement(writer)); /* cache */ TRY0(xmlTextWriterEndElement(writer)); /* cache */
} }
xmlTextWriterEndElement(writer); /* view */ TRY0(xmlTextWriterEndElement(writer)); /* view */
view = ISC_LIST_NEXT(view, link); view = ISC_LIST_NEXT(view, link);
} }
@@ -795,44 +850,63 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
TRY0(xmlTextWriterEndElement(writer)); /* taskmgr */ TRY0(xmlTextWriterEndElement(writer)); /* taskmgr */
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server"));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"));
xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr); TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr));
xmlTextWriterEndElement(writer); TRY0(xmlTextWriterEndElement(writer));
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "requests")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "requests"));
dumparg.result = ISC_R_SUCCESS;
dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg, dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg,
0); 0);
xmlTextWriterEndElement(writer); /* requests */ if (dumparg.result != ISC_R_SUCCESS)
goto error;
TRY0(xmlTextWriterEndElement(writer)); /* requests */
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "queries-in")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "queries-in"));
dumparg.result = ISC_R_SUCCESS;
dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump, dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump,
&dumparg, 0); &dumparg, 0);
xmlTextWriterEndElement(writer); /* queries-in */ if (dumparg.result != ISC_R_SUCCESS)
goto error;
TRY0(xmlTextWriterEndElement(writer)); /* queries-in */
dump_counters(server->nsstats, statsformat_xml, writer, result = dump_counters(server->nsstats, statsformat_xml, writer,
"nsstat", nsstats_xmldesc, dns_nsstatscounter_max, "nsstat", nsstats_xmldesc,
nsstats_index, nsstat_values, ISC_STATSDUMP_VERBOSE); dns_nsstatscounter_max,
nsstats_index, nsstat_values,
ISC_STATSDUMP_VERBOSE);
if (result != ISC_R_SUCCESS)
goto error;
dump_counters(server->zonestats, statsformat_xml, writer, "zonestat", result = dump_counters(server->zonestats, statsformat_xml, writer,
zonestats_xmldesc, dns_zonestatscounter_max, "zonestat", zonestats_xmldesc,
zonestats_index, zonestat_values, ISC_STATSDUMP_VERBOSE); dns_zonestatscounter_max, zonestats_index,
zonestat_values, ISC_STATSDUMP_VERBOSE);
if (result != ISC_R_SUCCESS)
goto error;
/* /*
* Most of the common resolver statistics entries are 0, so we don't * Most of the common resolver statistics entries are 0, so we don't
* use the verbose dump here. * use the verbose dump here.
*/ */
dump_counters(server->resolverstats, statsformat_xml, writer, "resstat", result = dump_counters(server->resolverstats, statsformat_xml, writer,
resstats_xmldesc, dns_resstatscounter_max, resstats_index, "resstat", resstats_xmldesc,
resstat_values, 0); dns_resstatscounter_max, resstats_index,
resstat_values, 0);
if (result != ISC_R_SUCCESS)
goto error;
dump_counters(server->sockstats, statsformat_xml, writer, "sockstat", result = dump_counters(server->sockstats, statsformat_xml, writer,
sockstats_xmldesc, isc_sockstatscounter_max, "sockstat", sockstats_xmldesc,
sockstats_index, sockstat_values, ISC_STATSDUMP_VERBOSE); isc_sockstatscounter_max, sockstats_index,
sockstat_values, ISC_STATSDUMP_VERBOSE);
if (result != ISC_R_SUCCESS)
goto error;
xmlTextWriterEndElement(writer); /* server */ TRY0(xmlTextWriterEndElement(writer)); /* server */
TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory")); TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory"));
isc_mem_renderxml(writer); isc_mem_renderxml(writer);
@@ -848,6 +922,14 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 1); xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 1);
xmlFreeDoc(doc); xmlFreeDoc(doc);
return (ISC_R_SUCCESS);
error:
if (writer != NULL)
xmlFreeTextWriter(writer);
if (doc != NULL)
xmlFreeDoc(doc);
return (ISC_R_FAILURE);
} }
static void static void
@@ -866,21 +948,24 @@ render_index(const char *url, const char *querystring, void *arg,
unsigned char *msg; unsigned char *msg;
int msglen; int msglen;
ns_server_t *server = arg; ns_server_t *server = arg;
isc_result_t result;
UNUSED(url); UNUSED(url);
UNUSED(querystring); UNUSED(querystring);
generatexml(server, &msglen, &msg); result = generatexml(server, &msglen, &msg);
*retcode = 200; if (result == ISC_R_SUCCESS) {
*retmsg = "OK"; *retcode = 200;
*mimetype = "text/xml"; *retmsg = "OK";
isc_buffer_reinit(b, msg, msglen); *mimetype = "text/xml";
isc_buffer_add(b, msglen); isc_buffer_reinit(b, msg, msglen);
*freecb = wrap_xmlfree; isc_buffer_add(b, msglen);
*freecb_args = NULL; *freecb = wrap_xmlfree;
*freecb_args = NULL;
}
return (ISC_R_SUCCESS); return (result);
} }
#endif /* HAVE_LIBXML2 */ #endif /* HAVE_LIBXML2 */
@@ -1281,20 +1366,20 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
} }
fprintf(fp, "++ Name Server Statistics ++\n"); fprintf(fp, "++ Name Server Statistics ++\n");
dump_counters(server->nsstats, statsformat_file, fp, NULL, (void) dump_counters(server->nsstats, statsformat_file, fp, NULL,
nsstats_desc, dns_nsstatscounter_max, nsstats_index, nsstats_desc, dns_nsstatscounter_max,
nsstat_values, 0); nsstats_index, nsstat_values, 0);
fprintf(fp, "++ Zone Maintenance Statistics ++\n"); fprintf(fp, "++ Zone Maintenance Statistics ++\n");
dump_counters(server->zonestats, statsformat_file, fp, NULL, (void) dump_counters(server->zonestats, statsformat_file, fp, NULL,
zonestats_desc, dns_zonestatscounter_max, zonestats_desc, dns_zonestatscounter_max,
zonestats_index, zonestat_values, 0); zonestats_index, zonestat_values, 0);
fprintf(fp, "++ Resolver Statistics ++\n"); fprintf(fp, "++ Resolver Statistics ++\n");
fprintf(fp, "[Common]\n"); fprintf(fp, "[Common]\n");
dump_counters(server->resolverstats, statsformat_file, fp, NULL, (void) dump_counters(server->resolverstats, statsformat_file, fp, NULL,
resstats_desc, dns_resstatscounter_max, resstats_index, resstats_desc, dns_resstatscounter_max,
resstat_values, 0); resstats_index, resstat_values, 0);
for (view = ISC_LIST_HEAD(server->viewlist); for (view = ISC_LIST_HEAD(server->viewlist);
view != NULL; view != NULL;
view = ISC_LIST_NEXT(view, link)) { view = ISC_LIST_NEXT(view, link)) {
@@ -1304,9 +1389,9 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
fprintf(fp, "[View: default]\n"); fprintf(fp, "[View: default]\n");
else else
fprintf(fp, "[View: %s]\n", view->name); fprintf(fp, "[View: %s]\n", view->name);
dump_counters(view->resstats, statsformat_file, fp, NULL, (void) dump_counters(view->resstats, statsformat_file, fp, NULL,
resstats_desc, dns_resstatscounter_max, resstats_desc, dns_resstatscounter_max,
resstats_index, resstat_values, 0); resstats_index, resstat_values, 0);
} }
fprintf(fp, "++ Cache DB RRsets ++\n"); fprintf(fp, "++ Cache DB RRsets ++\n");
@@ -1335,9 +1420,9 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
} }
fprintf(fp, "++ Socket I/O Statistics ++\n"); fprintf(fp, "++ Socket I/O Statistics ++\n");
dump_counters(server->sockstats, statsformat_file, fp, NULL, (void) dump_counters(server->sockstats, statsformat_file, fp, NULL,
sockstats_desc, isc_sockstatscounter_max, sockstats_index, sockstats_desc, isc_sockstatscounter_max,
sockstat_values, 0); sockstats_index, sockstat_values, 0);
fprintf(fp, "++ Per Zone Query Statistics ++\n"); fprintf(fp, "++ Per Zone Query Statistics ++\n");
zone = NULL; zone = NULL;
@@ -1358,9 +1443,10 @@ ns_stats_dump(ns_server_t *server, FILE *fp) {
fprintf(fp, " (view: %s)", view->name); fprintf(fp, " (view: %s)", view->name);
fprintf(fp, "]\n"); fprintf(fp, "]\n");
dump_counters(zonestats, statsformat_file, fp, NULL, (void) dump_counters(zonestats, statsformat_file, fp,
nsstats_desc, dns_nsstatscounter_max, NULL, nsstats_desc,
nsstats_index, nsstat_values, 0); dns_nsstatscounter_max,
nsstats_index, nsstat_values, 0);
} }
} }

View File

@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: httpd.c,v 1.16 2008/08/08 05:06:49 marka Exp $ */ /* $Id: httpd.c,v 1.17 2010/02/04 00:57:25 marka Exp $ */
/*! \file */ /*! \file */
@@ -151,6 +151,7 @@ struct isc_httpdmgr {
ISC_LIST(isc_httpdurl_t) urls; /*%< urls we manage */ ISC_LIST(isc_httpdurl_t) urls; /*%< urls we manage */
isc_httpdaction_t *render_404; isc_httpdaction_t *render_404;
isc_httpdaction_t *render_500;
}; };
/*% /*%
@@ -221,6 +222,11 @@ static isc_result_t render_404(const char *, const char *,
unsigned int *, const char **, unsigned int *, const char **,
const char **, isc_buffer_t *, const char **, isc_buffer_t *,
isc_httpdfree_t **, void **); isc_httpdfree_t **, void **);
static isc_result_t render_500(const char *, const char *,
void *,
unsigned int *, const char **,
const char **, isc_buffer_t *,
isc_httpdfree_t **, void **);
static void static void
destroy_client(isc_httpd_t **httpdp) destroy_client(isc_httpd_t **httpdp)
@@ -300,6 +306,7 @@ isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
goto cleanup; goto cleanup;
httpd->render_404 = render_404; httpd->render_404 = render_404;
httpd->render_500 = render_500;
*httpdp = httpd; *httpdp = httpd;
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
@@ -623,6 +630,30 @@ render_404(const char *url, const char *querystring,
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
} }
static isc_result_t
render_500(const char *url, const char *querystring,
void *arg,
unsigned int *retcode, const char **retmsg,
const char **mimetype, isc_buffer_t *b,
isc_httpdfree_t **freecb, void **freecb_args)
{
static char msg[] = "Internal server failure.";
UNUSED(url);
UNUSED(querystring);
UNUSED(arg);
*retcode = 500;
*retmsg = "Internal server failure";
*mimetype = "text/plain";
isc_buffer_reinit(b, msg, strlen(msg));
isc_buffer_add(b, strlen(msg));
*freecb = NULL;
*freecb_args = NULL;
return (ISC_R_SUCCESS);
}
static void static void
isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
{ {
@@ -691,8 +722,14 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev)
&httpd->mimetype, &httpd->bodybuffer, &httpd->mimetype, &httpd->bodybuffer,
&httpd->freecb, &httpd->freecb_arg); &httpd->freecb, &httpd->freecb_arg);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
destroy_client(&httpd); result = httpd->mgr->render_500(httpd->url, httpd->querystring,
goto out; NULL,
&httpd->retcode,
&httpd->retmsg,
&httpd->mimetype,
&httpd->bodybuffer,
&httpd->freecb,
&httpd->freecb_arg);
} }
isc_httpd_response(httpd); isc_httpd_response(httpd);