gameServer/hedgewars-server.hs
author nemo
Fri, 12 Nov 2010 17:53:35 -0500
branch0.9.14
changeset 4251 4b7d3507d175
parent 4247 b9fe93f187c4
child 4295 1f5604cd99be
permissions -rw-r--r--
pull bugfix into 0.9.14 avoid major performance hit when using flamethrower

{-# LANGUAGE CPP, ScopedTypeVariables #-}

module Main where

import Network.Socket
import qualified Network
import Network.BSD
import Control.Concurrent.STM
import Control.Concurrent.Chan
#if defined(NEW_EXCEPTIONS)
import qualified Control.OldException as Exception
#else
import qualified Control.Exception as Exception
#endif
import System.Log.Logger
-----------------------------------
import Opts
import CoreTypes
import OfficialServer.DBInteraction
import ServerCore
import Utils


#if !defined(mingw32_HOST_OS)
import System.Posix
#endif


setupLoggers =
    updateGlobalLogger "Clients"
        (setLevel INFO)

main = withSocketsDo $ do
#if !defined(mingw32_HOST_OS)
    installHandler sigPIPE Ignore Nothing;
    installHandler sigCHLD Ignore Nothing;
#endif

    setupLoggers

    stats <- atomically $ newTMVar (StatisticsInfo 0 0)
    dbQueriesChan <- newChan
    coreChan <- newChan
    serverInfo' <- getOpts $ newServerInfo stats coreChan dbQueriesChan
    
#if defined(OFFICIAL_SERVER)
    dbHost' <- askFromConsole "DB host: "
    dbLogin' <- askFromConsole "login: "
    dbPassword' <- askFromConsole "password: "
    let serverInfo = serverInfo'{dbHost = dbHost', dbLogin = dbLogin', dbPassword = dbPassword'}
#else
    let serverInfo = serverInfo'
#endif


    proto <- getProtocolNumber "tcp"
    Exception.bracket
        (socket AF_INET Stream proto)
        sClose
        (\sock -> do
            setSocketOption sock ReuseAddr 1
            bindSocket sock (SockAddrInet (listenPort serverInfo) iNADDR_ANY)
            listen sock maxListenQueue
            startServer serverInfo sock
        )