X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Futils_cmd_flush.c;h=6fa8b7bf00b5d0b68979b4e828e1f7093e32f5dc;hb=a019b6c8144745db63c599680bd693ac02f11666;hp=e7737a0c8d01311111c7d74494532ac7469feeed;hpb=a79a29c826b99d9dd2b0214e3bccf7491509d8f5;p=collectd.git diff --git a/src/utils_cmd_flush.c b/src/utils_cmd_flush.c index e7737a0c..6fa8b7bf 100644 --- a/src/utils_cmd_flush.c +++ b/src/utils_cmd_flush.c @@ -1,6 +1,7 @@ /** * collectd - src/utils_cmd_flush.c * Copyright (C) 2008 Sebastian Harl + * Copyright (C) 2008 Florian Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -15,36 +16,80 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * - * Author: + * Authors: * Sebastian "tokkee" Harl + * Florian "octo" Forster **/ #include "collectd.h" +#include "common.h" #include "plugin.h" +#define print_to_socket(fh, ...) \ + if (fprintf (fh, __VA_ARGS__) < 0) { \ + char errbuf[1024]; \ + WARNING ("handle_flush: failed to write to socket #%i: %s", \ + fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \ + return -1; \ + } + int handle_flush (FILE *fh, char **fields, int fields_num) { + int success = 0; + int error = 0; + int timeout = -1; - if ((fields_num != 1) && (fields_num != 2)) + int i; + + for (i = 1; i < fields_num; i++) { - DEBUG ("unixsock plugin: us_handle_flush: " - "Wrong number of fields: %i", fields_num); - fprintf (fh, "-1 Wrong number of fields: Got %i, expected 1 or 2.\n", - fields_num); - fflush (fh); - return (-1); - } + char *option = fields[i]; + int status = 0; + + if (strncasecmp ("plugin=", option, strlen ("plugin=")) == 0) + { + char *plugin = option + strlen ("plugin="); + + if (0 == plugin_flush_one (timeout, plugin)) + ++success; + else + ++error; + } + else if (strncasecmp ("timeout=", option, strlen ("timeout=")) == 0) + { + char *endptr = NULL; + char *value = option + strlen ("timeout="); - if (fields_num == 2) - timeout = atoi (fields[1]); + errno = 0; + timeout = strtol (value, &endptr, 0); - INFO ("unixsock plugin: flushing all data"); - plugin_flush_all (timeout); - INFO ("unixsock plugin: finished flushing all data"); + if ((endptr == value) || (0 != errno)) + status = -1; + else if (0 >= timeout) + timeout = -1; + } + else + status = -1; + + if (status != 0) + { + print_to_socket (fh, "-1 Cannot parse option %s\n", option); + return (-1); + } + } + + if ((success + error) > 0) + { + print_to_socket (fh, "0 Done: %i successful, %i errors\n", + success, error); + } + else + { + plugin_flush_all (timeout); + print_to_socket (fh, "0 Done\n"); + } - fprintf (fh, "0 Done\n"); - fflush (fh); return (0); } /* int handle_flush */