2 * collectd - src/utils_cmd_flush.c
3 * Copyright (C) 2008 Sebastian Harl
4 * Copyright (C) 2008 Florian Forster
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; only version 2 of the License is applicable.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 * Sebastian "tokkee" Harl <sh at tokkee.org>
21 * Florian "octo" Forster <octo at verplant.org>
28 #define print_to_socket(fh, ...) \
29 if (fprintf (fh, __VA_ARGS__) < 0) { \
31 WARNING ("handle_flush: failed to write to socket #%i: %s", \
32 fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
36 static int add_to_array (char ***array, int *array_num, char *value)
40 temp = (char **) realloc (*array, sizeof (char *) * (*array_num + 1));
45 (*array)[*array_num] = value;
49 } /* int add_to_array */
51 int handle_flush (FILE *fh, char **fields, int fields_num)
57 char **plugins = NULL;
59 char **identifiers = NULL;
60 int identifiers_num = 0;
64 for (i = 1; i < fields_num; i++)
66 char *option = fields[i];
69 if (strncasecmp ("plugin=", option, strlen ("plugin=")) == 0)
73 plugin = option + strlen ("plugin=");
74 add_to_array (&plugins, &plugins_num, plugin);
76 else if (strncasecmp ("identifier=", option, strlen ("identifier=")) == 0)
80 identifier = option + strlen ("identifier=");
81 add_to_array (&identifiers, &identifiers_num, identifier);
83 else if (strncasecmp ("timeout=", option, strlen ("timeout=")) == 0)
86 char *value = option + strlen ("timeout=");
89 timeout = strtol (value, &endptr, 0);
91 if ((endptr == value) || (0 != errno))
93 else if (0 >= timeout)
101 print_to_socket (fh, "-1 Cannot parse option %s\n", option);
106 /* Add NULL entries for `any plugin' and/or `any value' if nothing was
108 if (plugins_num == 0)
109 add_to_array (&plugins, &plugins_num, NULL);
111 if (identifiers_num == 0)
112 add_to_array (&identifiers, &identifiers_num, NULL);
114 for (i = 0; i < plugins_num; i++)
121 for (j = 0; j < identifiers_num; j++)
126 identifier = identifiers[j];
127 status = plugin_flush (plugin, timeout, identifier);
135 if ((success + error) > 0)
137 print_to_socket (fh, "0 Done: %i successful, %i errors\n",
142 plugin_flush_all (timeout);
143 print_to_socket (fh, "0 Done\n");
147 } /* int handle_flush */
149 /* vim: set sw=4 ts=4 tw=78 noexpandtab : */