Thanks - that change is great. Busybox tee now propagates SIGPIPE just like GNU tee does by default.
Sam On Mon, 7 Oct 2019 at 13:27, Denys Vlasenko <[email protected]> wrote: > On Fri, Oct 4, 2019 at 11:20 AM Sam Liddicott <[email protected]> wrote: > > nudge on this attached patch > > > > ---------- Forwarded message --------- > > From: Sam Liddicott <[email protected]> > > Date: Fri, 13 Sep 2019 at 11:15 > > Subject: Re: SIGPIPE and tee > > To: busybox <[email protected]> > > > > > > Here is a patch which invokes kill_myself_with_sig(SIGPIPE) if fwrite > fails with errno=EPIPE. > > > > Quitting with a signal rather than a diagnostic output emulates GNU tee > which is in line with the apparent reason for busybox tee in ignoring > SIGPIPE in the first place. > > > > > > I have tested it with and without CONFIG_FEATURE_TEE_USE_BLOCK_IO=y > > > > As expected, dd succeeds for bs=1024 with > CONFIG_FEATURE_TEE_USE_BLOCK_IO=y but fails for without. > > dd fails in both cases for bs=1024000 > > tee fails in both cases > > > > ( sleep 2 ; dd if=/dev/zero bs=1024000 count=5 ; echo dd $? > /dev/tty ; > ) | { > build_output/sysroots-components/x86_64/busybox-native/bin/busybox.nosuid > tee /dev/null ; echo tee $? >/dev/tty ; } | sleep 1 > > > > ( sleep 2 ; dd if=/dev/zero bs=1024 count=5 ; echo dd $? > /dev/tty ; ) > | { > build_output/sysroots-components/x86_64/busybox-native/bin/busybox.nosuid > tee /dev/null ; echo tee $? >/dev/tty ; } | sleep 1 > > > > A colleague has suggested that any write failure to stdout by tee ought > to cause tee to quit, but I leave this to your consideration; something > like this might cover both cases but I haven't tested it: > > > > if (fwrite(buf, 1, c, *fp) != c) { > > if (errno == EPIPE) kill_myself_with_sig(SIGPIPE); > > retval = EXIT_FAILURE; > > break; > > } > > > > Sam > > > > > > On Thu, 12 Sep 2019 at 20:03, Sam Liddicott <[email protected]> wrote: > >> > >> In https://git.busybox.net/busybox/tree/coreutils/tee.c we read: > >> > >> /* gnu tee ignores SIGPIPE in case one of the output files is a pipe > >> * that doesn't consume all its input. Good idea... */ > >> signal(SIGPIPE, SIG_IGN); > >> > >> > >> Sadly, this breaks POSIX SIGPIPE behaviour with respect to quitting > when stdout (as a pipe) is closed. > >> > >> Despite the comment, GNU tee does not behave as the comment suggests. > > Exactly. GNU tee does not intercept SIGPIPE (unless -p is given). > I'm removing SIGPIPE handling. > Please try current git. >
_______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
