From 3bfbbf3ed9261ea131ce05fb5a5807dad341ad01 Mon Sep 17 00:00:00 2001
From: Hubert Hirtz <hubert.hirtz@laposte.net>
Date: Fri, 18 Oct 2019 10:37:35 +0200
Subject: [PATCH] Initial commit

---
 .gitignore  |  1 +
 Makefile    | 10 ++++++++
 randomfeh.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 84 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Makefile
 create mode 100644 randomfeh.c

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f049133
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+randomfeh
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f9c39aa
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+CC ?= gcc
+CFLAGS += -O3 -std=c99 -Wall -Wextra -Werror -pedantic
+
+randomfeh: randomfeh.c
+	$(CC) $(CFLAGS) -o $@ $^
+
+.PHONY: clean
+
+clean:
+	rm -f randomfeh
diff --git a/randomfeh.c b/randomfeh.c
new file mode 100644
index 0000000..14ec8c9
--- /dev/null
+++ b/randomfeh.c
@@ -0,0 +1,73 @@
+#define _POSIX_C_SOURCE 200809L
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define FEH_BIN "/usr/bin/feh"
+
+static inline void
+die(const char *format, ...)
+{
+    va_list ap;
+    va_start(ap, format);
+    vfprintf(stderr, format, ap);
+    va_end(ap);
+    exit(1);
+}
+
+static inline struct timespec
+parse_interval(const char *s)
+{
+    char *end_interval;
+    long int interval = strtol(s, &end_interval, 10);
+    struct timespec res;
+
+    if (s == end_interval)
+        die("The first argument must be an integer.\n");
+    if (interval <= 0)
+        die("The first argument must be > 0.\n");
+
+    res.tv_sec = (time_t) interval;
+    res.tv_nsec = 0;
+    return res;
+}
+
+static inline void
+spawn(const char *bin, char **argv)
+{
+    pid_t p = fork();
+    if (p < 0)
+        die("fork: %s\n", strerror(errno));
+    if (p == 0) {
+        execv(bin, argv);
+        exit(0);
+    }
+}
+
+int
+main(int argc, char **argv)
+{
+    if (argc < 3)
+        die("Usage: %s TIME PATHS...\n", argv[0]);
+
+    struct timespec interval = parse_interval(argv[1]);
+    char *feh_argv[argc + 2];
+    feh_argv[0] = FEH_BIN;
+    feh_argv[1] = "-z";
+    feh_argv[2] = "--bg-scale";
+    for (int i = 2; i < argc; i++)
+        feh_argv[i + 1] = argv[i];
+    feh_argv[argc + 1] = 0;
+
+    for (;;) {
+        spawn(FEH_BIN, feh_argv);
+        if (nanosleep(&interval, 0) < 0)
+            die("nanosleep: %s\n", strerror(errno));
+    }
+
+    return 0;
+}
-- 
GitLab