Annotation of embedaddon/bmon/src/input.c, revision 1.1.1.1
1.1 misho 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, ®_pri_list);
52: }
53:
54: void
55: register_secondary_input_module(struct input_module *ops)
56: {
57: __register_input_module(ops, ®_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>