[Hackage] #473: Cabal-1.6 does not work on Windows with ghc-6.6.x
Hackage
trac at galois.com
Thu Jan 22 12:13:51 EST 2009
#473: Cabal-1.6 does not work on Windows with ghc-6.6.x
----------------------------------+-----------------------------------------
Reporter: duncan | Owner:
Type: defect | Status: new
Priority: normal | Milestone: Cabal-1.6
Component: Cabal library | Version: 1.6.0.1
Severity: normal | Keywords:
Difficulty: very easy (<1 hour) | Ghcversion: 6.6.1
Platform: Windows |
----------------------------------+-----------------------------------------
http://haskell.org/pipermail/cabal-devel/2009-January/004622.html
The problem is the `writeFileAtomic` function calls the compat version of
`openNewBinaryFile` and that fails on Windows with ghc-6.6. Specifically
it is the `fdToHandle` that throws the exception.
The crux is:
{{{
fd <- withCString filepath $ \ f ->
c_open f oflags 0o666
h <- fdToHandle (fromIntegral fd)
}}}
However `fdToHandle` fails with the exception
{{{
fdGetMode: invalid argument
}}}
This is because in ghc-6.6.x, the `fdToHandle` calls `fdGetMode` and
passes the result to `openFd`:
{{{
fdToHandle :: FD -> IO Handle
fdToHandle fd = do
mode <- fdGetMode fd
let fd_str = "<file descriptor: " ++ show fd ++ ">"
openFd fd Nothing False{-XXX!-} fd_str mode True{-bin mode-}
}}}
However `fdGetMode` is described thusly:
{{{
fdGetMode fd = do
#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
-- XXX: this code is *BROKEN*, _setmode only deals with
O_TEXT/O_BINARY
}}}
Note that the `openBinaryTempFile` function does not call `fdToHandle`,
instead it bypasses it and calls `openFd` directly.
The `openFd` function is exported from `GHC.Handle` so we could use it in
`Distribution.Compat.TempFile`
--
Ticket URL: <http://hackage.haskell.org/trac/hackage/ticket/473>
Hackage <http://haskell.org/cabal/>
Hackage: Cabal and related projects
More information about the cabal-devel
mailing list