loshadka-0.2: Network/Loshadka/Server.hs
module Network.Loshadka.Server (serve) where
import Network.Loshadka.Protocol
import Network.Loshadka.Settings
import qualified Data.ByteString.Lazy.Char8 as B
import System.Cmd (system)
import Network (Socket, PortID(PortNumber), listenOn, sClose)
import Network.Socket (accept)
import Network.Socket.ByteString.Lazy (sendAll, recv)
import Control.Concurrent (forkIO)
serve :: Settings -> IO()
serve settings = do
sock <- listenOn $ PortNumber (port settings)
loop sock settings
loop :: Socket -> Settings -> IO()
loop sock ss = do
(conn, _) <- accept sock
_ <- forkIO $ handleRequest sock conn ss
loop sock ss
handleRequest :: Socket -> Socket -> Settings -> IO()
handleRequest sock conn ss = do
handshake <- recv conn 256
respond sock conn ss $ B.last handshake
sClose conn
respond :: Socket -> Socket -> Settings -> Char -> IO()
respond _ conn ss '\x01' = do
_ <- recv conn 2
sendAll conn (ping $ responses ss)
respond sock conn ss '\x02' = do
--username <- recv conn 64
sendAll conn (start $ responses ss)
sClose sock
_ <- system $ command ss
sClose conn
respond _ conn ss _ = sendAll conn (denied $ responses ss)