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>