--- embedaddon/bmon/src/output.c 2012/02/21 22:19:56 1.1.1.1 +++ embedaddon/bmon/src/output.c 2014/07/30 07:55:27 1.1.1.2 @@ -1,7 +1,8 @@ /* * output.c Output API * - * Copyright (c) 2001-2005 Thomas Graf + * Copyright (c) 2001-2013 Thomas Graf + * Copyright (c) 2013 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -24,234 +25,71 @@ #include #include +#include #include -#include -#include +#include #include -static struct output_module *reg_pri_list; -static struct output_module *reg_sec_list; -static struct output_module *preferred; +static struct bmon_subsys output_subsys; -static inline void -__regiter_output_module(struct output_module *ops, struct output_module **list) +void output_register(struct bmon_module *m) { - ops->om_next = *list; - *list = ops; + module_register(&output_subsys, m); } -void register_output_module(struct output_module *ops) +static void activate_default(void) { - __regiter_output_module(ops, ®_pri_list); -} + /* + * Try to activate a default output module if the user did not make + * a selection + */ + if (!output_subsys.s_nmod) { + struct bmon_module *m; -void register_secondary_output_module(struct output_module *ops) -{ - __regiter_output_module(ops, ®_sec_list); -} + if (!output_set("curses")) + return; -static inline struct output_module * -__get_output_module(const char *name, struct output_module *list) -{ - struct output_module *i; + if (!output_set("ascii")) + return; - for (i = list; i; i = i->om_next) - if (!strcmp(i->om_name, name)) - return i; + /* Fall back to anything that could act as default */ + list_for_each_entry(m, &output_subsys.s_mod_list, m_list) { + if (m->m_flags & BMON_MODULE_DEFAULT) + if (!output_set(m->m_name)) + return; + } - return NULL; + quit("No output module found\n"); + } } -static struct output_module * get_output_module(const char *name) -{ - return __get_output_module(name, reg_pri_list); -} - -static struct output_module * get_sec_output_module(const char *name) -{ - return __get_output_module(name, reg_sec_list); -} - -#define FOREACH_SOM(F) \ - do { \ - struct output_module *i; \ - for (i = reg_sec_list; i; i = i->om_next) \ - if (i->om_enable && i->om_##F) \ - i->om_##F (); \ - } while (0) - -const char * get_preferred_output_name(void) -{ - return preferred ? preferred->om_name : "none"; -} - -static void find_preferred(int quiet) -{ - if (NULL == preferred) - preferred = get_output_module("curses"); - - if (NULL == preferred) - preferred = get_output_module("ascii"); - - if (NULL == preferred && !quiet) - quit("No output module found.\n"); -} - -void output_init(void) -{ - find_preferred(0); - - if (preferred->om_init) - preferred->om_init(); - - FOREACH_SOM(init); -} - void output_pre(void) { - find_preferred(0); - - if (preferred->om_pre) - preferred->om_pre(); - - FOREACH_SOM(pre); + module_foreach_run_enabled_pre(&output_subsys); } void output_draw(void) { - if (get_signal_output()) - if (!is_signal_recvd()) - return; - - find_preferred(0); - - calc_node_rates(); - - if (preferred->om_draw) - preferred->om_draw(); - - FOREACH_SOM(draw); + module_foreach_run_enabled(&output_subsys); } void output_post(void) { - find_preferred(0); - - if (preferred->om_post) - preferred->om_post(); - - FOREACH_SOM(post); + module_foreach_run_enabled_post(&output_subsys); } -void output_shutdown(void) +int output_set(const char *name) { - find_preferred(1); - - if (preferred && preferred->om_shutdown) - preferred->om_shutdown(); - - FOREACH_SOM(shutdown); + return module_set(&output_subsys, name); } -static void list_output(void) -{ - struct output_module *o; +static struct bmon_subsys output_subsys = { + .s_name = "output", + .s_activate_default = &activate_default, + .s_mod_list = LIST_SELF(output_subsys.s_mod_list), +}; - printf("Output modules:\n"); - if (NULL == reg_pri_list) - printf("\tNo output modules found.\n"); - else - for (o = reg_pri_list; o; o = o->om_next) - printf("\t%s\n", o->om_name); -} - -void set_output(const char *name) +static void __init __output_init(void) { - static int set = 0; - module_conf_t *ml, *m; - - if (set) - return; - set = 1; - - if (NULL == name || !strcasecmp(name, "list")) { - list_output(); - exit(0); - } - - ml = parse_module_param(name); - - for (m = ml; m; m = m->next) { - preferred = get_output_module(ml->name); - - if (NULL == preferred) - continue; - - if (preferred->om_set_opts) - preferred->om_set_opts(ml->attrs); - - if (preferred->om_probe) - if (preferred->om_probe()) - return; - } - - quit("No (working) output module found\n"); -} - -static void list_sec_output(void) -{ - struct output_module *o; - - printf("Secondary output modules:\n"); - if (NULL == reg_sec_list) - printf("\tNo secondary output modules found.\n"); - else - for (o = reg_sec_list; o; o = o->om_next) - printf("\t%s\n", o->om_name); -} - -void set_sec_output(const char *name) -{ - module_conf_t *ml, *m; - - if (NULL == name || !strcasecmp(name, "list")) { - list_sec_output(); - exit(0); - } - - ml = parse_module_param(name); - - for (m = ml; m; m = m->next) { - struct output_module *o = get_sec_output_module(m->name); - - if (NULL == o) - continue; - - if (o->om_set_opts) - o->om_set_opts(ml->attrs); - - if (o->om_probe) { - if (o->om_probe() == 1) - o->om_enable = 1; - } - } -} - -void output_resize(void) -{ - find_preferred(0); - - if (preferred && preferred->om_resize) - preferred->om_resize(); - - FOREACH_SOM(resize); -} - -int resized; - -int got_resized(void) -{ - int ret = resized; - resized = 0; - return ret; + return module_register_subsys(&output_subsys); }