summaryrefslogtreecommitdiff
path: root/src/fifoinfo.c
diff options
context:
space:
mode:
authorSam Light <sam@lightscale.co.uk>2025-09-10 19:37:28 +0100
committerSam Light <sam@lightscale.co.uk>2025-09-10 19:37:28 +0100
commit49590ebb174f8436d0f85af8e4f24bcb6f346b1d (patch)
treeb078a006ed285bd3440c919c91abac5915ca20ce /src/fifoinfo.c
parent970dcc487d7a6a6bc99e37b65ee512a2d651a583 (diff)
Created fifoinfo and sandbarinfoHEADmaster
Diffstat (limited to 'src/fifoinfo.c')
-rw-r--r--src/fifoinfo.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/fifoinfo.c b/src/fifoinfo.c
new file mode 100644
index 0000000..f4cc349
--- /dev/null
+++ b/src/fifoinfo.c
@@ -0,0 +1,94 @@
+#include "signal.h"
+#include "text.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <assert.h>
+
+struct state {
+ int fd;
+ struct text * text;
+};
+
+static int
+open_fifo(const char * path)
+{
+ if (access(path, F_OK) != 0) {
+ printf("FIFO doesn't exist\n");
+ return -1;
+ }
+
+ if (access(path, W_OK) != 0) {
+ printf("FIFO not writable\n");
+ return -1;
+ }
+
+ return open(path, O_WRONLY);
+}
+
+
+static int
+init_state(struct state * s, const char * path)
+{
+ s->text = NULL;
+
+ s->fd = open_fifo(path);
+ if(s->fd < 1) return -1;
+
+ s->text = text_new();
+ return 0;
+}
+
+static void
+deinit_state(struct state * s)
+{
+ if(s->fd > 0) close(s->fd);
+ if(s->text) text_free(s->text);
+}
+
+static void
+update_status(struct state * s)
+{
+ const size_t
+ msg_len = TEXT_SIZE + 3;
+
+ size_t actual_len;
+
+ char msg[msg_len];
+
+ text_update(s->text);
+ snprintf(msg, msg_len, " %s\n", text_get_val(s->text));
+
+ actual_len = strlen(msg);
+ write(s->fd, msg, actual_len);
+}
+
+static void
+run_loop(struct state * s)
+{
+ while(signal_running) {
+ update_status(s);
+ usleep(1000 * 800);
+ }
+}
+
+int main(int argc, char ** argv)
+{
+ int rc;
+ struct state s;
+
+ assert(argc == 2);
+
+ signal_setup_actions();
+
+ rc = init_state(&s, argv[1]);
+
+ if(rc == 0) run_loop(&s);
+
+ deinit_state(&s);
+
+ return 0;
+}