packages feed

systemd-socket-activation-1.0.0.2: src/SocketActivation/GetSockets.hs

module SocketActivation.GetSockets where

import Control.Monad (Monad ((>>=)))
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Either (Either)
import Data.Function ((.))
import Data.Traversable (Traversable (traverse))
import System.IO (IO)

import qualified Network.Socket as Net

import SocketActivation.Concepts (Socket, Fd (..), Error)
import SocketActivation.GetFileDescriptors (getFileDescriptorList)
import SocketActivation.IO (IO' (IO', run))

getSocketList :: IO (Either Error [Socket])
getSocketList = run (getFds >>= convertToSockets)
  where
    getFds = IO' getFileDescriptorList
    convertToSockets = traverse (liftIO . fdSocket)

fdSocket :: Fd -> IO Socket
fdSocket (Fd i) = Net.mkSocket i