packages feed

hslogger 1.2.1 → 1.2.2

raw patch · 2 files changed

+37/−11 lines, 2 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- System.Log.Handler.Syslog: openlog_generic :: Socket -> SockAddr -> String -> [Option] -> Facility -> Priority -> IO SyslogHandler
+ System.Log.Handler.Syslog: openlog_generic :: Socket -> SockAddr -> SocketType -> String -> [Option] -> Facility -> Priority -> IO SyslogHandler

Files

hslogger.cabal view
@@ -1,5 +1,5 @@ Name: hslogger-Version: 1.2.1+Version: 1.2.2 License: BSD3 Maintainer: John Goerzen <jgoerzen@complete.org> Author: John Goerzen
src/System/Log/Handler/Syslog.hs view
@@ -42,11 +42,12 @@                                        Option(..)                                        ) where +import qualified Control.Exception as E import System.Log import System.Log.Formatter import System.Log.Handler import Data.Bits-import Network.Socket+import Network.Socket as S import Network.BSD import Data.List #ifndef mingw32_HOST_OS@@ -131,6 +132,7 @@                                     identity :: String,                                     logsocket :: Socket,                                     address :: SockAddr,+                                    sock_type :: SocketType,                                     priority :: Priority,                                     formatter :: LogFormatter SyslogHandler                                    }@@ -171,9 +173,29 @@               -> Priority               -- ^ Priority limit               -> IO SyslogHandler openlog_local fifopath ident options fac pri =-    do-    s <- socket AF_UNIX Datagram 0-    openlog_generic s (SockAddrUnix fifopath) ident options fac pri+    do (s, t) <- do -- "/dev/log" is usually Datagram,+                    -- but most of syslog loggers allow it to be+                    -- of Stream type. glibc's" openlog()"+                    -- does roughly the similar thing:+                    --     http://www.gnu.org/software/libc/manual/html_node/openlog.html++                    s <- socket AF_UNIX Stream 0+                    tryStream s `E.catch` (onIOException (fallbackToDgram s))+       openlog_generic s (SockAddrUnix fifopath) t ident options fac pri++  where onIOException :: IO a -> E.IOException -> IO a+        onIOException a _ = a++        tryStream :: Socket -> IO (Socket, SocketType)+        tryStream s =+            do connect s (SockAddrUnix fifopath)+               return (s, Stream)++        fallbackToDgram :: Socket -> IO (Socket, SocketType)+        fallbackToDgram s =+            do S.close s -- close Stream variant+               d <- socket AF_UNIX Datagram 0+               return (d, Datagram) #endif  {- | Log to a remote server via UDP. -}@@ -190,23 +212,25 @@     he <- getHostByName hostname     s <- socket fam Datagram 0     let addr = SockAddrInet port (head (hostAddresses he))-    openlog_generic s addr ident options fac pri-    +    openlog_generic s addr Datagram ident options fac pri+ {- | The most powerful initialization mechanism.  Takes an open datagram socket. -} openlog_generic :: Socket               -- ^ A datagram socket                 -> SockAddr             -- ^ Address for transmissions+                -> SocketType           -- ^ socket connection mode (stream / datagram)                 -> String               -- ^ Program name                 -> [Option]             -- ^ 'Option's                 -> Facility             -- ^ Facility value                 -> Priority             -- ^ Priority limit                 -> IO SyslogHandler-openlog_generic sock addr ident opt fac pri =+openlog_generic sock addr sock_t ident opt fac pri =     return (SyslogHandler {options = opt,                             facility = fac,                             identity = ident,                             logsocket = sock,                             address = addr,+                            sock_type = sock_t,                             priority = pri,                             formatter = syslogFormatter                           })@@ -234,12 +258,14 @@     getLevel sh = priority sh     setFormatter sh f = sh{formatter = f}     getFormatter sh = formatter sh-    emit sh (_, msg) _ = -        let                      +    emit sh (_, msg) _ =+        let             sendstr :: String -> IO String             sendstr [] = return []             sendstr omsg = do-                           sent <- sendTo (logsocket sh) omsg (address sh)+                           sent <- case sock_type sh of+                                       Datagram -> sendTo (logsocket sh) omsg (address sh)+                                       Stream   -> send   (logsocket sh) omsg                            sendstr (genericDrop sent omsg)         in do           if (elem PERROR (options sh))