aboutsummaryrefslogtreecommitdiff
path: root/src/IRE/Server.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/IRE/Server.hs')
-rw-r--r--src/IRE/Server.hs71
1 files changed, 36 insertions, 35 deletions
diff --git a/src/IRE/Server.hs b/src/IRE/Server.hs
index 8dabc73..3a095a5 100644
--- a/src/IRE/Server.hs
+++ b/src/IRE/Server.hs
@@ -1,24 +1,28 @@
-module IRE.Server (
- server
-) where
+module IRE.Server
+ ( server
+ ) where
-import Control.Exception.Base (throwIO, catch, bracket)
-import Data.Yaml.Include (decodeFileEither)
+import Control.Exception.Base (bracket, catch, throwIO)
import Data.Bits ((.|.))
-import Network.Socket (socket, setSocketOption, bind, listen, close,
- maxListenQueue, getSocketName, inet_addr, Family(AF_UNIX, AF_INET),
- SocketType(Stream), SocketOption(ReuseAddr), Socket, SockAddr(..))
-import Network.Wai.Handler.Warp (Port, defaultSettings, runSettingsSocket)
+import Data.Yaml.Include (decodeFileEither)
+import Network.Socket
+ (Family(AF_INET, AF_UNIX), SockAddr(..), Socket,
+ SocketOption(ReuseAddr), SocketType(Stream), bind, close,
+ getSocketName, inet_addr, listen, maxListenQueue, setSocketOption,
+ socket)
+import Network.Wai.Handler.Warp
+ (Port, defaultSettings, runSettingsSocket)
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
import System.IO.Error (isDoesNotExistError)
-import System.Posix.Files ( fileExist, groupReadMode, groupWriteMode,
- ownerReadMode, ownerWriteMode, removeLink, setFileMode, socketMode )
+import System.Posix.Files
+ (fileExist, groupReadMode, groupWriteMode, ownerReadMode,
+ ownerWriteMode, removeLink, setFileMode, socketMode)
import IRE.Application (app)
import IRE.Config (ConfigFile(..), defaultConfig)
-import IRE.YOLO (newDetector)
import qualified IRE.Logging as Log
+import IRE.YOLO (newDetector)
type Listen = Either Port FilePath
@@ -29,37 +33,36 @@ server rootDir configFile = do
Log.start Log.Debug
let socketSpec =
case cfSocket cf of
- Just p -> Right p
+ Just p -> Right p
Nothing -> Left $ cfPort cf
bracket
(createSocket socketSpec)
closeSocket
- ( \sock -> do
- listen sock maxListenQueue
- runSettingsSocket defaultSettings sock =<< app rootDir net)
-
+ (\sock -> do
+ listen sock maxListenQueue
+ runSettingsSocket defaultSettings sock =<< app rootDir net)
readConfigFile :: FilePath -> IO ConfigFile
readConfigFile f = do
e <- fileExist f
- if e then do
- r <- decodeFileEither f
- case r of
- Left ex -> do
- hPutStrLn stderr $ "FATAL: " ++ f ++ ": " ++ show ex
- exitFailure
- Right cf -> return cf
- else return defaultConfig
-
+ if e
+ then do
+ r <- decodeFileEither f
+ case r of
+ Left ex -> do
+ hPutStrLn stderr $ "FATAL: " ++ f ++ ": " ++ show ex
+ exitFailure
+ Right cf -> return cf
+ else return defaultConfig
createSocket :: Listen -> IO Socket
createSocket (Right path) = do
removeIfExists path
sock <- socket AF_UNIX Stream 0
bind sock $ SockAddrUnix path
- setFileMode path $ socketMode
- .|. ownerWriteMode .|. ownerReadMode
- .|. groupWriteMode .|. groupReadMode
+ setFileMode path $
+ socketMode .|. ownerWriteMode .|. ownerReadMode .|. groupWriteMode .|.
+ groupReadMode
Log.info $ "Listening on UNIX socket `" ++ path ++ "'"
return sock
createSocket (Left port) = do
@@ -70,7 +73,6 @@ createSocket (Left port) = do
Log.info $ "Listening on localhost:" ++ show port
return sock
-
closeSocket :: Socket -> IO ()
closeSocket sock = do
name <- getSocketName sock
@@ -79,10 +81,9 @@ closeSocket sock = do
SockAddrUnix path -> removeIfExists path
_ -> return ()
-
removeIfExists :: FilePath -> IO ()
removeIfExists fileName = removeLink fileName `catch` handleExists
- where handleExists e
- | isDoesNotExistError e = return ()
- | otherwise = throwIO e
-
+ where
+ handleExists e
+ | isDoesNotExistError e = return ()
+ | otherwise = throwIO e