    module GHC.Environment (getFullArgs) where

    import Prelude
    import Foreign
    import Foreign.C
    import Control.Monad

    getFullArgs :: IO [String]
    getFullArgs =
      alloca $ \ p_argc ->
      alloca $ \ p_argv -> do
       getFullProgArgv p_argc p_argv
       p    <- fromIntegral `liftM` peek p_argc
       argv <- peek p_argv
       peekArray (p - 1) (advancePtr argv 1) >>= mapM peekCString

    foreign import ccall unsafe "getFullProgArgv"
        getFullProgArgv :: Ptr CInt -> Ptr (Ptr CString) -> IO ()