{-# OPTIONS_GHC -optc-D__GLASGOW_HASKELL__=604 #-}
{-# INCLUDE <syslog.h> #-}
{-# LINE 1 "Logger.hsc" #-}
-----------------------------------------------------------------------------
{-# LINE 2 "Logger.hsc" #-}
-- |
-- Module      :  Conjure.Logger
-- Copyright   :  (c) Lemmih 2006
-- License     :  BSD-like
--
-- Maintainer  :  lemmih@gmail.com
-- Stability   :  experimental
-- Portability :  non-portable (POSIX)
--
-----------------------------------------------------------------------------
-- FIXME: What do we do on Windows?

{-# LINE 14 "Logger.hsc" #-}
module Conjure.Logger
    ( Mask
    , Option (..)
    , Priority (..)
    , setlogmask
    , openlog
    , syslog
    , closelog
    ) where

import Foreign
import Foreign.C
import Data.Bits

foreign import ccall unsafe "openlog" c_openlog :: CString -> Int -> Int -> IO ()
foreign import ccall unsafe "syslog" c_syslog :: Int -> CString -> CString -> IO ()
foreign import ccall unsafe "closelog" closelog :: IO ()
foreign import ccall unsafe "setlogmask" c_setlogmask :: Int -> IO Int

data Mask
    = Bitmask [Priority]
    | Upto Priority

logMask p = 1 `shiftL` fromPriority p
logUpto p = 1 `shiftL` fromPriority p

fromMask (Bitmask ps)
    = foldr (.|.) 0 (map logMask ps)
fromMask (Upto p)
    = logUpto p

setlogmask :: Mask -> IO ()
setlogmask mask
    = do c_setlogmask (fromMask mask)
         return ()

data Option
    = Console
    | NoDelay
    | NoWait
    | Delay
    | PError
    | PID

fromOption Console = 2
{-# LINE 59 "Logger.hsc" #-}
fromOption NoDelay = 8
{-# LINE 60 "Logger.hsc" #-}
fromOption NoWait = 16
{-# LINE 61 "Logger.hsc" #-}
fromOption Delay = 4
{-# LINE 62 "Logger.hsc" #-}
fromOption PError = 32
{-# LINE 63 "Logger.hsc" #-}
fromOption PID = 1
{-# LINE 64 "Logger.hsc" #-}

openlog :: [Option] -> String -> IO ()
openlog options ident
    = withCString ident $ \cstr ->
      c_openlog cstr (foldr (.|.) 0 (map fromOption options))
                8
{-# LINE 70 "Logger.hsc" #-}

data Priority
    = Emergency
    | Alert
    | Critical
    | Error
    | Warning
    | Notice
    | Info
    | Debug

fromPriority :: Priority -> Int
fromPriority Emergency = 0
{-# LINE 83 "Logger.hsc" #-}
fromPriority Alert = 1
{-# LINE 84 "Logger.hsc" #-}
fromPriority Critical = 2
{-# LINE 85 "Logger.hsc" #-}
fromPriority Error = 3
{-# LINE 86 "Logger.hsc" #-}
fromPriority Warning = 4
{-# LINE 87 "Logger.hsc" #-}
fromPriority Notice = 5
{-# LINE 88 "Logger.hsc" #-}
fromPriority Info = 6
{-# LINE 89 "Logger.hsc" #-}
fromPriority Debug= 7
{-# LINE 90 "Logger.hsc" #-}

syslog :: Priority -> String -> IO ()
syslog priority msg
    = withCString "%s" $ \format ->
      withCString msg $ \cstr ->
      c_syslog (fromPriority priority) format cstr

