content: {-# LANGUAGE CPP #-}
  
  module Network.Socket.Fcntl where
  
  import qualified System.Posix.Internals
  
  #if !defined(mingw32_HOST_OS)
  import Network.Socket.Cbits
  #endif
  import Network.Socket.Imports
  
  -- | Set the nonblocking flag on Unix.
  --   On Windows, nothing is done.
  setNonBlockIfNeeded :: CInt -> IO ()
  setNonBlockIfNeeded fd =
      System.Posix.Internals.setNonBlockingFD fd True
  
  -- | Set the close_on_exec flag on Unix.
  --   On Windows, nothing is done.
  --
  --   Since 2.7.0.0.
  setCloseOnExecIfNeeded :: CInt -> IO ()
  #if defined(mingw32_HOST_OS) || defined(ghcjs_HOST_OS)
  setCloseOnExecIfNeeded _ = return ()
  #else
  setCloseOnExecIfNeeded fd = System.Posix.Internals.setCloseOnExec fd
  #endif
  
  #if !defined(mingw32_HOST_OS)
  foreign import ccall unsafe "fcntl"
    c_fcntl_read  :: CInt -> CInt -> CInt -> IO CInt
  #endif
  
  -- | Get the close_on_exec flag.
  --   On Windows, this function always returns 'False'.
  --
  --   Since 2.7.0.0.
  getCloseOnExec :: CInt -> IO Bool
  #if defined(mingw32_HOST_OS) || defined(ghcjs_HOST_OS)
  getCloseOnExec _ = return False
  #else
  getCloseOnExec fd = do
      flags <- c_fcntl_read fd fGetFd 0
      let ret = flags .&. fdCloexec
      return (ret /= 0)
  #endif
  
  -- | Get the nonblocking flag.
  --   On Windows, this function always returns 'False'.
  --
  --   Since 2.7.0.0.
  getNonBlock :: CInt -> IO Bool
  #if defined(mingw32_HOST_OS)
  getNonBlock _ = return False
  #else
  getNonBlock fd = do
      flags <- c_fcntl_read fd fGetFl 0
      let ret = flags .&. oNonBlock
      return (ret /= 0)
  #endif
  