--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <fcgiapp.h>
+#include <fcgi_stdio.h>
+
+#include "common.h"
+#include "graph_list.h"
+#include "utils_params.h"
+
+#include "action_list_graphs.h"
+
+struct str_array_s
+{
+ char **ptr;
+ size_t size;
+};
+typedef struct str_array_s str_array_t;
+
+static str_array_t *array_alloc (void) /* {{{ */
+{
+ str_array_t *a;
+
+ a = malloc (sizeof (*a));
+ if (a == NULL)
+ return (NULL);
+
+ memset (a, 0, sizeof (*a));
+ a->ptr = NULL;
+ a->size = 0;
+
+ return (a);
+} /* }}} str_array_t *array_alloc */
+
+static void array_free (str_array_t *a) /* {{{ */
+{
+ if (a == NULL)
+ return;
+
+ free (a->ptr);
+ a->ptr = NULL;
+ a->size = 0;
+
+ free (a);
+} /* }}} void array_free */
+
+static int array_add (const char *entry, void *user_data) /* {{{ */
+{
+ str_array_t *a = user_data;
+ char **ptr;
+
+ if ((entry == NULL) || (a == NULL))
+ return (EINVAL);
+
+ ptr = realloc (a->ptr, sizeof (*a->ptr) * (a->size + 1));
+ if (ptr == NULL)
+ return (ENOMEM);
+ a->ptr = ptr;
+ ptr = a->ptr + a->size;
+
+ *ptr = strdup (entry);
+ if (*ptr == NULL)
+ return (ENOMEM);
+
+ a->size++;
+ return (0);
+} /* }}} int array_add */
+
+static int print_graph (const graph_list_t *gl, void *user_data) /* {{{ */
+{
+ if (gl == NULL)
+ return (EINVAL);
+
+ printf ("host = %s; plugin = %s;", gl->host, gl->plugin);
+ if (gl->plugin_instance != NULL)
+ printf (" plugin_instance = %s;", gl->plugin_instance);
+ printf (" type = %s;", gl->type);
+ if (gl->type_instance != NULL)
+ printf (" type_instance = %s;", gl->type_instance);
+ printf ("\n");
+
+ return (0);
+} /* }}} int print_graph */
+
+static int get_graphs_list (char ***ret_graphs, /* {{{ */
+ size_t *ret_graphs_num)
+{
+ gl_update ();
+ gl_foreach (print_graph, /* user_data = */ NULL);
+
+ return (0);
+} /* }}} int get_graphs_list */
+
+static int action_hello (void) /* {{{ */
+{
+ printf ("Content-Type: text/plain\n\n");
+
+ get_graphs_list (NULL, NULL);
+
+ return (0);
+} /* }}} int action_hello */
+
+static int action_usage (void) /* {{{ */
+{
+ printf ("Content-Type: text/plain\n\n");
+
+ fputs ("Usage:\n"
+ "\n"
+ " Available actions:\n"
+ "\n"
+ " * hello\n"
+ "\n", stdout);
+
+ return (0);
+} /* }}} int action_usage */
+
+static int handle_request (void) /* {{{ */
+{
+ const char *action;
+
+ param_init ();
+
+ action = param ("action");
+ if (action == NULL)
+ {
+ return (action_usage ());
+ }
+ else if (strcmp ("list_graphs", action) == 0)
+ {
+ return (action_list_graphs ());
+ }
+ else if (strcmp ("hello", action) == 0)
+ {
+ return (action_hello ());
+ }
+ else
+ {
+ return (action_usage ());
+ }
+} /* }}} int handle_request */
+
+static int run (void) /* {{{ */
+{
+ while (FCGI_Accept() >= 0)
+ {
+ handle_request ();
+ param_finish ();
+ }
+
+ return (0);
+} /* }}} int run */
+
+int main (int argc, char **argv) /* {{{ */
+{
+ int status;
+
+ argc = 0;
+ argv = NULL;
+
+ if (FCGX_IsCGI ())
+ status = handle_request ();
+ else
+ status = run ();
+
+ exit ((status == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
+} /* }}} int main */
+
+/* vim: set sw=2 sts=2 et fdm=marker : */