From: Jeff King Date: Thu, 19 Apr 2012 06:03:26 GMT Subject: Re: [PATCH] t5570: forward git-daemon messages in a different way Message-ID: <20120419060326.GA13982@sigill.intra.peff.net> In-Reply-To: <20120416224424.GA10314@ecki> On Tue, Apr 17, 2012 at 12:44:25AM +0200, Clemens Buchacher wrote: > On Mon, Apr 16, 2012 at 01:42:30PM -0400, Jeff King wrote: > > > > Hmm. t5570 seems to pass reliably on dash for me with: > > > > diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh > > index ef2d01f..9f52cb6 100644 > > --- a/t/lib-git-daemon.sh > > +++ b/t/lib-git-daemon.sh > > @@ -33,7 +33,7 @@ start_git_daemon() { > > { > > read line > > echo >&4 "$line" > > - cat >&4 & > > + cat >&4 > > > # Check expected output > > if test x"$(expr "$line" : "\[[0-9]*\] \(.*\)")" != x"Ready to rumble" > > Yes, me too. I can reproduce reliably with dash and the above fixes it > reliably. > > > But the test above does fail. > > Which one do you mean? The output check works for me. Sorry, I meant the test you posted with "yes": mkfifo fd yes >fd & pid=$! { read line echo $line cat > Is it purely luck of the timing that git-daemon never gets SIGPIPE? I > > guess the problem is that the {}-section can finish before "cat > > > No clue. But shouldn't the fork return only after the fd's have been > opened successfully? If I change cat to "(echo di; cat; echo do); sleep > 1; pgrep yes", then one can see that cat terminates right away, even > though yes is still running. It's as if cat never gets to read from the > pipe, but from /dev/null instead. A bug in dash? Hmm. Yeah, if you strace the cat, it gets an immediate EOF. And even weirder, I notice this in the strace output: clone(...) close(0) = 0 open("/dev/null", O_RDONLY) = 0 ... execve("/bin/cat", ["cat"], [/* 50 vars */]) = 0 What? The shell is literally redirecting the cat process's stdin from /dev/null. I'm totally confused. If you do "cat