{-# LANGUAGE ScopedTypeVariables #-} module Main where import Control.Concurrent.QSem import System.Posix.Daemonize (serviced,CreateDaemon(..), simpleDaemon) import Bein.Daemon.SignalHandlers (installSignalHandlers) import Bein.Daemon.Protocol import Bein.Daemon.Types import Bein.SocketHandler (listenWith) import Control.Monad.Reader (ReaderT(..)) import Control.Concurrent.STM import Database.HDBC.PostgreSQL import Bein.Configuration main :: IO () main = serviced $ simpleDaemon { program = beind, user = Just "bein", group = Just "bein" } beind :: IO () beind = getState >>= runReaderT beind' where beind' = do installSignalHandlers socketFile <- configField daemon_port listenWith daemonProtocol socketFile getState :: IO DaemonState getState = do conn <- connectPostgreSQL "dbname=bein" config <- readConfiguration conn configTV <- newTVarIO config sem <- newQSem 1 return $ State { stDb = conn, stConfigT = configTV, stSem = sem }