-- | Verification of the socket recipient PID

module SocketActivation.CheckRecipient where

import Control.Monad (Monad (return, (>>=)))
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Either (Either)
import Data.Eq (Eq ((==)))
import Data.Function ((.))
import System.IO (IO)

import qualified System.Posix.Process as Sys

import SocketActivation.Concepts (Error(WrongProcess), Recipient (recipientPID))
import SocketActivation.Env (getEnv')
import SocketActivation.IO (IO' (IO', run), throwError)

checkRecipient :: IO (Either Error ())
checkRecipient :: IO (Either Error ())
checkRecipient = forall a. IO' a -> IO (Either Error a)
run (IO' Recipient
getIt forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Recipient -> IO' ()
checkIt)
  where
    getIt :: IO' Recipient
getIt = forall a. IO (Either Error a) -> IO' a
IO' (forall a. Env' a => IO (Either Error a)
getEnv' @Recipient)
    checkIt :: Recipient -> IO' ()
checkIt = forall a. IO (Either Error a) -> IO' a
IO' forall b c a. (b -> c) -> (a -> b) -> a -> c
. Recipient -> IO (Either Error ())
checkRecipient'

checkRecipient' :: Recipient -> IO (Either Error ())
checkRecipient' :: Recipient -> IO (Either Error ())
checkRecipient' Recipient
x = forall a. IO' a -> IO (Either Error a)
run (IO' ProcessID
getMyPid forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ProcessID -> IO' ()
throwIfDifferent)
  where
    getMyPid :: IO' ProcessID
getMyPid = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ProcessID
Sys.getProcessID
    throwIfDifferent :: ProcessID -> IO' ()
throwIfDifferent ProcessID
y =
        if Recipient -> ProcessID
recipientPID Recipient
x forall a. Eq a => a -> a -> Bool
== ProcessID
y then forall (m :: * -> *) a. Monad m => a -> m a
return () else forall a. Error -> IO' a
throwError Error
WrongProcess