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

1.1     ! misho       1: /*
        !             2:  * node.c            node handling
        !             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/node.h>
        !            27: #include <bmon/item.h>
        !            28: #include <bmon/utils.h>
        !            29: 
        !            30: static node_t *nodes;
        !            31: static size_t nodes_size;
        !            32: static size_t nnodes;
        !            33: static const char * node_name;
        !            34: static node_t *local_node;
        !            35: static node_t *current_node;
        !            36: 
        !            37: 
        !            38: node_t * lookup_node(const char *name, int creat)
        !            39: {
        !            40:        int i;
        !            41: 
        !            42:        if (NULL == nodes) {
        !            43:                nodes_size = 32;
        !            44:                nodes = xcalloc(nodes_size, sizeof(node_t));
        !            45:        }
        !            46: 
        !            47:        for (i = 0; i < nodes_size; i++)
        !            48:                if (nodes[i].n_name && !strcmp(name, nodes[i].n_name))
        !            49:                        return &nodes[i];
        !            50: 
        !            51:        if (creat) {
        !            52:                for (i = 0; i < nodes_size; i++)
        !            53:                        if (NULL == nodes[i].n_name)
        !            54:                                break;
        !            55: 
        !            56:                while (i >= nodes_size) {
        !            57:                        int oldsize = nodes_size;
        !            58:                        nodes_size += 32;
        !            59:                        nodes = xrealloc(nodes, nodes_size * sizeof(node_t));
        !            60:                        memset((uint8_t *) nodes + oldsize, 0, (nodes_size - oldsize) * sizeof(node_t));
        !            61:                }
        !            62: 
        !            63:                nodes[i].n_name = strdup(name);
        !            64:                nodes[i].n_index = i;
        !            65:                nnodes++;
        !            66:                return &nodes[i];
        !            67:        }
        !            68: 
        !            69:        return NULL;
        !            70: }
        !            71: 
        !            72: void foreach_node(void (*cb)(node_t *, void *), void *arg)
        !            73: {
        !            74:        int i;
        !            75: 
        !            76:        for (i = 0; i < nnodes; i++)
        !            77:                cb(&nodes[i], arg);
        !            78: }
        !            79: 
        !            80: void foreach_item(node_t *n, void (*cb)(item_t *, void *), void *arg)
        !            81: {
        !            82:        int i;
        !            83: 
        !            84:        for (i = 0; i < n->n_nitems; i++)
        !            85:                if (n->n_items[i].i_name[0])
        !            86:                        cb(&n->n_items[i], arg);
        !            87: }
        !            88: 
        !            89: 
        !            90: void foreach_node_item(void (*cb)(node_t *, item_t *, void *), void *arg)
        !            91: {
        !            92:        int i, m;
        !            93: 
        !            94:        for (i = 0; i < nnodes; i++) {
        !            95:                node_t *n = &nodes[i];
        !            96:                
        !            97:                for (m = 0; m < n->n_nitems; m++)
        !            98:                        if (n->n_items[m].i_name[0])
        !            99:                                cb(n, &n->n_items[m], arg);
        !           100:        }
        !           101: }
        !           102: 
        !           103: 
        !           104: static void __reset_item(node_t *n, item_t *i, void *arg)
        !           105: {
        !           106:        reset_item(i);
        !           107: }
        !           108: 
        !           109: void reset_nodes(void)
        !           110: {
        !           111:        foreach_node_item(__reset_item, NULL);
        !           112: }
        !           113: 
        !           114: static void __remove_unused_item(node_t *n, item_t *i, void *arg)
        !           115: {
        !           116:        remove_unused_items(i);
        !           117: }
        !           118: 
        !           119: void remove_unused_node_items(void)
        !           120: {
        !           121:        foreach_node_item(__remove_unused_item, NULL);
        !           122: }
        !           123: 
        !           124: 
        !           125: 
        !           126: node_t * get_local_node(void)
        !           127: {
        !           128:        if (NULL == local_node)
        !           129:                local_node = lookup_node(node_name, 1);
        !           130: 
        !           131:        return local_node;
        !           132: }
        !           133: 
        !           134: int get_nnodes(void)
        !           135: {
        !           136:        return nnodes;
        !           137: }
        !           138: 
        !           139: static void get_node_info(void)
        !           140: {
        !           141:        struct utsname uts;
        !           142:        
        !           143:        if (uname(&uts) < 0)
        !           144:                quit("utsname failed: %s\n", strerror(errno));
        !           145:        
        !           146:        node_name = strdup(uts.nodename);
        !           147: }
        !           148: 
        !           149: void calc_node_rate(node_t *node)
        !           150: {
        !           151:        int i;
        !           152: 
        !           153:        node->n_rx_maj_total = 0;
        !           154:        node->n_tx_maj_total = 0;
        !           155:        node->n_rx_min_total = 0;
        !           156:        node->n_tx_min_total = 0;
        !           157: 
        !           158:        for (i = 0; i < node->n_nitems; i++) {
        !           159:                item_t *it = &node->n_items[i];
        !           160:                if (it->i_name[0] &&
        !           161:                    it->i_level == 0 &&
        !           162:                    !(it->i_flags & ITEM_FLAG_EXCLUDE)) {
        !           163:                        stat_attr_t *maj = lookup_attr(it, it->i_major_attr);
        !           164:                        stat_attr_t *min = lookup_attr(it, it->i_minor_attr);
        !           165: 
        !           166:                        if (maj) {
        !           167:                                node->n_rx_maj_total += attr_get_rx_rate(maj);
        !           168:                                node->n_tx_maj_total += attr_get_tx_rate(maj);
        !           169:                        }
        !           170: 
        !           171:                        if (min) {
        !           172:                                node->n_rx_min_total += attr_get_rx_rate(min);
        !           173:                                node->n_tx_min_total += attr_get_tx_rate(min);
        !           174:                        }
        !           175:                        
        !           176:                }
        !           177:        }
        !           178: }
        !           179: 
        !           180: void calc_node_rates(void)
        !           181: {
        !           182:        int i;
        !           183: 
        !           184:        for (i = 0; i < nnodes; i++)
        !           185:                calc_node_rate(&nodes[i]);
        !           186: }
        !           187: 
        !           188: node_t * get_current_node(void)
        !           189: {
        !           190:        return current_node;
        !           191: }
        !           192: 
        !           193: int first_node(void)
        !           194: {
        !           195:        int i;
        !           196: 
        !           197:        if (nnodes <= 0)
        !           198:                return EMPTY_LIST;
        !           199:        
        !           200:        for (i = 0; i < nnodes; i++) {
        !           201:                if (nodes[i].n_name) {
        !           202:                        current_node = &nodes[i];
        !           203:                        return 0;
        !           204:                }
        !           205:        }
        !           206:        
        !           207:        return EMPTY_LIST;
        !           208: }
        !           209: 
        !           210: int last_node(void)
        !           211: {
        !           212:        int i;
        !           213:        
        !           214:        if (nnodes <= 0)
        !           215:                return EMPTY_LIST;
        !           216:        
        !           217:        for (i = (nnodes - 1); i >= 0; i--) {
        !           218:                if (nodes[i].n_name) {
        !           219:                        current_node = &nodes[i];
        !           220:                        return 0;
        !           221:                }
        !           222:        }
        !           223:        
        !           224:        return EMPTY_LIST;
        !           225: }
        !           226:        
        !           227: 
        !           228: int prev_node(void)
        !           229: {
        !           230:        if (nnodes <= 0)
        !           231:                return EMPTY_LIST;
        !           232:        
        !           233:        if (current_node == NULL)
        !           234:                return first_node();
        !           235:        else {
        !           236:                int i;
        !           237:                for (i = (current_node->n_index - 1); i >= 0; i--) {
        !           238:                        if (nodes[i].n_name) {
        !           239:                                current_node = &nodes[i];
        !           240:                                return 0;
        !           241:                        }
        !           242:                }
        !           243:                return END_OF_LIST;
        !           244:        }
        !           245:        
        !           246:        return EMPTY_LIST;
        !           247: }
        !           248: 
        !           249: int next_node(void)
        !           250: {
        !           251:        if (nnodes <= 0)
        !           252:                return EMPTY_LIST;
        !           253:        
        !           254:        if (current_node == NULL)
        !           255:                return first_node();
        !           256:        else {
        !           257:                int i;
        !           258:                for (i = (current_node->n_index + 1); i < nnodes; i++) {
        !           259:                        if (nodes[i].n_name) {
        !           260:                                current_node = &nodes[i];
        !           261:                                return 0;
        !           262:                        }
        !           263:                }
        !           264:                return END_OF_LIST;
        !           265:        }
        !           266:        
        !           267:        return EMPTY_LIST;
        !           268: }
        !           269: 
        !           270: item_t * get_current_item(void)
        !           271: {
        !           272:        if (current_node) {
        !           273:                if (current_node->n_selected < current_node->n_nitems &&
        !           274:                    current_node->n_selected >= 0) {
        !           275:                        item_t *i = &(current_node->n_items[current_node->n_selected]);
        !           276: 
        !           277:                        if (i->i_name[0])
        !           278:                                return i;
        !           279:                }
        !           280:        }
        !           281:        return NULL;
        !           282: }
        !           283: 
        !           284: int first_item(void)
        !           285: {
        !           286:        int i;
        !           287:        
        !           288:        if (current_node == NULL)
        !           289:                return EMPTY_LIST;
        !           290:        
        !           291:        if (current_node->n_nitems <= 0)
        !           292:                return EMPTY_LIST;
        !           293:        
        !           294:        for (i = 0; i < current_node->n_nitems; i++) {
        !           295:                if (current_node->n_items[i].i_name[0]) {
        !           296:                        current_node->n_selected = i;
        !           297:                        return 0;
        !           298:                }
        !           299:        }
        !           300:        
        !           301:        return EMPTY_LIST;
        !           302: }
        !           303: 
        !           304: int last_item(void)
        !           305: {
        !           306:        int i;
        !           307:        
        !           308:        if (current_node == NULL)
        !           309:                return EMPTY_LIST;
        !           310: 
        !           311:        if (current_node->n_nitems <= 0)
        !           312:                return EMPTY_LIST;
        !           313: 
        !           314:        for (i = (current_node->n_nitems - 1); i >= 0; i--) {
        !           315:                if (current_node->n_items[i].i_name[0]) {
        !           316:                        current_node->n_selected = i;
        !           317:                        return 0;
        !           318:                }
        !           319:        }
        !           320: 
        !           321:        return EMPTY_LIST;
        !           322: }
        !           323: 
        !           324: int goto_item(int num)
        !           325: {
        !           326:        if (current_node == NULL)
        !           327:                return EMPTY_LIST;
        !           328: 
        !           329:        if (current_node->n_nitems <= 0)
        !           330:                return EMPTY_LIST;
        !           331: 
        !           332:        if (num < current_node->n_nitems && num >= 0)
        !           333:                if (current_node->n_items[num].i_name[0])
        !           334:                        current_node->n_selected = num;
        !           335: 
        !           336:        return 0;
        !           337: }
        !           338: 
        !           339: int next_item(void)
        !           340: {
        !           341:        if (current_node == NULL)
        !           342:                return EMPTY_LIST;
        !           343: 
        !           344:        if (current_node->n_nitems <= 0)
        !           345:                return EMPTY_LIST;
        !           346: 
        !           347:        if (current_node->n_selected < 0 ||
        !           348:                current_node->n_selected >= current_node->n_nitems)
        !           349:                return last_item();
        !           350:        else {
        !           351:                int i;
        !           352:                node_t *cn = current_node;
        !           353: 
        !           354:                for (i = (cn->n_selected + 1); i < cn->n_nitems; i++) {
        !           355:                        if (!cn->n_items[i].i_name[0])
        !           356:                                continue;
        !           357: 
        !           358:                        if (cn->n_items[i].i_flags & ITEM_FLAG_IS_CHILD) {
        !           359:                                item_t *fi = get_item(cn, cn->n_items[i].i_link);
        !           360: 
        !           361:                                if (fi->i_flags & ITEM_FLAG_FOLDED)
        !           362:                                        continue;
        !           363:                        }
        !           364: 
        !           365:                        cn->n_selected = i;
        !           366:                        return 0;
        !           367:                }
        !           368: 
        !           369:                return END_OF_LIST;
        !           370:        }
        !           371: 
        !           372:        return EMPTY_LIST;
        !           373: }
        !           374: 
        !           375: int prev_item(void)
        !           376: {
        !           377:        if (current_node == NULL)
        !           378:                return EMPTY_LIST;
        !           379: 
        !           380:        if (current_node->n_nitems <= 0)
        !           381:                return EMPTY_LIST;
        !           382: 
        !           383:        if (current_node->n_selected < 0 ||
        !           384:                current_node->n_selected >= current_node->n_nitems)
        !           385:                return first_item();
        !           386:        else {
        !           387:                int i;
        !           388:                node_t *cn = current_node;
        !           389: 
        !           390:                for (i = (cn->n_selected - 1); i >= 0; i--) {
        !           391:                        if (!cn->n_items[i].i_name[0])
        !           392:                                continue;
        !           393: 
        !           394:                        if (cn->n_items[i].i_flags & ITEM_FLAG_IS_CHILD) {
        !           395:                                item_t *fi = get_item(cn, cn->n_items[i].i_link);
        !           396: 
        !           397:                                if (fi->i_flags & ITEM_FLAG_FOLDED)
        !           398:                                        continue;
        !           399:                        }
        !           400:                        
        !           401:                        cn->n_selected = i;
        !           402:                        return 0;
        !           403:                }
        !           404: 
        !           405:                return END_OF_LIST;
        !           406:        }
        !           407: 
        !           408:        return EMPTY_LIST;
        !           409: }
        !           410: 
        !           411: static void __init node_init(void)
        !           412: {
        !           413:        get_node_info();
        !           414: }

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