summaryrefslogtreecommitdiff
path: root/cmd/waitfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/waitfile.c')
-rw-r--r--cmd/waitfile.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/cmd/waitfile.c b/cmd/waitfile.c
new file mode 100644
index 0000000..e994fd1
--- /dev/null
+++ b/cmd/waitfile.c
@@ -0,0 +1,82 @@
+/* SPDX-License-Identifier: ISC */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <poll.h>
+
+static int strtoui(const char *str)
+{
+ int i = 0;
+
+ if (!isdigit(*str))
+ return -1;
+
+ while (isdigit(*str)) {
+ if (i > (INT_MAX / 10))
+ return -1;
+
+ i = i * 10 + (*(str++)) - '0';
+ }
+
+ if (*str != '\0')
+ return -1;
+
+ return i;
+}
+
+static void sigproc(int signo)
+{
+ if (signo == SIGALRM) {
+ fputs("waitfile timeout\n", stderr);
+ exit(EXIT_FAILURE);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ int i, found, timeout, probetime;
+ struct stat sb;
+
+ if (argc < 4)
+ goto fail_usage;
+
+ timeout = strtoui(argv[1]);
+ probetime = strtoui(argv[2]);
+ if (timeout < 0 || probetime < 0)
+ goto fail_timeout;
+
+ signal(SIGALRM, sigproc);
+ alarm(timeout);
+
+ for (;;) {
+ found = 1;
+
+ for (i = 3; i < argc; ++i) {
+ if (stat(argv[i], &sb) != 0) {
+ found = 0;
+ break;
+ }
+ }
+
+ if (found) {
+ alarm(0);
+ break;
+ }
+
+ poll(NULL, 0, probetime);
+ }
+
+ return EXIT_SUCCESS;
+fail_timeout:
+ fputs("Timeout values must be integers!\n", stderr);
+ goto fail_usage;
+fail_usage:
+ fputs("Usage: waitfile <timeout secs> <probe time ms> FILES...\n",
+ stderr);
+ return EXIT_FAILURE;
+}