Annotation of embedaddon/bmon/src/in_kstat.c, revision 1.1.1.1
1.1 misho 1: /*
2: * in_kstat.c libkstat (SunOS)
3: *
4: * Copyright (c) 2001-2004 Thomas Graf <tgraf@suug.ch>
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a
7: * copy of this software and associated documentation files (the "Software"),
8: * to deal in the Software without restriction, including without limitation
9: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10: * and/or sell copies of the Software, and to permit persons to whom the
11: * Software is furnished to do so, subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included
14: * in all copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17: * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19: * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22: * DEALINGS IN THE SOFTWARE.
23: */
24:
25: #include <bmon/bmon.h>
26: #include <bmon/input.h>
27: #include <bmon/item.h>
28: #include <bmon/node.h>
29: #include <bmon/utils.h>
30:
31: #if defined HAVE_KSTAT && defined SYS_SUNOS
32: #include <kstat.h>
33:
34: static void kstat_do_read(void)
35: {
36: kstat_ctl_t * kc;
37: kstat_t * kst;
38: kstat_named_t * kn, *kn2;
39: item_t * i;
40:
41: if (!(kc = kstat_open()))
42: quit("kstat_open() failed");
43:
44: if ((kst = kstat_lookup(kc, NULL, -1, NULL))) {
45: for (; kst; kst = kst->ks_next) {
46: if (strcmp(kst->ks_class, "net"))
47: continue;
48:
49: if (kstat_read(kc, kst, NULL) < 0)
50: continue;
51:
52: if (!strcmp(kst->ks_name, "zero_copy"))
53: continue;
54:
55: i = lookup_item(get_local_node(), kst->ks_name, 0, 0);
56:
57: if (NULL == i)
58: continue;
59:
60: i->i_major_attr = BYTES;
61: i->i_minor_attr = PACKETS;
62:
63: #define KSTAT_GET(S) (kstat_named_t *) kstat_data_lookup(kst, #S)
64:
65: if ((kn = KSTAT_GET(rbytes64)) && (kn2 = KSTAT_GET(obytes64))) {
66: update_attr(i, BYTES, kn->value.ui64, kn2->value.ui64,
67: RX_PROVIDED | TX_PROVIDED | IS64BIT);
68: } else if ((kn = KSTAT_GET(rbytes)) && (kn2 = KSTAT_GET(obytes)))
69: update_attr(i, BYTES, kn->value.ui32, kn2->value.ui32,
70: RX_PROVIDED | TX_PROVIDED);
71:
72: if ((kn = KSTAT_GET(ipackets64)) && (kn2 = KSTAT_GET(opackets64))) {
73: update_attr(i, PACKETS, kn->value.ui64, kn2->value.ui64,
74: RX_PROVIDED | TX_PROVIDED | IS64BIT);
75: } else if ((kn = KSTAT_GET(ipackets)) && (kn2 = KSTAT_GET(opackets)))
76: update_attr(i, PACKETS, kn->value.ui32, kn2->value.ui32,
77: RX_PROVIDED | TX_PROVIDED);
78:
79: if ((kn = KSTAT_GET(ierror)) && (kn2 = KSTAT_GET(oerrors)))
80: update_attr(i, ERRORS, kn->value.ui32, kn2->value.ui32,
81: RX_PROVIDED | TX_PROVIDED);
82:
83: if ((kn = KSTAT_GET(multircv64)) && (kn2 = KSTAT_GET(multixmt64)))
84: update_attr(i, MULTICAST, kn->value.ui64, kn2->value.ui64,
85: RX_PROVIDED | TX_PROVIDED);
86: else if ((kn = KSTAT_GET(multircv)) && (kn2 = KSTAT_GET(multixmt)))
87: update_attr(i, MULTICAST, kn->value.ui32, kn2->value.ui32,
88: RX_PROVIDED | TX_PROVIDED);
89:
90: if ((kn = KSTAT_GET(brdcstrcv)) && (kn2 = KSTAT_GET(brdcstxmt)))
91: update_attr(i, BROADCAST, kn->value.ui32, kn2->value.ui32,
92: RX_PROVIDED | TX_PROVIDED);
93:
94: #undef KSTAT_GET
95:
96: notify_update(i, NULL);
97: increase_lifetime(i, 1);
98: }
99: }
100:
101: kstat_close(kc);
102: }
103:
104: static void print_help(void)
105: {
106: printf(
107: "kstat - kstat statistic collector for SunOS\n" \
108: "\n" \
109: " SunOS statistic collector using libkstat, kindly provides both,\n" \
110: " 32bit and 64bit counters.\n" \
111: " Author: Thomas Graf <tgraf@suug.ch>\n" \
112: "\n");
113: }
114:
115: static void kstat_set_opts(tv_t *attrs)
116: {
117: while (attrs) {
118: if (!strcasecmp(attrs->type, "help")) {
119: print_help();
120: exit(0);
121: }
122: attrs = attrs->next;
123: }
124: }
125:
126: static int kstat_probe(void)
127: {
128: kstat_ctl_t *kc = kstat_open();
129:
130: if (kc) {
131: kstat_t * kst = kstat_lookup(kc, NULL, -1, NULL);
132: kstat_close(kc);
133:
134: if (kst)
135: return 1;
136: }
137:
138: return 0;
139: }
140:
141: static struct input_module kstat_ops = {
142: .im_name = "kstat",
143: .im_read = kstat_do_read,
144: .im_set_opts = kstat_set_opts,
145: .im_probe = kstat_probe,
146: };
147:
148: static void __init kstat_init(void)
149: {
150: register_input_module(&kstat_ops);
151: }
152:
153: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>