14 #include "graph_list.h"
16 static int foreach_rrd_file (const char *dir, /* {{{ */
17 int (*callback) (const char *, void *),
31 while ((entry = readdir (dh)) != NULL)
34 char abspath[PATH_MAX + 1];
37 if (entry->d_name[0] == '.')
40 d_name_len = strlen (entry->d_name);
44 if (strcasecmp (".rrd", entry->d_name + (d_name_len - 4)) != 0)
47 snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
48 abspath[sizeof (abspath) - 1] = 0;
50 memset (&statbuf, 0, sizeof (statbuf));
52 status = stat (abspath, &statbuf);
56 if (!S_ISREG (statbuf.st_mode))
59 entry->d_name[d_name_len - 4] = 0;
61 status = (*callback) (entry->d_name, user_data);
64 } /* while (readdir) */
68 } /* }}} int foreach_rrd_file */
70 static int foreach_dir (const char *dir, /* {{{ */
71 int (*callback) (const char *, void *),
85 while ((entry = readdir (dh)) != NULL)
88 char abspath[PATH_MAX + 1];
90 if (entry->d_name[0] == '.')
93 snprintf (abspath, sizeof (abspath), "%s/%s", dir, entry->d_name);
94 abspath[sizeof (abspath) - 1] = 0;
96 memset (&statbuf, 0, sizeof (statbuf));
98 status = stat (abspath, &statbuf);
102 if (!S_ISDIR (statbuf.st_mode))
105 status = (*callback) (entry->d_name, user_data);
108 } /* while (readdir) */
112 } /* }}} int foreach_dir */
114 int foreach_type (const char *host, const char *plugin, /* {{{ */
115 callback_type_t callback, void *user_data)
117 char abspath[PATH_MAX + 1];
119 if ((host == NULL) || (plugin == NULL))
122 snprintf (abspath, sizeof (abspath), "%s/%s/%s", DATA_DIR, host, plugin);
123 abspath[sizeof (abspath) - 1] = 0;
125 return (foreach_rrd_file (abspath, callback, user_data));
126 } /* }}} int foreach_type */
128 int foreach_plugin (const char *host, /* {{{ */
129 callback_plugin_t callback,
132 char abspath[PATH_MAX + 1];
137 snprintf (abspath, sizeof (abspath), "%s/%s", DATA_DIR, host);
138 abspath[sizeof (abspath) - 1] = 0;
140 return (foreach_dir (abspath, callback, user_data));
141 } /* }}} int foreach_plugin */
143 int foreach_host (callback_host_t callback, /* {{{ */
146 return (foreach_dir (DATA_DIR, callback, user_data));
147 } /* }}} int foreach_host */
149 size_t c_strlcat (char *dst, const char *src, size_t size) /* {{{ */
155 dst_len = strlen (dst);
156 src_len = strlen (src);
157 retval = dst_len + src_len;
159 if ((dst_len + 1) >= size)
166 /* Result will be truncated. */
170 memcpy (dst, src, src_len);
174 } /* }}} size_t c_strlcat */
176 int ds_list_from_rrd_file (char *file, /* {{{ */
177 size_t *ret_dses_num, char ***ret_dses)
179 char *rrd_argv[] = { "info", file, NULL };
180 int rrd_argc = (sizeof (rrd_argv) / sizeof (rrd_argv[0])) - 1;
188 info = rrd_info (rrd_argc, rrd_argv);
191 printf ("%s: rrd_info (%s) failed.\n", __func__, file);
195 for (ptr = info; ptr != NULL; ptr = ptr->next)
202 if (strncmp ("ds[", ptr->key, strlen ("ds[")) != 0)
205 keylen = strlen (ptr->key);
206 if (keylen < strlen ("ds[?].index"))
209 dslen = keylen - strlen ("ds[].index");
212 if (strcmp ("].index", ptr->key + (strlen ("ds[") + dslen)) != 0)
215 ds = malloc (dslen + 1);
219 memcpy (ds, ptr->key + strlen ("ds["), dslen);
222 tmp = realloc (dses, sizeof (*dses) * (dses_num + 1));
234 rrd_info_free (info);
238 assert (dses == NULL);
242 *ret_dses_num = dses_num;
246 } /* }}} int ds_list_from_rrd_file */
248 /* vim: set sw=2 sts=2 et fdm=marker : */