diff options
author | Heikki Kallasjoki <fis@zem.fi> | 2018-08-05 23:50:20 +0100 |
---|---|---|
committer | Heikki Kallasjoki <fis@zem.fi> | 2018-08-05 23:50:20 +0100 |
commit | c73aca3d51a9ce915b089d92ea9a43ec49ef63f0 (patch) | |
tree | 4a75083b7470679ad7aed217749a457bbf259996 /textfile.c | |
download | nano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.tar.gz nano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.tar.xz nano-exporter-c73aca3d51a9ce915b089d92ea9a43ec49ef63f0.zip |
Initial prototype.
Diffstat (limited to 'textfile.c')
-rw-r--r-- | textfile.c | 59 |
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); +} |