1 /**
2 * collectd - src/utils_cmd_flush.c
3 * Copyright (C) 2008 Sebastian Harl
4 * Copyright (C) 2008 Florian Forster
5 *
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.
9 *
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.
14 *
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
18 *
19 * Authors:
20 * Sebastian "tokkee" Harl <sh at tokkee.org>
21 * Florian "octo" Forster <octo at verplant.org>
22 **/
24 #include "collectd.h"
25 #include "common.h"
26 #include "plugin.h"
28 #define print_to_socket(fh, ...) \
29 if (fprintf (fh, __VA_ARGS__) < 0) { \
30 char errbuf[1024]; \
31 WARNING ("handle_flush: failed to write to socket #%i: %s", \
32 fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
33 return -1; \
34 }
36 int handle_flush (FILE *fh, char **fields, int fields_num)
37 {
38 int success = 0;
39 int error = 0;
41 int timeout = -1;
43 int i;
45 for (i = 1; i < fields_num; i++)
46 {
47 char *option = fields[i];
48 int status = 0;
50 if (strncasecmp ("plugin=", option, strlen ("plugin=")) == 0)
51 {
52 char *plugin = option + strlen ("plugin=");
54 if (0 == plugin_flush_one (timeout, plugin))
55 ++success;
56 else
57 ++error;
58 }
59 else if (strncasecmp ("timeout=", option, strlen ("timeout=")) == 0)
60 {
61 char *endptr = NULL;
62 char *value = option + strlen ("timeout=");
64 errno = 0;
65 timeout = strtol (value, &endptr, 0);
67 if ((endptr == value) || (0 != errno))
68 status = -1;
69 else if (0 >= timeout)
70 timeout = -1;
71 }
72 else
73 status = -1;
75 if (status != 0)
76 {
77 print_to_socket (fh, "-1 Cannot parse option %s\n", option);
78 return (-1);
79 }
80 }
82 if ((success + error) > 0)
83 {
84 print_to_socket (fh, "0 Done: %i successful, %i errors\n",
85 success, error);
86 }
87 else
88 {
89 plugin_flush_all (timeout);
90 print_to_socket (fh, "0 Done\n");
91 }
93 return (0);
94 } /* int handle_flush */
96 /* vim: set sw=4 ts=4 tw=78 noexpandtab : */