diff options
-rw-r--r-- | bin/oii.mi5 | 13 | ||||
-rw-r--r-- | man/man1/oii.1df | 6 |
2 files changed, 8 insertions, 11 deletions
diff --git a/bin/oii.mi5 b/bin/oii.mi5 index 51f37fb4..914d45f9 100644 --- a/bin/oii.mi5 +++ b/bin/oii.mi5 @@ -11,9 +11,10 @@ fi include(`include/mktd.m4') %> -# There is probably a way better way to do this than writing the whole file to -# disk and then reading it off again, but until I think of something better, -# this works and is byte-safe. -cat - > "$td"/in -[ -s "$td"/in ] || exit -"$@" < "$td"/in +# Read up to one byte and save it into temp file; discard stderr (stats) +tf=$td/input +dd bs=1 count=1 of="$tf" 2>/dev/null + +# If there's now a byte in the file, spit it and the rest of the input into the +# requested command +[ -s "$tf" ] && cat -- "$tf" - | "$@" diff --git a/man/man1/oii.1df b/man/man1/oii.1df index f5bb2678..6d1cf601 100644 --- a/man/man1/oii.1df +++ b/man/man1/oii.1df @@ -1,4 +1,4 @@ -.TH OII 1df "June 2017" "Manual page for oii" +.TH OII 1df "November 2017" "Manual page for oii" .SH NAME .B oii \- run a command on input only if there's at least one byte of input @@ -13,9 +13,5 @@ CMD [ARGS ...] Run the given program passing in stdin but only if at least one byte of input is actually received, rather like the -E switch to mail(1) behaves on bsd-mailx. If no input is received, exit silently with an error status. -.SH CAVEATS -It's slow, and doesn't work as a pipe. The entire input is written to disk and -then tested for filesize before being re-emitted. There's almost certainly a -more efficient way to do this while still remaining byte-safe. .SH AUTHOR Tom Ryder <tom@sanctum.geek.nz> |