summaryrefslogtreecommitdiffstats
path: root/contrib/bind/bin/named/ns_stats.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/bin/named/ns_stats.c')
-rw-r--r--contrib/bind/bin/named/ns_stats.c452
1 files changed, 0 insertions, 452 deletions
diff --git a/contrib/bind/bin/named/ns_stats.c b/contrib/bind/bin/named/ns_stats.c
deleted file mode 100644
index 3c5abb1..0000000
--- a/contrib/bind/bin/named/ns_stats.c
+++ /dev/null
@@ -1,452 +0,0 @@
-#if !defined(lint) && !defined(SABER)
-static const char sccsid[] = "@(#)ns_stats.c 4.10 (Berkeley) 6/27/90";
-static const char rcsid[] = "$Id: ns_stats.c,v 8.34 2001/08/09 13:17:21 marka Exp $";
-#endif /* not lint */
-
-/*
- * Copyright (c) 1986
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-/*
- * Portions Copyright (c) 1996-2000 by Internet Software Consortium.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-#include "port_before.h"
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#include <netinet/in.h>
-#include <arpa/nameser.h>
-#include <arpa/inet.h>
-
-#include <errno.h>
-#include <resolv.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-#include <time.h>
-
-#include <isc/eventlib.h>
-#include <isc/logging.h>
-#include <isc/memcluster.h>
-#include <isc/tree.h>
-
-#include "port_after.h"
-
-#ifdef HAVE_GETRUSAGE /* XXX */
-#include <sys/time.h>
-#include <sys/resource.h>
-#endif
-
-#include "named.h"
-
-static u_long typestats[T_ANY+1];
-static void nameserStats(FILE *);
-static u_int32_t ns_stats_cnt = 0;
-static int ns_stats_disabled = 0;
-
-void
-ns_stats_dumpandclear() {
- time_t timenow = time(NULL);
- FILE *f;
-
- ns_stats();
- if (!(f = fopen(server_options->stats_filename, "a"))) {
- ns_notice(ns_log_statistics, "cannot open stat file, \"%s\"",
- server_options->stats_filename);
- }
- if (f != NULL) {
- (void) fchown(fileno(f), user_id, group_id);
- fprintf(f, "+++ Host Statistics Cleared +++ (%ld) %s",
- (long)timenow, checked_ctime(&timenow));
- (void) my_fclose(f);
- }
- ns_freestats();
-}
-
-void
-ns_stats() {
- time_t timenow = time(NULL);
- FILE *f;
- int i;
-
- ns_notice(ns_log_statistics, "dumping nameserver stats");
-
- if (!(f = fopen(server_options->stats_filename, "a"))) {
- ns_notice(ns_log_statistics, "cannot open stat file, \"%s\"",
- server_options->stats_filename);
- return;
- }
- (void) fchown(fileno(f), user_id, group_id);
-
- fprintf(f, "+++ Statistics Dump +++ (%ld) %s",
- (long)timenow, checked_ctime(&timenow));
- fprintf(f, "%ld\ttime since boot (secs)\n",
- (long)(timenow - boottime));
- fprintf(f, "%ld\ttime since reset (secs)\n",
- (long)(timenow - resettime));
-
- /* query type statistics */
- fprintf(f, "%lu\tUnknown query types\n", (u_long)typestats[0]);
- for (i = 1; i < T_ANY+1; i++)
- fprintf(f, "%lu\t%s queries\n", typestats[i], p_type(i));
-
- /* name server statistics */
- nameserStats(f);
-
- fprintf(f, "--- Statistics Dump --- (%ld) %s",
- (long)timenow, checked_ctime(&timenow));
- (void) my_fclose(f);
-
- /* Now do the memory statistics file */
- if (!(f = fopen(server_options->memstats_filename, "a"))) {
- ns_notice(ns_log_statistics, "cannot open memstat file, \"%s\"",
- server_options->memstats_filename);
- return;
- }
- (void) fchown(fileno(f), user_id, group_id);
-
- fprintf(f, "+++ Memory Statistics Dump +++ (%ld) %s",
- (long)timenow, checked_ctime(&timenow));
-
- fprintf(f, "%ld\ttime since boot (secs)\n",
- (long)(timenow - boottime));
- fprintf(f, "%ld\ttime since reset (secs)\n",
- (long)(timenow - resettime));
-
- fprintf(f, "++ Memory Statistics ++\n");
- memstats(f);
- fprintf(f, "-- Memory Statistics --\n");
-
- fprintf(f, "--- Memory Statistics Dump --- (%ld) %s",
- (long)timenow, checked_ctime(&timenow));
- (void) my_fclose(f);
-
- ns_notice(ns_log_statistics, "done dumping nameserver stats");
-}
-
-void
-qtypeIncr(qtype)
- int qtype;
-{
- if (qtype < T_A || qtype > T_ANY)
- qtype = 0; /* bad type */
- typestats[qtype]++;
-}
-
-static tree *nameserTree;
-static int nameserInit;
-
-static FILE *nameserStatsFile;
-static const char *statNames[nssLast] = {
- "RR", /* sent us an answer */
- "RNXD", /* sent us a negative response */
- "RFwdR", /* sent us a response we had to fwd */
- "RDupR", /* sent us an extra answer */
- "RFail", /* sent us a SERVFAIL */
- "RFErr", /* sent us a FORMERR */
- "RErr", /* sent us some other error */
- "RAXFR", /* sent us an AXFR */
- "RLame", /* sent us a lame delegation */
- "ROpts", /* sent us some IP options */
- "SSysQ", /* sent them a sysquery */
- "SAns", /* sent them an answer */
- "SFwdQ", /* fwdd a query to them */
- "SDupQ", /* sent them a retry */
- "SErr", /* sent failed (in sendto) */
- "RQ", /* sent us a query */
- "RIQ", /* sent us an inverse query */
- "RFwdQ", /* sent us a query we had to fwd */
- "RDupQ", /* sent us a retry */
- "RTCP", /* sent us a query using TCP */
- "SFwdR", /* fwdd a response to them */
- "SFail", /* sent them a SERVFAIL */
- "SFErr", /* sent them a FORMERR */
- "SNaAns", /* sent them a non autoritative answer */
- "SNXD", /* sent them a negative response */
- "RUQ", /* sent us an unapproved query */
- "RURQ", /* sent us an unapproved recursive query */
- "RUXFR", /* sent us an unapproved AXFR or IXFR */
- "RUUpd", /* sent us an unapproved update */
- };
-
-/*
- * Note that addresses in network byte order always have the high byte first.
- * XXX - this is horribly IPv4 dependent, but it's performance critical.
- */
-static int
-nameserCompar(const tree_t t1, const tree_t t2) {
- u_char *p1 = (u_char *)t1, *p2 = (u_char *)t2;
- int i;
-
- for (i = INADDRSZ; i > 0; i--) {
- u_char c1 = *p1++, c2 = *p2++;
-
- if (c1 < c2)
- return (-1);
- if (c1 > c2)
- return (1);
- }
- return (0);
-}
-
-struct nameser *
-nameserFind(addr, flags)
- struct in_addr addr;
- int flags;
-{
- struct nameser dummy;
- struct nameser *ns;
-
- if (!nameserInit) {
- tree_init(&nameserTree);
- nameserInit++;
- ns_stats_cnt = 0;
- ns_stats_disabled = 0;
- }
-
- dummy.addr = addr;
- ns = (struct nameser *)tree_srch(&nameserTree, nameserCompar,
- (tree_t)&dummy);
- if (ns == NULL && (flags & NS_F_INSERT) != 0) {
- if (server_options->max_host_stats != 0 &&
- ns_stats_cnt > server_options->max_host_stats) {
- if (!ns_stats_disabled)
- ns_notice(ns_log_statistics,
- "ns_stats_disabled: %s reached",
- "host-statistics-max");
- ns_stats_disabled = 1;
- return (NULL);
- }
- ns = (struct nameser *)memget(sizeof(struct nameser));
- if (ns == NULL) {
- nomem: if (!haveComplained((u_long)nameserFind, 0))
- ns_notice(ns_log_statistics,
- "nameserFind: memget failed; %s",
- strerror(errno));
- return (NULL);
- }
- memset(ns, 0, sizeof *ns);
- ns->addr = addr;
- if (!tree_add(&nameserTree, nameserCompar, (tree_t)ns, NULL)) {
- int save = errno;
- memput(ns, sizeof *ns);
- errno = save;
- goto nomem;
- }
- ns_stats_cnt++;
- }
- return (ns);
-}
-
-static void
-nameserStatsOut(f, stats)
- FILE *f;
- u_long stats[];
-{
- int i;
- const char *pre = "\t";
-
- for (i = 0; i < (int)nssLast; i++) {
- fprintf(f, "%s%lu", pre, (u_long)stats[i]);
- pre = ((i+1) % 5) ? " " : " ";
- }
- fputc('\n', f);
-}
-
-static void
-nameserStatsHdr(f)
- FILE *f;
-{
- int i;
- const char *pre = "\t";
-
- fprintf(f, "(Legend)\n");
- for (i = 0; i < (int)nssLast; i++) {
- fprintf(f, "%s%s", pre,
- statNames[i] ? statNames[i] : "");
- pre = ((i+1) % 5) ? "\t" : "\n\t";
- }
- fputc('\n', f);
-}
-
-static int
-nameserStatsTravUAR(t)
- tree_t t;
-{
- struct nameser *ns = (struct nameser *)t;
-
- fprintf(nameserStatsFile, "[%s]\n", /* : rtt %u */
- inet_ntoa(ns->addr) /*, ns->rtt*/ );
- nameserStatsOut(nameserStatsFile, ns->stats);
- return (1);
-}
-
-static void
-nameserStats(f)
- FILE *f;
-{
- nameserStatsFile = f;
- fprintf(f, "++ Name Server Statistics ++\n");
- nameserStatsHdr(f);
- fprintf(f, "(Global)\n");
- nameserStatsOut(f, globalStats);
- if (NS_OPTION_P(OPTION_HOSTSTATS)) {
- tree_trav(&nameserTree, nameserStatsTravUAR);
- if (ns_stats_disabled)
- fprintf(f, "++ Host Statistics Incomplete ++\n");
- }
- fprintf(f, "-- Name Server Statistics --\n");
- nameserStatsFile = NULL;
-}
-
-void
-ns_logstats(evContext ctx, void *uap, struct timespec due,
- struct timespec inter)
-{
- char buffer[1024];
- char buffer2[32], header[128];
- time_t timenow = time(NULL);
- int i;
-#ifdef HAVE_GETRUSAGE
- struct rusage usage, childu;
-#endif /*HAVE_GETRUSAGE*/
-
-#ifdef HAVE_GETRUSAGE
-# define tv_float(tv) ((tv).tv_sec + ((tv).tv_usec / 1000000.0))
-
- UNUSED(ctx);
- UNUSED(uap);
- UNUSED(due);
- UNUSED(inter);
-
- getrusage(RUSAGE_SELF, &usage);
- getrusage(RUSAGE_CHILDREN, &childu);
-
- /*
- * Get around a stupid compiler bug in gcc on solaris.
- * There is a problem if three or more doubles are passed to
- * sprintf.
- * <http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=337&database=gcc>
- */
- sprintf(buffer, "CPU=%gu/%gs CHILDCPU=", tv_float(usage.ru_utime),
- tv_float(usage.ru_stime));
- sprintf(header, "%gu/%gs", tv_float(childu.ru_utime),
- tv_float(childu.ru_stime));
- ns_info(ns_log_statistics, "USAGE %lu %lu %s%s", (u_long)timenow,
- (u_long)boottime, buffer, header);
-# undef tv_float
-#endif /*HAVE_GETRUSAGE*/
-
- sprintf(header, "NSTATS %lu %lu", (u_long)timenow, (u_long)boottime);
- strcpy(buffer, header);
-
- for (i = 0; i < T_ANY+1; i++) {
- if (typestats[i]) {
- sprintf(buffer2, " %s=%lu", p_type(i), typestats[i]);
- if (strlen(buffer) + strlen(buffer2) >
- sizeof(buffer) - 1) {
- ns_info(ns_log_statistics, "%s", buffer);
- strcpy(buffer, header);
- }
- strcat(buffer, buffer2);
- }
- }
- ns_info(ns_log_statistics, "%s", buffer);
-
- sprintf(header, "XSTATS %lu %lu", (u_long)timenow, (u_long)boottime);
- strcpy(buffer, header);
- for (i = 0; i < (int)nssLast; i++) {
- sprintf(buffer2, " %s=%lu",
- statNames[i]?statNames[i]:"?", (u_long)globalStats[i]);
- if (strlen(buffer) + strlen(buffer2) > sizeof(buffer) - 1) {
- ns_info(ns_log_statistics, "%s", buffer);
- strcpy(buffer, header);
- }
- strcat(buffer, buffer2);
- }
- ns_info(ns_log_statistics, "%s", buffer);
-}
-
-static void
-nameserFree(void *uap) {
- struct nameser *ns = uap;
-
- memput(ns, sizeof *ns);
-}
-
-void
-ns_freestats(void) {
- if (nameserTree == NULL)
- return;
- tree_mung(&nameserTree, nameserFree);
- nameserInit = 0;
- ns_stats_cnt = 0;
- ns_stats_disabled = 0;
-}
OpenPOWER on IntegriCloud