about summary refs log tree commit diff
path: root/textfile.c
diff options
context:
space:
mode:
authorHeikki Kallasjoki <fis@zem.fi>2018-08-05 23:50:20 +0100
committerHeikki Kallasjoki <fis@zem.fi>2018-08-05 23:50:20 +0100
commitc73aca3d51a9ce915b089d92ea9a43ec49ef63f0 (patch)
tree4a75083b7470679ad7aed217749a457bbf259996 /textfile.c
downloadnano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.tar.gz
nano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.tar.xz
nano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.zip
Initial prototype.
Diffstat (limited to 'textfile.c')
-rw-r--r--textfile.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/textfile.c b/textfile.c
new file mode 100644
index 0000000..b571f27
--- /dev/null
+++ b/textfile.c
@@ -0,0 +1,59 @@
+#include <stdbool.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "textfile.h"
+#include "util.h"
+
+void *textfile_init(int argc, char *argv[]);
+void textfile_collect(scrape_req *req, void *ctx);
+
+const struct collector textfile_collector = {
+  .name = "textfile",
+  .collect = textfile_collect,
+  .init = textfile_init,
+  .has_args = true,
+};
+
+void *textfile_init(int argc, char *argv[]) {
+  const char *dir = "."; // TODO: default
+  // TODO: parse arg
+  return must_strdup(dir);
+}
+
+void textfile_collect(scrape_req *req, void *ctx) {
+  const char *dir = ctx;
+
+  DIR *d = opendir(dir);
+  if (!d)
+    return;
+
+  struct dirent *dent;
+  char buf[4096];
+
+  while ((dent = readdir(d))) {
+    size_t name_len = strlen(dent->d_name);
+    if (name_len < 6 || strcmp(dent->d_name + name_len - 5, ".prom") != 0)
+      continue;
+
+    snprintf(buf, sizeof buf, "%s/%s", dir, dent->d_name);
+    FILE *f = fopen(buf, "r");
+    if (!f)
+      continue;
+
+    bool has_newline = true;
+    size_t len;
+    while ((len = fread(buf, 1, sizeof buf, f)) > 0) {
+      scrape_write_raw(req, buf, len);
+      has_newline = buf[len - 1] == '\n';
+    }
+    if (!has_newline)
+      scrape_write_raw(req, (char[]){'\n'}, 1);
+
+    fclose(f);
+  }
+
+  closedir(d);
+}