module SocketActivation.Concepts
( Recipient (..)
, ProcessID
, Count (..)
, Name (..)
, Names (..)
, VarName (..)
, Fd (..)
, Socket
, Error (..)
) where
import Control.Exception (Exception)
import Data.String (IsString)
import Data.Text (Text)
import Numeric.Natural (Natural)
import Prelude (Bounded, Enum, Eq, Ord, Show)
import Network.Socket (Socket)
import System.Posix.Types (Fd (..), ProcessID)
-- | The ID of the process to whom systemd has given the sockets. A process should not use sockets that are intended for someone else, so we should always check that this matches our own PID before proceeding doing anything with the sockets.
newtype Recipient = RecipientPID { recipientPID :: ProcessID }
deriving stock (Eq, Show)
-- | The number of sockets that systemd has given the process.
newtype Count = CountNat { countNat :: Natural }
deriving stock (Eq, Show)
-- | The name of a socket, corresponding to the socket's FileDescriptorName in the systemd config.
newtype Name = NameText { nameText :: Text }
deriving stock (Eq, Ord, Show)
deriving newtype IsString
-- | The names of the sockets that we have been given, corresponding to the FileDescriptorName of each systemd socket.
newtype Names = NamesList { namesList :: [Name] }
deriving stock (Eq, Show)
data VarName = LISTEN_PID | LISTEN_FDS | LISTEN_FDNAMES
deriving stock (Eq, Show, Enum, Bounded)
data Error = Missing VarName | Invalid VarName | WrongProcess | NoSuchName Name
deriving stock Show
deriving anyclass Exception