On Thu, Jan 14, 2016 at 09:47:37AM +0000, Dimitris Papastamos wrote: > On Thu, Jan 14, 2016 at 09:02:43PM +1300, David Phillips wrote: > > The child thread was created because execlp will not return if successful. > > The eprintf was placed after the call to execlp to catch any error, but the > > child continued to return a (closed) fds[0], resulting in a second slideshow > > being run by the child. > > > > This commit fixes the issue by killing the child. > > --- > > sent.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/sent.c b/sent.c > > index fc5e389..88abe90 100644 > > --- a/sent.c > > +++ b/sent.c > > @@ -153,7 +153,7 @@ filter(int fd, const char *cmd) > > close(fds[0]); > > close(fds[1]); > > execlp(cmd, cmd, (char *)0); > > - eprintf("execlp %s:", cmd); > > + die("execlp %s:", cmd); > > } > > close(fds[1]); > > return fds[0]; > > -- > > 2.6.2 > > > > I should mention there are many more places in the code where this > issue happens.
You are probably right, but this one was the most annoying one to try and understand the cause of up until the penny finally dropped. > On BSD there is err() and warn() which makes it very clear which one > is fatal. > > One approach is to keep die() and rename eprintf() to something more > appropriate. > > Otherwise we can use the approach in sbase which is to have eprintf() > be equivalent to die() and weprintf() for just the warning version. > I will submit a patch to this effect shortly and see what others make of it. Cheers
signature.asc
Description: PGP signature