From: Florian Forster Date: Tue, 18 Jan 2011 15:49:40 +0000 (+0100) Subject: src/data_provider.c: Call lcc_flush() before querying the data. X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=48fb18a605cafef572e0c41263eb576c386b7c9f;p=collection4.git src/data_provider.c: Call lcc_flush() before querying the data. --- diff --git a/src/data_provider.c b/src/data_provider.c index 0236443..73630f2 100644 --- a/src/data_provider.c +++ b/src/data_provider.c @@ -1,6 +1,7 @@ /** * collection4 - data_provider.c * Copyright (C) 2010 Florian octo Forster + * Copyright (C) 2011 noris network AG * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,17 +23,85 @@ **/ #include +#include #include +#include #include "data_provider.h" #include "dp_rrdtool.h" +#include "graph_ident.h" #include #include +#include + /* TODO: Turn this into an array for multiple data providers. */ static data_provider_t *data_provider = NULL; +static lcc_connection_t *collectd_connection = NULL; + +static int data_provider_ident_flush (const graph_ident_t *ident) /* {{{ */ +{ + char *ident_str; + lcc_identifier_t ident_lcc; + int status; + + if (ident == NULL) + return (EINVAL); + + ident_str = ident_to_string (ident); + if (ident_str == NULL) + return (ENOMEM); + + if (collectd_connection == NULL) + { + /* TODO: Make socket path configurable */ + status = lcc_connect (/* path = */ "/var/run/collectd-unixsock", + &collectd_connection); + if (status != 0) + { + assert (collectd_connection == NULL); + fprintf (stderr, "data_provider_ident_flush: lcc_connect failed " + "with status %i.\n", status); + return (status); + } + assert (collectd_connection != NULL); + } + + memset (&ident_lcc, 0, sizeof (ident_lcc)); + status = lcc_string_to_identifier (collectd_connection, + &ident_lcc, ident_str); + if (status != 0) + { + fprintf (stderr, "data_provider_ident_flush: lcc_string_to_identifier " + "failed: %s (%i)\n", + lcc_strerror (collectd_connection), status); + free (ident_str); + return (status); + } + + status = lcc_flush (collectd_connection, + /* write-plugin = */ NULL, + /* identifier = */ &ident_lcc, + /* timeout = */ -1); + if (status != 0) + { + fprintf (stderr, "data_provider_ident_flush: lcc_flush (\"%s\") failed: %s (%i)\n", + ident_str, lcc_strerror (collectd_connection), status); + free (ident_str); + + lcc_disconnect (collectd_connection); + collectd_connection = NULL; + + return (status); + } + + /* fprintf (stderr, "data_provider_ident_flush: lcc_flush (\"%s\") succeeded.\n", ident_str); */ + free (ident_str); + return (0); +} /* }}} int data_provider_ident_flush */ + int data_provider_config (const oconfig_item_t *ci) /* {{{ */ { /* FIXME: Actually determine which data provider to call. */ @@ -87,6 +156,8 @@ int data_provider_get_ident_data (graph_ident_t *ident, /* {{{ */ if (data_provider == NULL) return (EINVAL); + data_provider_ident_flush (ident); + return (data_provider->get_ident_data (data_provider->private_data, ident, ds_name, begin, end, callback, user_data)); } /* }}} int data_provider_get_ident_data */ diff --git a/src/graph_ident.c b/src/graph_ident.c index abf396d..5c513ec 100644 --- a/src/graph_ident.c +++ b/src/graph_ident.c @@ -456,6 +456,9 @@ char *ident_to_string (const graph_ident_t *ident) /* {{{ */ { char buffer[PATH_MAX]; + if (ident == NULL) + return (NULL); + buffer[0] = 0; strlcat (buffer, ident->host, sizeof (buffer));