|
|
1.1 root 1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted provided
6: * that: (1) source distributions retain this entire copyright notice and
7: * comment, and (2) distributions including binaries display the following
8: * acknowledgement: ``This product includes software developed by the
9: * University of California, Berkeley and its contributors'' in the
10: * documentation or other materials provided with the distribution and in
11: * all advertising materials mentioning features or use of this software.
12: * Neither the name of the University nor the names of its contributors may
13: * be used to endorse or promote products derived from this software without
14: * specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)ns_stats.c 4.10 (Berkeley) 6/27/90";
22: #endif /* not lint */
23:
24: /**************************************************************************/
25: /* simple monitoring of named behavior */
26: /* dumps a bunch of values into a well-know file */
27: /* */
28: /**************************************************************************/
29:
30: #ifdef STATS
31:
32: #include <sys/param.h>
33: #include <sys/time.h>
34: #include <netinet/in.h>
35: #include <stdio.h>
36: #include <syslog.h>
37: #include <arpa/nameser.h>
38: #include "ns.h"
39: #include "pathnames.h"
40:
41: #ifdef STATSFILE
42: char *statsfile = STATSFILE;
43: #else
44: char *statsfile = _PATH_STATS;
45: #endif /* STATSFILE */
46:
47: extern time_t boottime, resettime;
48: extern int needStatsDump;
49:
50: /*
51: * General statistics gathered
52: */
53: /* The position in this table must agree with the defines in ns.h */
54: struct stats stats[S_NSTATS] = {
55: { 0, "input packets" },
56: { 0, "output packets" },
57: { 0, "queries" },
58: { 0, "iqueries" },
59: { 0, "duplicate queries" },
60: { 0, "responses" },
61: { 0, "duplicate responses" },
62: { 0, "OK answers" },
63: { 0, "FAIL answers" },
64: { 0, "FORMERR answers" },
65: { 0, "system queries" },
66: { 0, "prime cache calls" },
67: { 0, "check_ns calls" },
68: { 0, "bad responses dropped" },
69: { 0, "martian responses" },
70: };
71:
72: /*
73: * Statistics for queries (by type)
74: */
75: unsigned long typestats[T_ANY+1];
76: char *typenames[T_ANY+1] = {
77: /* 5 types per line */
78: "Unknown", "A", "NS", "invalid(MD)", "invalid(MF)",
79: "CNAME", "SOA", "MB", "MG", "MR",
80: "NULL", "WKS", "PTR", "HINFO", "MINFO",
81: "MX", "TXT", 0, 0, 0,
82: /* 20 per line */
83: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
87: /* 100 */
88: "UINFO", "UID", "GID", "UNSPEC", 0, 0, 0, 0, 0, 0,
89: /* 110 */
90: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
91: /* 120 */
92: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
93: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
95: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
96: /* 200 */
97: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99: /* 240 */
100: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101: /* 250 */
102: 0, 0, "AXFR", "MAILB", "MAILA", "ANY"
103: };
104:
105: ns_stats()
106: {
107: time_t timenow;
108: register FILE *f;
109: register int i;
110:
111: if ((f = fopen(statsfile,"a")) == 0)
112: {
113: #ifdef DEBUG
114: if (debug)
115: fprintf(ddt,"can't open stat file, \"%s\"\n",statsfile);
116: #endif
117: syslog(LOG_ERR, "cannot open stat file, \"%s\"\n",statsfile);
118: return;
119: }
120:
121: time(&timenow);
122: fprintf(f, "### %s", ctime(&timenow));
123: fprintf(f, "%d\ttime since boot (secs)\n", timenow - boottime);
124: fprintf(f, "%d\ttime since reset (secs)\n", timenow - resettime);
125:
126: /* general statistics */
127: for (i = 0; i < S_NSTATS; i++)
128: fprintf(f,"%lu\t%s\n", stats[i].cnt, stats[i].description);
129:
130: /* query type statistics */
131: fprintf(f, "%d\tUnknown query types\n", typestats[0]);
132: for(i=1; i < T_ANY+1; i++)
133: if (typestats[i])
134: if (typenames[i])
135: fprintf(f, "%lu\t%s queries\n", typestats[i],
136: typenames[i]);
137: else
138: fprintf(f, "%lu\ttype %d queries\n",
139: typestats[i], i);
140: (void) fclose(f);
141: }
142: #endif STATS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.