packages feed

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

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