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:
3
CHANGES
3
CHANGES
@@ -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]
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user