File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bmon / src / input.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:19:56 2012 UTC (12 years, 4 months ago) by misho
Branches: bmon, MAIN
CVS tags: v2_1_0p0, v2_1_0, HEAD
bmon

    1: /*
    2:  * input.c            Input API
    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/input.h>
   27: #include <bmon/node.h>
   28: #include <bmon/utils.h>
   29: 
   30: static struct input_module *reg_pri_list;
   31: static struct input_module *reg_sec_list;
   32: static struct input_module *preferred;
   33: 
   34: const char *
   35: get_preferred_input_name(void)
   36: {
   37: 	return preferred ? preferred->im_name : "none";
   38: }
   39: 
   40: static inline void
   41: __register_input_module(struct input_module *ops, struct input_module **list)
   42: {
   43: 	ops->im_next = *list;
   44: 	*list = ops;
   45: }
   46: 
   47: 
   48: void
   49: register_input_module(struct input_module *ops)
   50: {
   51: 	__register_input_module(ops, &reg_pri_list);
   52: }
   53: 
   54: void
   55: register_secondary_input_module(struct input_module *ops)
   56: {
   57: 	__register_input_module(ops, &reg_sec_list);
   58: }
   59: 
   60: static inline struct input_module *
   61: __get_input_module(const char *name, struct input_module *list)
   62: {
   63: 	struct input_module *i;
   64: 
   65: 	for (i = list; i; i = i->im_next)
   66: 		if (!strcmp(i->im_name, name))
   67: 			return i;
   68: 
   69: 	return NULL;
   70: }
   71: 
   72: static struct input_module *
   73: get_input_module(const char *name)
   74: {
   75: 	return __get_input_module(name, reg_pri_list);
   76: }
   77: 
   78: static struct input_module *
   79: get_sec_input_module(const char *name)
   80: {
   81: 	return __get_input_module(name, reg_sec_list);
   82: }
   83: 
   84: #define FOREACH_SIM(F) \
   85: 	do { \
   86: 		struct input_module *i; \
   87: 		for (i = reg_sec_list; i; i = i->im_next) \
   88: 			if (i->im_enable && i->im_##F) \
   89: 				i->im_##F (); \
   90: 	} while (0)
   91: 
   92: static void
   93: find_preferred(void)
   94: {
   95: 	if (NULL == preferred) {
   96: 		struct input_module *i;
   97: 		/*
   98: 		 * User has not chosen a output module
   99: 		 */
  100: 
  101: #if defined SYS_SUNOS
  102: 		preferred = get_input_module("kstat");
  103: #elif defined SYS_BSD
  104: 		preferred = get_input_module("sysctl");
  105: #elif defined SYS_LINUX
  106: 		preferred = get_input_module("netlink");
  107: 
  108: 		if (NULL == preferred)
  109: 			preferred = get_input_module("proc");
  110: 
  111: 		if (NULL == preferred)
  112: 			preferred = get_input_module("sysfs");
  113: #endif
  114: 
  115: 		if (NULL == preferred) {
  116: 			for (i = reg_pri_list; i; i = i->im_next) {
  117: 				if (i->im_no_default) {
  118: 					preferred = i;
  119: 					break;
  120: 				}
  121: 			}
  122: 		}
  123: 
  124: 		if (NULL == preferred)
  125: 			quit("No input method found\n");
  126: 	}
  127: }
  128: 
  129: 
  130: void
  131: input_read(void)
  132: {
  133: 	find_preferred();
  134: 
  135: 	reset_nodes();
  136: 	preferred->im_read();
  137: 
  138: 	FOREACH_SIM(read);
  139: 
  140: 	remove_unused_node_items();
  141: }
  142: 
  143: static void
  144: list_input(void)
  145: {
  146: 	struct input_module *i;
  147: 
  148: 	printf("Input modules:\n");
  149: 	if (NULL == reg_pri_list)
  150: 		printf("\tNo input modules found.\n");
  151: 	else
  152: 		for (i = reg_pri_list; i; i = i->im_next)
  153: 			printf("\t%s\n", i->im_name);
  154: }
  155: 
  156: void
  157: set_input(const char *name)
  158: {
  159: 	static int set = 0;
  160: 	module_conf_t *ml, *m;
  161: 	
  162: 	if (set)
  163: 		return;
  164: 	set = 1;
  165: 
  166: 	if (NULL == name || !strcasecmp(name, "list")) {
  167: 		list_input();
  168: 		exit(0);
  169: 	}
  170: 	
  171: 	ml = parse_module_param(name);
  172: 
  173: 	for (m = ml; m; m = m->next) {
  174: 		preferred = get_input_module(ml->name);
  175: 
  176: 		if (NULL == preferred)
  177: 			continue;
  178: 
  179: 		if (preferred->im_set_opts)
  180: 			preferred->im_set_opts(ml->attrs);
  181: 
  182: 		if (preferred->im_probe)
  183: 			if (preferred->im_probe())
  184: 				return;
  185: 	}
  186: 
  187: 	quit("No (working) input module found\n");
  188: }
  189: 
  190: static void
  191: list_sec_input(void)
  192: {
  193: 	struct input_module *i;
  194: 
  195: 	printf("Secondary input modules:\n");
  196: 	if (NULL == reg_sec_list)
  197: 		printf("\tNo secondary input modules found.\n");
  198: 	else
  199: 		for (i = reg_sec_list; i; i = i->im_next)
  200: 			printf("\t%s\n", i->im_name);
  201: }
  202: 
  203: void
  204: set_sec_input(const char *name)
  205: {
  206: 	static int set = 0;
  207: 	module_conf_t *ml, *m;
  208: 
  209: 	if (set)
  210: 		return;
  211: 	set = 1;
  212: 
  213: 	if (NULL == name || !strcasecmp(name, "list")) {
  214: 		list_sec_input();
  215: 		exit(0);
  216: 	}
  217: 	
  218: 	ml = parse_module_param(name);
  219: 
  220: 	for (m = ml; m; m = m->next) {
  221: 		struct input_module *i = get_sec_input_module(m->name);
  222: 
  223: 		if (NULL == i)
  224: 			continue;
  225: 
  226: 		if (i->im_set_opts)
  227: 			i->im_set_opts(ml->attrs);
  228: 
  229: 		if (i->im_probe) {
  230: 			if (i->im_probe() == 1)
  231: 				i->im_enable = 1;
  232: 		}
  233: 	}
  234: }
  235: 
  236: void
  237: input_init(void)
  238: {
  239: 	find_preferred();
  240: 
  241: 	if (preferred->im_init)
  242: 		preferred->im_init();
  243: 
  244: 	FOREACH_SIM(init);
  245: }
  246: 
  247: void
  248: input_shutdown(void)
  249: {
  250: 	find_preferred();
  251: 
  252: 	if (preferred->im_shutdown)
  253: 		preferred->im_shutdown();
  254: 
  255: 	FOREACH_SIM(shutdown);
  256: }

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