Annotation of embedaddon/bmon/src/in_proc.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * in_proc.c                  /proc/net/dev Input (Linux)
        !             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/node.h>
        !            28: #include <bmon/item.h>
        !            29: #include <bmon/utils.h>
        !            30: #include <inttypes.h>
        !            31: 
        !            32: static char *c_path = "/proc/net/dev";
        !            33: 
        !            34: static void proc_read(void)
        !            35: {
        !            36:        FILE *  fd;
        !            37:        char    buf[512], *p, *s;
        !            38:        int     w;
        !            39:        item_t *it;
        !            40:        
        !            41:        if (!(fd = fopen(c_path, "r")))
        !            42:                quit("Unable to open file %s: %s\n", c_path, strerror(errno));
        !            43:        
        !            44:        fgets(buf, sizeof(buf), fd);
        !            45:        fgets(buf, sizeof(buf), fd);
        !            46:        
        !            47:        for (; fgets(buf, sizeof(buf), fd);) {
        !            48:                b_cnt_t rx_errors, rx_drop, rx_fifo, rx_frame, rx_compressed;
        !            49:                b_cnt_t rx_multicast, tx_errors, tx_drop, tx_fifo, tx_frame;
        !            50:                b_cnt_t tx_compressed, tx_multicast, rx_bytes, tx_bytes;
        !            51:                b_cnt_t rx_packets, tx_packets;
        !            52:                
        !            53:                if (buf[0] == '\r' || buf[0] == '\n')
        !            54:                        continue;
        !            55:                
        !            56:                if (!(p = strchr(buf, ':')))
        !            57:                        continue;
        !            58:                *p = '\0';
        !            59:                s = (p + 1);
        !            60:                
        !            61:                for (p = &buf[0]; *p == ' '; p++);
        !            62: 
        !            63:                /*
        !            64:                 * XXX: get_show_only_running
        !            65:                 */
        !            66:                
        !            67:                if ((it = lookup_item(get_local_node(), p, 0, 0)) == NULL)
        !            68:                        continue;
        !            69:                
        !            70:                w = sscanf(s, "%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
        !            71:                              "%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
        !            72:                              "%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 " "
        !            73:                              "%" SCNu64 " %" SCNu64 " %" SCNu64 " %" SCNu64 "\n",
        !            74:                    &rx_bytes, &rx_packets, &rx_errors, &rx_drop, &rx_fifo,
        !            75:                    &rx_frame, &rx_compressed, &rx_multicast, &tx_bytes,
        !            76:                    &tx_packets, &tx_errors, &tx_drop, &tx_fifo,
        !            77:                    &tx_frame, &tx_compressed, &tx_multicast);
        !            78:                
        !            79:                if (w != 16)
        !            80:                        continue;
        !            81:        
        !            82:                it->i_major_attr = BYTES;
        !            83:                it->i_minor_attr = PACKETS;
        !            84:        
        !            85:                update_attr(it, BYTES, rx_bytes, tx_bytes, RX_PROVIDED|TX_PROVIDED);
        !            86:                update_attr(it, PACKETS, rx_packets, tx_packets, RX_PROVIDED|TX_PROVIDED);
        !            87:                update_attr(it, ERRORS, rx_errors, tx_errors, RX_PROVIDED|TX_PROVIDED);
        !            88:                update_attr(it, DROP, rx_drop, tx_drop, RX_PROVIDED|TX_PROVIDED);
        !            89:                update_attr(it, FIFO, rx_fifo, tx_fifo, RX_PROVIDED|TX_PROVIDED);
        !            90:                update_attr(it, FRAME, rx_frame, tx_frame, RX_PROVIDED|TX_PROVIDED);
        !            91:                update_attr(it, COMPRESSED, rx_compressed, tx_compressed, RX_PROVIDED|TX_PROVIDED);
        !            92:                update_attr(it, MULTICAST, rx_multicast, tx_multicast, RX_PROVIDED|TX_PROVIDED);
        !            93: 
        !            94:                notify_update(it, NULL);
        !            95:                increase_lifetime(it, 1);
        !            96:        }
        !            97:        
        !            98:        fclose(fd);
        !            99: }
        !           100: 
        !           101: static void print_help(void)
        !           102: {
        !           103:        printf(
        !           104:        "proc - procfs statistic collector for Linux" \
        !           105:        "\n" \
        !           106:        "  Reads statistics from procfs (/proc/net/dev)\n" \
        !           107:        "  Author: Thomas Graf <tgraf@suug.ch>\n" \
        !           108:        "\n" \
        !           109:        "  Options:\n" \
        !           110:        "    file=PATH      Path to statistics file (default: /proc/net/dev)\n");
        !           111: }
        !           112: 
        !           113: static void proc_set_opts(tv_t *attrs)
        !           114: {
        !           115:        while (attrs) {
        !           116:                if (!strcasecmp(attrs->type, "file") && attrs->value)
        !           117:                        c_path = attrs->value;
        !           118:                else if (!strcasecmp(attrs->type, "help")) {
        !           119:                        print_help();
        !           120:                        exit(0);
        !           121:                }
        !           122:                attrs = attrs->next;
        !           123:        }
        !           124: }
        !           125: 
        !           126: static int proc_probe(void)
        !           127: {
        !           128:        FILE *fd = fopen(c_path, "r");
        !           129: 
        !           130:        if (fd) {
        !           131:                fclose(fd);
        !           132:                return 1;
        !           133:        }
        !           134:        return 0;
        !           135: }
        !           136: 
        !           137: static struct input_module proc_ops = {
        !           138:        .im_name = "proc",
        !           139:        .im_read = proc_read,
        !           140:        .im_set_opts = proc_set_opts,
        !           141:        .im_probe = proc_probe,
        !           142: };
        !           143: 
        !           144: static void __init proc_init(void)
        !           145: {
        !           146:        register_input_module(&proc_ops);
        !           147: }

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