Merge branch 'collectd-4.4'
[collectd.git] / src / utils_cmd_flush.c
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  **/
23
24 #include "collectd.h"
25 #include "common.h"
26 #include "plugin.h"
27
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         }
35
36 int handle_flush (FILE *fh, char **fields, int fields_num)
37 {
38         int success = 0;
39         int error   = 0;
40
41         int timeout = -1;
42
43         int i;
44
45         for (i = 1; i < fields_num; i++)
46         {
47                 char *option = fields[i];
48                 int   status = 0;
49
50                 if (strncasecmp ("plugin=", option, strlen ("plugin=")) == 0)
51                 {
52                         char *plugin = option + strlen ("plugin=");
53
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=");
63
64                         errno = 0;
65                         timeout = strtol (value, &endptr, 0);
66
67                         if ((endptr == value) || (0 != errno))
68                                 status = -1;
69                         else if (0 >= timeout)
70                                 timeout = -1;
71                 }
72                 else
73                         status = -1;
74
75                 if (status != 0)
76                 {
77                         print_to_socket (fh, "-1 Cannot parse option %s\n", option);
78                         return (-1);
79                 }
80         }
81
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         }
92
93         return (0);
94 } /* int handle_flush */
95
96 /* vim: set sw=4 ts=4 tw=78 noexpandtab : */
97