Skip to content

Instantly share code, notes, and snippets.

@solomon-b
Created December 24, 2018 00:29
Show Gist options
  • Save solomon-b/181f848d8e4b41b725651e4385f05ce0 to your computer and use it in GitHub Desktop.
Save solomon-b/181f848d8e4b41b725651e4385f05ce0 to your computer and use it in GitHub Desktop.
mainLoop :: Connection -> Socket -> Endpoint -> IO ()
mainLoop dbConn sock endpoint = do
(sock', _) <- accept sock
putStrLn "Got connection, handling query"
case endpoint of
Fingerd -> handleQuery dbConn sock' >> mainLoop dbConn sock Fingerd
Controld -> handleControlQuery dbConn sock' >> mainLoop dbConn sock Controld
fingerd :: Integer -> IO ()
fingerd port = do
sock <- createSocket port
conn <- open "finger.db"
mainLoop conn sock Fingerd
SQLite.close conn
close sock
controld :: Integer -> IO ()
controld port = do
sock <- createSocket port
conn <- open "finger.db"
mainLoop conn sock Controld
SQLite.close conn
close sock
createSocket :: Integer -> IO Socket
createSocket port = do
addrinfos <- getAddrInfo (Just (defaultHints {addrFlags = [AI_PASSIVE]}))
Nothing (Just $ show port)
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Stream defaultProtocol
bind sock (addrAddress serveraddr)
listen sock 1
return sock
main :: IO ()
main = withSocketsDo $ do
_ <- forkIO $ fingerd 79
controld 78
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment