    {- |
       Maintainer:  simons@cryp.to
       Stability:   provisional
       Portability: POSIX

       FFI bindings to @syslog(3)@ from
       <http://pubs.opengroup.org/onlinepubs/9699919799/functions/syslog.html POSIX.1-2008>.
       This module is intended for purposes of low-level implementation. Users of
       this library should prefer safer and more convenient API provided by
       "System.Posix.Syslog".
    -}

    module System.Posix.Syslog.LogMask where

    import System.Posix.Syslog.Functions ( _logMask )
    import System.Posix.Syslog.Priority ( Priority, fromPriority )

    import Data.Bits
    import Foreign.C.Types

    -- | Convert a set of logging priorities into a system-dependent binary
    -- representation suitable for calling '_setlogmask'.

    toLogMask :: [Priority] -> CInt
    toLogMask = foldr (.|.) 0 . map (_logMask . fromPriority)

    -- | Decode the the system-dependent binary representation returned by
    -- '_setlogmask' back into a set of logging priorities.

    fromLogMask :: CInt -> [Priority]
    fromLogMask old = [ p | p <- [minBound..maxBound], _logMask (fromPriority p) .&. old /= 0 ]