Annotation of embedaddon/bmon/src/itemtab.c, revision 1.1
1.1 ! misho 1: /*
! 2: * itemtab.c Item Tab file
! 3: *
! 4: * Copyright (c) 2001-2005 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/conf.h>
! 27: #include <bmon/item.h>
! 28: #include <bmon/node.h>
! 29: #include <bmon/itemtab.h>
! 30: #include <bmon/utils.h>
! 31:
! 32: static struct it_item *items;
! 33:
! 34: static inline struct it_item *find_item(const char *name, const char *parent)
! 35: {
! 36: struct it_item *i;
! 37:
! 38: for (i = items; i; i = i->ii_next)
! 39: if (!strcmp(name, i->ii_name) &&
! 40: !strcmp(parent, i->ii_parent))
! 41: return i;
! 42:
! 43: return NULL;
! 44: }
! 45:
! 46: static void parse_option(struct it_item *item, char *opt)
! 47: {
! 48: char *value = strchr(opt, '=');
! 49:
! 50: if (value) {
! 51: *value = '\0';
! 52: value++;
! 53: }
! 54:
! 55: if (!strcasecmp(opt, "rxmax") && value)
! 56: item->ii_rx_max = parse_size(value);
! 57: else if (!strcasecmp(opt, "txmax") && value)
! 58: item->ii_tx_max = parse_size(value);
! 59: else if (!strcasecmp(opt, "max") && value) {
! 60: item->ii_rx_max = parse_size(value);
! 61: item->ii_tx_max = item->ii_rx_max;
! 62: } else if (!strcasecmp(opt, "desc") && value)
! 63: item->ii_desc = strdup(value);
! 64: }
! 65:
! 66: static void parse_itemtab(struct it_item *item, char *opts)
! 67: {
! 68: char *next, *current = opts;
! 69:
! 70: do {
! 71: next = strchr(current, ',');
! 72: if (next) {
! 73: *next = '\0';
! 74: ++next;
! 75: }
! 76:
! 77: if (*current)
! 78: parse_option(item, current);
! 79: current = next;
! 80: } while (next);
! 81: }
! 82:
! 83:
! 84: static inline void parse_itemtab_line(char *data)
! 85: {
! 86: char *buf = strdup(data);
! 87: char *p, *item_name = buf, *parent_name;
! 88: struct it_item *item;
! 89:
! 90: if (buf[strlen(buf) - 1] == '\n')
! 91: buf[strlen(buf) - 1] = '\0';
! 92:
! 93: /* jump over item */
! 94: for (p = buf; *p != ' ' && *p != '\t' && *p != '\0'; p++);
! 95: if (*p == '\0')
! 96: goto skip;
! 97: *p = '\0';
! 98:
! 99: /* jump over gap to parent */
! 100: for (++p; *p == ' ' || *p == '\t'; p++);
! 101: if (*p == '\0')
! 102: goto skip;
! 103: parent_name = p;
! 104:
! 105: /* jump over parent */
! 106: for (; *p != ' ' && *p != '\t' && *p != '\0'; p++);
! 107: if (*p == '\0')
! 108: goto skip;
! 109: *p = '\0';
! 110:
! 111: /* jump over gap to options */
! 112: for (++p; *p == ' ' || *p == '\t'; p++);
! 113: if (*p == '\0')
! 114: goto skip;
! 115:
! 116: item = find_item(item_name, parent_name);
! 117: if (item != NULL)
! 118: goto skip;
! 119:
! 120: item = xcalloc(1, sizeof(*item));
! 121: item->ii_name = strdup(item_name);
! 122: item->ii_parent = strdup(parent_name);
! 123: item->ii_next = items;
! 124: items = item;
! 125:
! 126: parse_itemtab(item, p);
! 127:
! 128: skip:
! 129: free(buf);
! 130: }
! 131:
! 132: static void itemtab_read(const char *path)
! 133: {
! 134: FILE *f = fopen(path, "r");
! 135: char *p, buf[1024];
! 136:
! 137: if (f == NULL)
! 138: return;
! 139:
! 140: while (fgets(buf, sizeof(buf), f)) {
! 141: if ('#' == *buf)
! 142: continue;
! 143:
! 144: if ((p = strchr(buf, '\r')) || (p = strchr(buf, '\n')))
! 145: *p = '\0';
! 146:
! 147: if (*buf)
! 148: parse_itemtab_line(buf);
! 149: }
! 150:
! 151: fclose(f);
! 152: }
! 153:
! 154: void read_itemtab(void)
! 155: {
! 156: itemtab_read(get_itemtab());
! 157: }
! 158:
! 159: struct it_item *lookup_tab(item_t *it)
! 160: {
! 161: item_t *parent = NULL;
! 162:
! 163: if (!(it->i_flags & ITEM_FLAG_LOCAL))
! 164: return NULL;
! 165:
! 166: if (it->i_flags & ITEM_FLAG_IS_CHILD) {
! 167: parent = get_item(it->i_node, it->i_parent);
! 168: if (parent == NULL)
! 169: return NULL;
! 170: }
! 171:
! 172: return find_item(it->i_name, parent ? parent->i_name : "<none>");
! 173: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>