    {-# OPTIONS -cpp #-}
    -- OPTIONS required for ghc-6.4.x compat, and must appear first
    {-# LANGUAGE CPP #-}
    {-# OPTIONS_GHC -cpp #-}
    {-# OPTIONS_NHC98 -cpp #-}
    {-# OPTIONS_JHC -fcpp #-}

    module Distribution.Compat.Permissions (copyPermissions) where

    #ifndef __NHC__
    import Foreign
    import Foreign.C
    import System.Posix.Internals

    copyPermissions :: FilePath -> FilePath -> IO ()
    copyPermissions source dest = do
      allocaBytes sizeof_stat $ \ p_stat -> do
      withCString source $ \p_source -> do
      withCString dest $ \p_dest -> do
        throwErrnoIfMinus1_ "copyPermissions" $ c_stat p_source p_stat
        mode <- st_mode p_stat
        throwErrnoIfMinus1_ "copyPermissions" $ c_chmod p_dest mode

    #else
    import Directory (Permissions(..),getPermissions,setPermissions)

    -- The nhc98 version of this function is broken.  (But it is the way ghc
    -- and Hugs implemented it too, until 2008-09-13.)  Unfortunately, nhc98
    -- does not have System.Posix.Internals, so cannot (yet) do it correctly.
    copyPermissions :: FilePath -> FilePath -> IO ()
    copyPermissions source dest = do
      perms <- getPermissions source
      setPermissions dest perms
    #endif