Annotation of embedaddon/bmon/src/in_sysctl.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * in_sysctl.c                 sysctl (BSD)
                      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/conf.h>
                     29: #include <bmon/node.h>
                     30: #include <bmon/utils.h>
                     31: 
                     32: #if defined SYS_BSD
                     33: #include <sys/socket.h>
                     34: #include <net/if.h>
                     35: #include <sys/param.h>
                     36: #include <sys/sysctl.h>
                     37: #include <net/if_dl.h>
                     38: #include <net/route.h>
                     39: 
                     40: static int c_debug;
                     41: 
                     42: static void sysctl_read(void)
                     43: {
                     44:        int mib[] = {CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
                     45:        size_t n;
                     46:        char *buf, *next, *lim;
                     47: 
                     48:        if (sysctl(mib, 6, NULL, &n, NULL, 0) < 0)
                     49:                quit("sysctl() failed");
                     50: 
                     51:        if (c_debug)
                     52:                fprintf(stderr, "sysctl 1-pass n=%d\n", (int) n);
                     53: 
                     54:        buf = xcalloc(1, n);
                     55: 
                     56:        if (sysctl(mib, 6, buf, &n, NULL, 0) < 0)
                     57:                quit("sysctl() failed");
                     58: 
                     59:        if (c_debug)
                     60:                fprintf(stderr, "sysctl 2-pass n=%d\n", (int) n);
                     61: 
                     62:        lim = buf + n;
                     63:        next = buf;
                     64: 
                     65:        while (next < lim) {
                     66:                struct if_msghdr *ifm, *nextifm;
                     67:                struct sockaddr_dl *sdl;
                     68:                item_t *it;
                     69: 
                     70:                ifm = (struct if_msghdr *) next;
                     71:                if (ifm->ifm_type != RTM_IFINFO)
                     72:                        break;
                     73: 
                     74:                next += ifm->ifm_msglen;
                     75:                while (next < lim) {
                     76:                        nextifm = (struct if_msghdr *) next;
                     77:                        if (nextifm->ifm_type != RTM_NEWADDR)
                     78:                                break;
                     79:                        next += nextifm->ifm_msglen;
                     80:                }
                     81: 
                     82:                sdl = (struct sockaddr_dl *) (ifm + 1);
                     83: 
                     84:                if (sdl->sdl_family != AF_LINK)
                     85:                        continue;
                     86: 
                     87:                if (get_show_only_running() && !(ifm->ifm_flags & IFF_UP))
                     88:                        continue;
                     89: 
                     90:                if (c_debug)
                     91:                        fprintf(stderr, "Processing %s\n", sdl->sdl_data);
                     92: 
                     93:                it = lookup_item(get_local_node(), sdl->sdl_data, 0, 0);
                     94:                if (it == NULL)
                     95:                        continue;
                     96: 
                     97:                it->i_major_attr = BYTES;
                     98:                it->i_minor_attr = PACKETS;
                     99: 
                    100:                update_attr(it, PACKETS,
                    101:                            ifm->ifm_data.ifi_ipackets,
                    102:                            ifm->ifm_data.ifi_opackets,
                    103:                            RX_PROVIDED | TX_PROVIDED);
                    104: 
                    105:                update_attr(it, BYTES,
                    106:                            ifm->ifm_data.ifi_ibytes,
                    107:                            ifm->ifm_data.ifi_obytes,
                    108:                            RX_PROVIDED | TX_PROVIDED);
                    109: 
                    110:                update_attr(it, ERRORS,
                    111:                            ifm->ifm_data.ifi_ierrors,
                    112:                            ifm->ifm_data.ifi_oerrors,
                    113:                            RX_PROVIDED | TX_PROVIDED);
                    114: 
                    115:                update_attr(it, COLLISIONS,
                    116:                            0, ifm->ifm_data.ifi_collisions,
                    117:                            TX_PROVIDED);
                    118: 
                    119:                update_attr(it, MULTICAST,
                    120:                            ifm->ifm_data.ifi_imcasts,
                    121:                            0,
                    122:                            RX_PROVIDED);
                    123: 
                    124:                update_attr(it, DROP,
                    125:                            0,
                    126:                            ifm->ifm_data.ifi_iqdrops,
                    127:                            TX_PROVIDED);
                    128: 
                    129:                notify_update(it, NULL);
                    130:                increase_lifetime(it, 1);
                    131:        }
                    132: 
                    133:        xfree(buf);
                    134: }
                    135: 
                    136: static void print_help(void)
                    137: {
                    138:        printf(
                    139:        "sysctl - sysctl statistic collector for BSD and Darwin\n" \
                    140:        "\n" \
                    141:        "  BSD and Darwin statistic collector using sysctl()\n" \
                    142:        "  Author: Thomas Graf <tgraf@suug.ch>\n" \
                    143:        "\n");
                    144: }
                    145: 
                    146: static void sysctl_set_opts(tv_t *attrs)
                    147: {
                    148:        while (attrs) {
                    149:                if (!strcasecmp(attrs->type, "debug"))
                    150:                        c_debug = 1;
                    151:                else if (!strcasecmp(attrs->type, "help")) {
                    152:                        print_help();
                    153:                        exit(0);
                    154:                }
                    155:                attrs = attrs->next;
                    156:        }
                    157: }
                    158: 
                    159: static int sysctl_probe(void)
                    160: {
                    161:        size_t n;
                    162:        int mib[] = {CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, 0};
                    163:        if (sysctl(mib, 6, NULL, &n, NULL, 0) < 0)
                    164:                return 0;
                    165:        return 1;
                    166: }
                    167: 
                    168: static struct input_module kstat_ops = {
                    169:        .im_name = "sysctl",
                    170:        .im_read = sysctl_read,
                    171:        .im_set_opts = sysctl_set_opts,
                    172:        .im_probe = sysctl_probe,
                    173: };
                    174: 
                    175: static void __init sysctl_init(void)
                    176: {
                    177:        register_input_module(&kstat_ops);
                    178: }
                    179: 
                    180: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>