summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 816c38c)
raw | patch | inline | side by side (parent: 816c38c)
author | Florian Forster <ff@octo.it> | |
Tue, 15 Jun 2010 08:41:29 +0000 (10:41 +0200) | ||
committer | Florian Forster <octo@leeloo.lan.home.verplant.org> | |
Tue, 15 Jun 2010 08:41:29 +0000 (10:41 +0200) |
Makefile | patch | blob | history | |
common.c | patch | blob | history | |
common.h | patch | blob | history | |
filesystem.c | [new file with mode: 0644] | patch | blob |
filesystem.h | [new file with mode: 0644] | patch | blob |
graph_list.c | patch | blob | history |
diff --git a/Makefile b/Makefile
index 65544e67465f0893b51a552c6774ce1cc3780ee7..0b22fd7416204bca1fe305513b865cb4a25b54d2 100644 (file)
--- a/Makefile
+++ b/Makefile
common.o: common.c common.h
+filesystem.o: filesystem.c filesystem.h
+
graph_config.o: graph_config.c graph_config.h
graph_def.o: graph_def.c graph_def.h
test: test.c utils_params.o
test.fcgi: LDLIBS = -lfcgi -lrrd
-test.fcgi: test.fcgi.c common.o graph_config.o graph_def.o graph_ident.o graph_instance.o graph_list.o utils_array.o utils_params.o action_graph.o action_list_graphs.o scanner.o parser.o oconfig.o
+test.fcgi: test.fcgi.c common.o filesystem.o graph_config.o graph_def.o graph_ident.o graph_instance.o graph_list.o utils_array.o utils_params.o action_graph.o action_list_graphs.o scanner.o parser.o oconfig.o
.PHONY: clean
diff --git a/common.c b/common.c
index 15fbe6a3185ce2703c1da8bcc05c9005b5a7544f..2b6b5eb9180efa2272695de031d0d3d4c6d49ac0 100644 (file)
--- a/common.c
+++ b/common.c
#include <fcgiapp.h>
#include <fcgi_stdio.h>
-static int foreach_rrd_file (const char *dir, /* {{{ */
- int (*callback) (const char *, void *),
- void *user_data)
-{
- DIR *dh;
- struct dirent *entry;
- int status;
-
- if (callback == NULL)
- return (EINVAL);
-
- dh = opendir (dir);
- if (dh == NULL)
- return (errno);
-
- while ((entry = readdir (dh)) != NULL)
- {
- struct stat statbuf;
- char abspath[PATH_MAX + 1];
- size_t d_name_len;
-
- if (entry->d_name[0] == '.')
- continue;
-
- d_name_len = strlen (entry->d_name);
- if (d_name_len <= 4)
- continue;
-
- if (strcasecmp (".rrd", entry->d_name + (d_name_len - 4)) != 0)
- continue;
-
- snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
- abspath[sizeof (abspath) - 1] = 0;
-
- memset (&statbuf, 0, sizeof (statbuf));
-
- status = stat (abspath, &statbuf);
- if (status != 0)
- continue;
-
- if (!S_ISREG (statbuf.st_mode))
- continue;
-
- entry->d_name[d_name_len - 4] = 0;
-
- status = (*callback) (entry->d_name, user_data);
- if (status != 0)
- break;
- } /* while (readdir) */
-
- closedir (dh);
- return (status);
-} /* }}} int foreach_rrd_file */
-
-static int foreach_dir (const char *dir, /* {{{ */
- int (*callback) (const char *, void *),
- void *user_data)
-{
- DIR *dh;
- struct dirent *entry;
- int status;
-
- if (callback == NULL)
- return (EINVAL);
-
- dh = opendir (dir);
- if (dh == NULL)
- return (errno);
-
- while ((entry = readdir (dh)) != NULL)
- {
- struct stat statbuf;
- char abspath[PATH_MAX + 1];
-
- if (entry->d_name[0] == '.')
- continue;
-
- snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
- abspath[sizeof (abspath) - 1] = 0;
-
- memset (&statbuf, 0, sizeof (statbuf));
-
- status = stat (abspath, &statbuf);
- if (status != 0)
- continue;
-
- if (!S_ISDIR (statbuf.st_mode))
- continue;
-
- status = (*callback) (entry->d_name, user_data);
- if (status != 0)
- break;
- } /* while (readdir) */
-
- closedir (dh);
- return (status);
-} /* }}} int foreach_dir */
-
-int foreach_type (const char *host, const char *plugin, /* {{{ */
- callback_type_t callback, void *user_data)
-{
- char abspath[PATH_MAX + 1];
-
- if ((host == NULL) || (plugin == NULL))
- return (EINVAL);
-
- snprintf (abspath, sizeof (abspath), "%s/%s/%s", DATA_DIR, host, plugin);
- abspath[sizeof (abspath) - 1] = 0;
-
- return (foreach_rrd_file (abspath, callback, user_data));
-} /* }}} int foreach_type */
-
-int foreach_plugin (const char *host, /* {{{ */
- callback_plugin_t callback,
- void *user_data)
-{
- char abspath[PATH_MAX + 1];
-
- if (host == NULL)
- return (EINVAL);
-
- snprintf (abspath, sizeof (abspath), "%s/%s", DATA_DIR, host);
- abspath[sizeof (abspath) - 1] = 0;
-
- return (foreach_dir (abspath, callback, user_data));
-} /* }}} int foreach_plugin */
-
-int foreach_host (callback_host_t callback, /* {{{ */
- void *user_data)
-{
- return (foreach_dir (DATA_DIR, callback, user_data));
-} /* }}} int foreach_host */
-
size_t c_strlcat (char *dst, const char *src, size_t size) /* {{{ */
{
size_t retval;
diff --git a/common.h b/common.h
index f70d385248a0bf57238ee110b44b0ada2e5f0cae..2b5662f6b5eb5a57d277b07e02c3bec0c6cdadfa 100644 (file)
--- a/common.h
+++ b/common.h
#include <stdint.h>
#include <inttypes.h>
-#define DATA_DIR "/var/lib/collectd/rrd"
-
-#include "graph_list.h"
-
-typedef int (*callback_type_t) (const char *type, void *user_data);
-typedef int (*callback_plugin_t) (const char *plugin, void *user_data);
-typedef int (*callback_host_t) (const char *host, void *user_data);
-
int print_debug (const char *format, ...)
__attribute__((format(printf,1,2)));
#if 0
# define DEBUG(...) /**/
#endif
-int foreach_type (const char *host, const char *plugin,
- callback_type_t, void *user_data);
-int foreach_plugin (const char *host, callback_plugin_t, void *user_data);
-int foreach_host (callback_host_t, void *user_data);
-
size_t c_strlcat (char *dst, const char *src, size_t size);
#define strlcat c_strlcat
diff --git a/filesystem.c b/filesystem.c
--- /dev/null
+++ b/filesystem.c
@@ -0,0 +1,299 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+#define DATA_DIR "/var/lib/collectd/rrd"
+
+#include "filesystem.h"
+
+struct fs_scan_dir_data_s /* {{{ */
+{
+ fs_ident_cb_t callback;
+ void *user_data;
+
+ char *host;
+ char *plugin;
+ char *plugin_instance;
+ char *type;
+ char *type_instance;
+}; /* }}} */
+typedef struct fs_scan_dir_data_s fs_scan_dir_data_t;
+
+typedef int (*callback_type_t) (const char *type, void *user_data);
+typedef int (*callback_plugin_t) (const char *plugin, void *user_data);
+typedef int (*callback_host_t) (const char *host, void *user_data);
+
+/*
+ * Directory and file walking functions
+ */
+static int foreach_rrd_file (const char *dir, /* {{{ */
+ int (*callback) (const char *, void *),
+ void *user_data)
+{
+ DIR *dh;
+ struct dirent *entry;
+ int status;
+
+ if (callback == NULL)
+ return (EINVAL);
+
+ dh = opendir (dir);
+ if (dh == NULL)
+ return (errno);
+
+ while ((entry = readdir (dh)) != NULL)
+ {
+ struct stat statbuf;
+ char abspath[PATH_MAX + 1];
+ size_t d_name_len;
+
+ if (entry->d_name[0] == '.')
+ continue;
+
+ d_name_len = strlen (entry->d_name);
+ if (d_name_len <= 4)
+ continue;
+
+ if (strcasecmp (".rrd", entry->d_name + (d_name_len - 4)) != 0)
+ continue;
+
+ snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
+ abspath[sizeof (abspath) - 1] = 0;
+
+ memset (&statbuf, 0, sizeof (statbuf));
+
+ status = stat (abspath, &statbuf);
+ if (status != 0)
+ continue;
+
+ if (!S_ISREG (statbuf.st_mode))
+ continue;
+
+ entry->d_name[d_name_len - 4] = 0;
+
+ status = (*callback) (entry->d_name, user_data);
+ if (status != 0)
+ break;
+ } /* while (readdir) */
+
+ closedir (dh);
+ return (status);
+} /* }}} int foreach_rrd_file */
+
+static int foreach_dir (const char *dir, /* {{{ */
+ int (*callback) (const char *, void *),
+ void *user_data)
+{
+ DIR *dh;
+ struct dirent *entry;
+ int status;
+
+ if (callback == NULL)
+ return (EINVAL);
+
+ dh = opendir (dir);
+ if (dh == NULL)
+ return (errno);
+
+ while ((entry = readdir (dh)) != NULL)
+ {
+ struct stat statbuf;
+ char abspath[PATH_MAX + 1];
+
+ if (entry->d_name[0] == '.')
+ continue;
+
+ snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
+ abspath[sizeof (abspath) - 1] = 0;
+
+ memset (&statbuf, 0, sizeof (statbuf));
+
+ status = stat (abspath, &statbuf);
+ if (status != 0)
+ continue;
+
+ if (!S_ISDIR (statbuf.st_mode))
+ continue;
+
+ status = (*callback) (entry->d_name, user_data);
+ if (status != 0)
+ break;
+ } /* while (readdir) */
+
+ closedir (dh);
+ return (status);
+} /* }}} int foreach_dir */
+
+static int foreach_type (const char *host, const char *plugin, /* {{{ */
+ callback_type_t callback, void *user_data)
+{
+ char abspath[PATH_MAX + 1];
+
+ if ((host == NULL) || (plugin == NULL))
+ return (EINVAL);
+
+ snprintf (abspath, sizeof (abspath), "%s/%s/%s", DATA_DIR, host, plugin);
+ abspath[sizeof (abspath) - 1] = 0;
+
+ return (foreach_rrd_file (abspath, callback, user_data));
+} /* }}} int foreach_type */
+
+static int foreach_plugin (const char *host, /* {{{ */
+ callback_plugin_t callback,
+ void *user_data)
+{
+ char abspath[PATH_MAX + 1];
+
+ if (host == NULL)
+ return (EINVAL);
+
+ snprintf (abspath, sizeof (abspath), "%s/%s", DATA_DIR, host);
+ abspath[sizeof (abspath) - 1] = 0;
+
+ return (foreach_dir (abspath, callback, user_data));
+} /* }}} int foreach_plugin */
+
+static int foreach_host (callback_host_t callback, /* {{{ */
+ void *user_data)
+{
+ return (foreach_dir (DATA_DIR, callback, user_data));
+} /* }}} int foreach_host */
+
+/*
+ * Functions building "fs_scan_dir_data_t" and calling the user-supplied
+ * callback eventually.
+ */
+static int scan_type (const char *type, void *user_data) /* {{{ */
+{
+ fs_scan_dir_data_t *data = user_data;
+ graph_ident_t *ident;
+ int status;
+
+ if ((type == NULL) || (data == NULL))
+ return (EINVAL);
+
+ if ((data->type != NULL) || (data->type_instance != NULL))
+ return (EINVAL);
+
+ data->type = strdup (type);
+ if (data->type == NULL)
+ return (ENOMEM);
+
+ data->type_instance = strchr (data->type, '-');
+ if (data->type_instance != NULL)
+ {
+ *data->type_instance = 0;
+ data->type_instance++;
+ }
+ else
+ {
+ data->type_instance = data->type + strlen (data->type);
+ }
+
+ ident = ident_create (data->host,
+ data->plugin, data->plugin_instance,
+ data->type, data->type_instance);
+ if (ident == NULL)
+ {
+ status = -1;
+ }
+ else
+ {
+ status = (*data->callback) (ident, data->user_data);
+ ident_destroy (ident);
+ }
+
+ free (data->type);
+ data->type = NULL;
+ data->type_instance = NULL;
+
+ return (status);
+} /* }}} int scan_type */
+
+static int scan_plugin (const char *plugin, void *user_data) /* {{{ */
+{
+ fs_scan_dir_data_t *data = user_data;
+ int status;
+
+ if ((plugin == NULL) || (data == NULL))
+ return (EINVAL);
+
+ if ((data->plugin != NULL) || (data->plugin_instance != NULL))
+ return (EINVAL);
+
+ data->plugin = strdup (plugin);
+ if (data->plugin == NULL)
+ return (ENOMEM);
+
+ data->plugin_instance = strchr (data->plugin, '-');
+ if (data->plugin_instance != NULL)
+ {
+ *data->plugin_instance = 0;
+ data->plugin_instance++;
+ }
+ else
+ {
+ data->plugin_instance = data->plugin + strlen (data->plugin);
+ }
+
+ status = foreach_type (data->host, plugin, scan_type, data);
+
+ free (data->plugin);
+ data->plugin = NULL;
+ data->plugin_instance = NULL;
+
+ return (status);
+} /* }}} int scan_plugin */
+
+static int scan_host (const char *host, void *user_data) /* {{{ */
+{
+ fs_scan_dir_data_t *data = user_data;
+ int status;
+
+ if ((host == NULL) || (data == NULL))
+ return (EINVAL);
+
+ if (data->host != NULL)
+ return (EINVAL);
+
+ data->host = strdup (host);
+ if (data->host == NULL)
+ return (ENOMEM);
+
+ status = foreach_plugin (host, scan_plugin, data);
+
+ free (data->host);
+ data->host = NULL;
+
+ return (status);
+} /* }}} int scan_host */
+
+/*
+ * Public function
+ */
+int fs_scan (fs_ident_cb_t callback, void *user_data) /* {{{ */
+{
+ fs_scan_dir_data_t data;
+
+ memset (&data, 0, sizeof (data));
+ data.callback = callback;
+ data.user_data = user_data;
+
+ data.host = NULL;
+ data.plugin = NULL;
+ data.plugin_instance = NULL;
+ data.type = NULL;
+ data.type_instance = NULL;
+
+ foreach_host (scan_host, &data);
+
+ return (0);
+} /* }}} int fs_scan */
+
+/* vim: set sw=2 sts=2 et fdm=marker : */
diff --git a/filesystem.h b/filesystem.h
--- /dev/null
+++ b/filesystem.h
@@ -0,0 +1,11 @@
+#ifndef FILESYSTEM_G
+#define FILESYSTEM_G 1
+
+#include "graph_ident.h"
+
+typedef int (*fs_ident_cb_t) (const graph_ident_t *ident, void *user_data);
+
+int fs_scan (fs_ident_cb_t callback, void *user_data);
+
+#endif /* FILESYSTEM_G */
+/* vim: set sw=2 sts=2 et fdm=marker : */
diff --git a/graph_list.c b/graph_list.c
index 5b37f2d33162075ebf0a15778cd759204a6f3ec8..a5df4cb6d68e0482d0a5ba486db711c820668b32 100644 (file)
--- a/graph_list.c
+++ b/graph_list.c
#include "graph_def.h"
#include "graph_config.h"
#include "common.h"
+#include "filesystem.h"
#include "utils_params.h"
#include <fcgiapp.h>
graph_destroy (next);
} /* }}} void graph_destroy */
-static int register_file (const graph_ident_t *file) /* {{{ */
+static int gl_register_file (const graph_ident_t *file, /* {{{ */
+ __attribute__((unused)) void *user_data)
{
graph_config_t *cfg;
int num_graphs = 0;
}
return (0);
-} /* }}} int register_file */
-
-static int callback_type (const char *type, void *user_data) /* {{{ */
-{
- gl_ident_stage_t *gl;
- graph_ident_t *ident;
- int status;
-
- if ((type == NULL) || (user_data == NULL))
- return (EINVAL);
-
- gl = user_data;
- if ((gl->type != NULL) || (gl->type_instance != NULL))
- return (EINVAL);
-
- gl->type = strdup (type);
- if (gl->type == NULL)
- return (ENOMEM);
-
- gl->type_instance = strchr (gl->type, '-');
- if (gl->type_instance != NULL)
- {
- *gl->type_instance = 0;
- gl->type_instance++;
- }
- else
- {
- gl->type_instance = gl->type + strlen (gl->type);
- }
-
- ident = ident_create (gl->host,
- gl->plugin, gl->plugin_instance,
- gl->type, gl->type_instance);
- if (ident == 0)
- {
- status = -1;
- }
- else
- {
- status = register_file (ident);
- ident_destroy (ident);
- }
-
- free (gl->type);
- gl->type = NULL;
- gl->type_instance = NULL;
-
- return (status);
-} /* }}} int callback_type */
-
-static int callback_plugin (const char *plugin, void *user_data) /* {{{ */
-{
- gl_ident_stage_t *gl;
- int status;
-
- if ((plugin == NULL) || (user_data == NULL))
- return (EINVAL);
-
- gl = user_data;
- if ((gl->plugin != NULL) || (gl->plugin_instance != NULL))
- return (EINVAL);
-
- gl->plugin = strdup (plugin);
- if (gl->plugin == NULL)
- return (ENOMEM);
-
- gl->plugin_instance = strchr (gl->plugin, '-');
- if (gl->plugin_instance != NULL)
- {
- *gl->plugin_instance = 0;
- gl->plugin_instance++;
- }
- else
- {
- gl->plugin_instance = gl->plugin + strlen (gl->plugin);
- }
-
- status = foreach_type (gl->host, plugin, callback_type, gl);
-
- free (gl->plugin);
- gl->plugin = NULL;
- gl->plugin_instance = NULL;
-
- return (status);
-} /* }}} int callback_plugin */
-
-static int callback_host (const char *host, void *user_data) /* {{{ */
-{
- gl_ident_stage_t *gl;
- int status;
-
- if ((host == NULL) || (user_data == NULL))
- return (EINVAL);
-
- gl = user_data;
- if (gl->host != NULL)
- return (EINVAL);
-
- gl->host = strdup (host);
- if (gl->host == NULL)
- return (ENOMEM);
-
- status = foreach_plugin (host, callback_plugin, gl);
-
- free (gl->host);
- gl->host = NULL;
-
- return (status);
-} /* }}} int callback_host */
+} /* }}} int gl_register_file */
static const char *get_part_from_param (const char *prim_key, /* {{{ */
const char *sec_key)
gl.type_instance = NULL;
gl_clear_instances ();
- status = foreach_host (callback_host, &gl);
+ status = fs_scan (/* callback = */ gl_register_file, /* user data = */ NULL);
gl_last_update = now;