summaryrefslogtreecommitdiff
path: root/cmd/statrep/generic.ha
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/statrep/generic.ha')
-rw-r--r--cmd/statrep/generic.ha41
1 files changed, 41 insertions, 0 deletions
diff --git a/cmd/statrep/generic.ha b/cmd/statrep/generic.ha
new file mode 100644
index 0000000..fb61ab0
--- /dev/null
+++ b/cmd/statrep/generic.ha
@@ -0,0 +1,41 @@
+use os::exec;
+use shlex;
+use strings;
+use io;
+use os;
+
+type generic = struct {
+ section: section,
+ cmd: str,
+ value: str,
+};
+
+fn buildgeneric(cmd: str) generic = {
+ let gen = generic {
+ section = section {
+ label = "generic: ",
+ },
+ cmd = cmd,
+ ...
+ };
+ updategeneric(&gen)!;
+ return gen;
+};
+
+fn updategeneric(gen: *generic) (void | shlex::syntaxerr | exec::error) = {
+ const spl = shlex::split(gen.cmd)?;
+ const cmd = exec::cmd(spl[0], spl[1..]...)?;
+ let pipe = exec::pipe();
+ exec::addfile(&cmd, os::stdout_file, pipe.1);
+ let proc = exec::start(&cmd)?;
+ io::close(pipe.1)!;
+ let data = io::drain(pipe.0)!;
+ defer free(data);
+ io::close(pipe.0)!;
+ exec::wait(&proc)!;
+ gen.value = strings::dup(strings::trim(strings::fromutf8(data)!));
+};
+
+fn finishgeneric(gen: *generic) void = {
+ free(gen.value);
+};