Environment variable does not work (especially DARCS_EDITOR)

Simon Marlow simonmar at microsoft.com
Tue Apr 19 06:36:37 EDT 2005


On 16 April 2005 20:41, Benedikt Schmidt wrote:

> [ crossposted to libraries at haskell.org ]
> Tommy Pettersson <ptp at lysator.liu.se> writes:
> 
>> A likely source of the problem can be that pico aborts if its
>> stdin or stdout isn't a tty.  I have that problem with nvi.
>> If you run darcs 1.0.2 you can try and set DARCS_EDITOR to
>> "pico </dev/tty >/dev/tty".  If you run a later build you
>> may have to write a wrapper script like
>> 
>>   #!/bin/sh
>>   pico </dev/tty >/dev/tty
>> 
>> since the to-be-next stable darcs not always perform the
>> redirection on the system call any longer.
>> 
>> Or, if this turns out to be the problem, and if you know how
>> to make darcs do this redirection of stdin/out in a portable
>> way, fix it in the darcs source.
> 
> The problem seems to be related to rawSystem and the ghc RTS (at
> least GHC 6.4). GHC sets stdin/stdout/stderr to nonblocking mode
> on startup and nvi doesn't like that. There is a comment in
> ghc/rts/RtsUtils.c that resetNonBlockingFd is called before
> exiting because leaving standard file descriptors in nonblocking
> mode confuses some shells.
> 
> module Main where
> import System.Cmd
> main = rawSystem "nvi" []
> 
> The test program works after applying the following patch to GHC
> that disables nonblocking mode after the fork and before the exec.
> 
> diff -u -r1.7 runProcess.c
> --- libraries/base/cbits/runProcess.c   27 Mar 2005 13:41:19 -0000   
> 1.7 +++ libraries/base/cbits/runProcess.c   16 Apr 2005 19:08:52 -0000
> @@ -62,6 +62,10 @@
>             dfl.sa_handler = (void *)quithandler;
>             (void)sigaction(SIGQUIT,  &dfl, NULL);
>         }
> +
> +        resetNonBlockingFd(fdStdInput);
> +        resetNonBlockingFd(fdStdOutput);
> +        resetNonBlockingFd(fdStdError);
> 
>         dup2 (fdStdInput,  STDIN_FILENO);
>         dup2 (fdStdOutput, STDOUT_FILENO);
> 
> I'm not sure how to handle that in darcs without
> copying/reimplementing the parts of System.Cmd we need.

If we did this, we would also need to re-enable non-blocking mode after
the rawSystem completes.  Also, this doesn't work well if runProcess is
used and the Haskell program continues to run while the subprocess is
executing, because the O_NONBLOCK flag is shared between parent and
child.

So I suggest doing this for System.Cmd.{system,rawSystem} only.

Cheers,
	Simon


More information about the Libraries mailing list