-- | Verification of the socket recipient PID

module SocketActivation.CheckRecipient where

import Essentials

import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Either (Either)
import System.IO (IO)

import qualified Control.Monad as Monad
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 do
    Recipient
recipient <- forall a. IO (Either Error a) -> IO' a
IO' forall a b. (a -> b) -> a -> b
$ forall a. Env' a => IO (Either Error a)
getEnv' @Recipient
    forall a. IO (Either Error a) -> IO' a
IO' forall a b. (a -> b) -> a -> b
$ Recipient -> IO (Either Error ())
checkRecipient' Recipient
recipient

checkRecipient' :: Recipient -> IO (Either Error ())
checkRecipient' :: Recipient -> IO (Either Error ())
checkRecipient' Recipient
recipient = forall a. IO' a -> IO (Either Error a)
run do
    ProcessID
myPid <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ProcessID
Sys.getProcessID
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.unless (Recipient -> ProcessID
recipientPID Recipient
recipient forall a. Eq a => a -> a -> Bool
== ProcessID
myPid) forall a b. (a -> b) -> a -> b
$ forall a. Error -> IO' a
throwError Error
WrongProcess