diff -r 878e551f0b4a -r f7a610e2ef5f gameServer/Actions.hs --- a/gameServer/Actions.hs Thu May 12 23:29:31 2011 +0200 +++ b/gameServer/Actions.hs Sun May 15 18:10:01 2011 +0400 @@ -18,6 +18,8 @@ import Control.Arrow import Control.Exception import OfficialServer.GameReplayStore +import System.Process +import Network.Socket ----------------------------- import CoreTypes import Utils @@ -57,7 +59,7 @@ | DeleteClient ClientIndex | PingAll | StatsAction - | RestartServer Bool + | RestartServer | AddNick2Bans B.ByteString B.ByteString UTCTime | AddIP2Bans B.ByteString B.ByteString UTCTime | CheckBanned @@ -153,6 +155,10 @@ s <- get put $! s{removedClients = ci `Set.delete` removedClients s} + + sp <- gets (shutdownPending . serverInfo) + cls <- allClientsS + io $ when (sp && null cls) $ throwIO ShutdownException processAction (ModifyClient f) = do (Just ci) <- gets clientIndex @@ -467,11 +473,15 @@ where st irnc = (length $ allRooms irnc, length $ allClients irnc) -processAction (RestartServer force) = do - if force then do - throw RestartException - else - processAction $ ModifyServerInfo (\s -> s{restartPending=True}) +processAction RestartServer = do + sock <- gets (fromJust . serverSocket . serverInfo) + io $ do + noticeM "Core" "Closing listening socket" + sClose sock + noticeM "Core" "Spawning new server" + _ <- createProcess (proc "./hedgewars-server" []) + return () + processAction $ ModifyServerInfo (\s -> s{shutdownPending=True}) processAction SaveReplay = do ri <- clientRoomA