Environment variable does not work (especially DARCS_EDITOR)

Benedikt Schmidt ry102 at rz.uni-karlsruhe.de
Sat Apr 16 15:40:36 EDT 2005

[ 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.


More information about the Libraries mailing list