From e56cbe1193c2a6f676a19bcf9cdcb45c2983f7df Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Mon, 1 Jun 2020 15:52:22 -0400 Subject: Allow redirecting input in ever --- bin/ever.c | 33 ++++++++++++++++++++++++++------- bin/man1/ever.1 | 16 +++++++++++++++- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/bin/ever.c b/bin/ever.c index da18c968..7838af4b 100644 --- a/bin/ever.c +++ b/bin/ever.c @@ -18,13 +18,14 @@ #include #include +#include #include #include #include #include #include -static void watch(int kq, char *path) { +static int watch(int kq, char *path) { int fd = open(path, O_CLOEXEC); if (fd < 0) err(EX_NOINPUT, "%s", path); @@ -40,13 +41,16 @@ static void watch(int kq, char *path) { ); int nevents = kevent(kq, &event, 1, NULL, 0, NULL); if (nevents < 0) err(EX_OSERR, "kevent"); + + return fd; } -static void exec(char *const argv[]) { +static void exec(int fd, char *const argv[]) { pid_t pid = fork(); if (pid < 0) err(EX_OSERR, "fork"); if (!pid) { + dup2(fd, STDIN_FILENO); execvp(*argv, argv); err(EX_NOINPUT, "%s", *argv); } @@ -65,13 +69,23 @@ static void exec(char *const argv[]) { } int main(int argc, char *argv[]) { - if (argc < 3) return EX_USAGE; + bool input = false; + + for (int opt; 0 < (opt = getopt(argc, argv, "i"));) { + switch (opt) { + break; case 'i': input = true; + break; default: return EX_USAGE; + } + } + argc -= optind; + argv += optind; + if (argc < 2) return EX_USAGE; int kq = kqueue(); if (kq < 0) err(EX_OSERR, "kqueue"); int i; - for (i = 1; i < argc - 1; ++i) { + for (i = 0; i < argc - 1; ++i) { if (argv[i][0] == '-') { i++; break; @@ -79,7 +93,9 @@ int main(int argc, char *argv[]) { watch(kq, argv[i]); } - exec(&argv[i]); + if (!input) { + exec(STDIN_FILENO, &argv[i]); + } for (;;) { struct kevent event; @@ -89,9 +105,12 @@ int main(int argc, char *argv[]) { if (event.fflags & NOTE_DELETE) { close(event.ident); sleep(1); - watch(kq, (char *)event.udata); + event.ident = watch(kq, (char *)event.udata); + } else if (input) { + off_t off = lseek(event.ident, 0, SEEK_SET); + if (off < 0) err(EX_IOERR, "lseek"); } - exec(&argv[i]); + exec((input ? event.ident : STDIN_FILENO), &argv[i]); } } diff --git a/bin/man1/ever.1 b/bin/man1/ever.1 index cde6d9b9..7689c5fb 100644 --- a/bin/man1/ever.1 +++ b/bin/man1/ever.1 @@ -1,4 +1,4 @@ -.Dd August 28, 2019 +.Dd June 1, 2020 .Dt EVER 1 .Os . @@ -8,9 +8,11 @@ . .Sh SYNOPSIS .Nm +.Op Fl i .Ar .Ar command .Nm +.Op Fl i .Ar .Fl - .Ar command @@ -24,9 +26,21 @@ whenever .Ar file is modified. . +.Pp +The arguments are as follows: +.Bl -tag -width Ds +.It Fl i +Attach the +.Ar file +which was modified +to the standard input of +.Ar command . +.El +. .Sh EXAMPLES .Dl ever ever.c make .Dl ever when.y ever.c -- make when ever +.Dl ever -i ever.1 mandoc . .Sh CAVEATS .Nm -- cgit 1.4.1 ae28246dc4569086a9e0f3a09bef935&follow=1'>Note lack of macro expansions in Q(...)June McEnroe 2020-12-02Fix missing "to" in "hot tips"June McEnroe 2020-12-02Publish "hot tips"June McEnroe 2020-11-26Publish "Inability"June McEnroe I don't know, it's something. 2020-11-26Render content into atom feedJune McEnroe And fix some atom lints. 2020-11-26Update plan with different things I won't doJune McEnroe 2020-11-19Add "Come On Petunia"June McEnroe 2020-11-13Add x4 to LESSJune McEnroe 2020-11-04Remove modified sensitivity settingsJune McEnroe 2020-10-29Remove editJune McEnroe 2020-10-27Switch gr alias back to git rebaseJune McEnroe I always type out git reset and sometimes still expect gr to be rebase... Never got used to it I guess. 2020-10-27Allow cd host: to cd to same path over sshJune McEnroe 2020-10-27Use SendEnv for cd host:pathJune McEnroe Works properly for weird paths, etc. 2020-10-27Allow cd host:path over sshJune McEnroe Requires AcceptEnv SSH_CD in the remote sshd_config. 2020-10-07Use mandoc -T utf8 for text.June McEnroe Don't depend on LANG being set. 2020-09-20Add The Awakened KingdomJune McEnroe A cute extra novella. Finally finished this series. 2020-09-12Move /opt/local back, cheat port select to use system manJune McEnroe This is not really how you're supposed to use the select system, I don't think, since the mandoc package actually creates those files, but it does work. This lets me actually use the git installed by MacPorts. 2020-09-12Move /opt/local behind /usr againJune McEnroe The reason I did this with pkgsrc was because I actually don't want the man(1) from mandoc, since it won't follow MANSECT. Same applies to MacPorts. I wish I could disable its man(1) with a variant or whatever. 2020-09-12Enable toc in cgit renderings of man pagesJune McEnroe But keep it disabled for READMEs since they always use non-standard sections and the TOC is just distracting there, I think. Also add the style so its h1 is the same size as the ones inside sections... 2020-09-11Install mandoc on macOSJune McEnroe 2020-09-11Rewrite install script yet againJune McEnroe 2020-09-11Remove NetBSD from install scriptJune McEnroe I never use it. 2020-09-11Use MacPorts rather than pkgsrcJune McEnroe My system is probably such a mess now... 2020-09-11Add debian VM name to sshJune McEnroe 2020-09-11Add influencer tweetJune McEnroe 2020-09-10Add The Kingdom of GodsJune McEnroe Reading has really slowed down :( 2020-09-07Add SunglassesJune McEnroe An IRC find. 2020-09-06Add Between the BreathsJune McEnroe One of those good songs from a soundtrack of a film that probably isn't? The summary sounds a lot more interesting than the title implies, at least. 2020-09-04Open /dev/tty in nudgeJune McEnroe This makes it work even when it's run connected to a pipe, i.e. as the notify command of catgirl... 2020-09-04Add nudgeJune McEnroe 2020-09-03Build fbclock with -lzJune McEnroe I guess this got lost somewhere, long ago... 2020-08-29Add tweets from retweetsJune McEnroe