about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--catsit-watch.19
-rw-r--r--catsit-watch.c17
2 files changed, 21 insertions, 5 deletions
diff --git a/catsit-watch.1 b/catsit-watch.1
index b45f704..892fd18 100644
--- a/catsit-watch.1
+++ b/catsit-watch.1
@@ -1,4 +1,4 @@
-.Dd February 25, 2021
+.Dd February 27, 2021
 .Dt CATSIT-WATCH 1
 .Os
 .
@@ -8,7 +8,7 @@
 .
 .Sh SYNOPSIS
 .Nm
-.Op Fl i
+.Op Fl ai
 .Op Fl f Ar file
 .Ar command ...
 .
@@ -26,6 +26,11 @@ exits.
 .Pp
 The arguments are as follows:
 .Bl -tag -width Ds
+.It Fl a
+Append the path of
+the modified file
+to the arguments of
+.Ar command .
 .It Fl f Ar file
 Add
 .Ar file
diff --git a/catsit-watch.c b/catsit-watch.c
index 4d0840c..ea64155 100644
--- a/catsit-watch.c
+++ b/catsit-watch.c
@@ -20,6 +20,7 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <sys/event.h>
 #include <sys/time.h>
 #include <sys/wait.h>
@@ -64,8 +65,10 @@ int main(int argc, char *argv[]) {
 	fcntl(kq, F_SETFD, FD_CLOEXEC);
 
 	int init = 0;
-	for (int opt; 0 < (opt = getopt(argc, argv, "f:i"));) {
+	int append = 0;
+	for (int opt; 0 < (opt = getopt(argc, argv, "af:i"));) {
 		switch (opt) {
+			break; case 'a': append = 1;
 			break; case 'f': watch(kq, optarg);
 			break; case 'i': init = 1;
 			break; default: return EX_USAGE;
@@ -75,12 +78,19 @@ int main(int argc, char *argv[]) {
 	argv += optind;
 	if (!argc) errx(EX_USAGE, "command required");
 
+	char **rest = argv;
+	if (append) {
+		rest = calloc(argc + 2, sizeof(*rest));
+		if (!rest) err(EX_OSERR, "calloc");
+		memcpy(rest, argv, sizeof(*argv) * argc);
+	}
+
 #ifdef __OpenBSD__
 	int error = pledge("stdio proc exec", NULL);
 	if (error) err(EX_OSERR, "pledge");
 #endif
 
-	if (init) run(argv);
+	if (init) run(rest);
 	for (;;) {
 		struct kevent event;
 		int nevents = kevent(kq, NULL, 0, &event, 1, NULL);
@@ -89,6 +99,7 @@ int main(int argc, char *argv[]) {
 		if (event.fflags & NOTE_DELETE) {
 			errx(EX_TEMPFAIL, "%s: file removed", (char *)event.udata);
 		}
-		run(argv);
+		if (append) rest[argc] = (char *)event.udata;
+		run(rest);
 	}
 }