    {-# LINE 1 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}
    module System.Directory.Internal.Posix where
    {-# LINE 2 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    {-# LINE 3 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    {-# LINE 4 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    {-# LINE 5 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    {-# LINE 6 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    {-# LINE 7 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}
    import Prelude ()
    import System.Directory.Internal.Prelude

    -- we use the 'free' from the standard library here since it's not entirely
    -- clear whether Haskell's 'free' corresponds to the same one
    foreign import ccall unsafe "free" c_free :: Ptr a -> IO ()

    c_PATH_MAX :: Maybe Int

    {-# LINE 16 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}
    c_PATH_MAX | c_PATH_MAX' > toInteger maxValue = Nothing
               | otherwise                        = Just (fromInteger c_PATH_MAX')
      where c_PATH_MAX' = (4096)
    {-# LINE 19 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}
            maxValue    = maxBound `asTypeOf` case c_PATH_MAX of ~(Just x) -> x

    {-# LINE 23 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}

    foreign import ccall "realpath" c_realpath
      :: CString -> CString -> IO CString

    withRealpath :: CString -> (CString -> IO a) -> IO a
    withRealpath path action = case c_PATH_MAX of
      Nothing ->
        -- newer versions of POSIX support cases where the 2nd arg is NULL;
        -- hopefully that is the case here, as there is no safer way
        bracket (realpath nullPtr) c_free action
      Just pathMax ->
        -- allocate one extra just to be safe
        allocaBytes (pathMax + 1) (realpath >=> action)
      where realpath = throwErrnoIfNull "" . c_realpath path

    {-# LINE 39 "libraries/directory/System/Directory/Internal/Posix.hsc" #-}