]> git.immae.eu Git - github/fretlink/haskell-graylog.git/blobdiff - src/Graylog/Types.hs
Defined Graylog type to contain connection informaiton.
[github/fretlink/haskell-graylog.git] / src / Graylog / Types.hs
diff --git a/src/Graylog/Types.hs b/src/Graylog/Types.hs
new file mode 100644 (file)
index 0000000..e18826b
--- /dev/null
@@ -0,0 +1,42 @@
+{-# LANGUAGE RecordWildCards #-}
+
+module Graylog.Types
+   ( Graylog
+   , _graylogHost
+   , _graylogPort
+   , _graylogAddress
+
+   , openGraylog
+   , closeGraylog
+   ) where
+
+import           Data.Text      (Text)
+import qualified Data.Text      as T
+import           Network.BSD
+import           Network.Socket
+
+data Graylog
+   = Graylog
+      { _graylogHost     :: String
+      , _graylogPort     :: String
+      , _graylogAddress  :: AddrInfo
+      , _graylogSocket   :: Socket
+      , _graylogHostName :: Text
+      }
+
+openGraylog :: HostName -> ServiceName -> IO (Either String Graylog)
+openGraylog host port = do
+   infos <- getAddrInfo Nothing (Just host) (Just port)
+   case infos of
+      []     -> return $ Left "No address info found."
+      [info] -> do
+         sock <- socket (addrFamily info) Datagram defaultProtocol
+         connect sock (addrAddress info)
+         hostname <- getHostName
+         return $ Right $ Graylog host port info sock (T.pack hostname)
+      _      -> return $ Left "Too many address infos found."
+
+closeGraylog :: Graylog -> IO ()
+closeGraylog Graylog{..} = close _graylogSocket
+
+