pcap-conduit-0.1: Network/Pcap/Conduit.hs
-- |
-- Module : Network.Pcap.Conduit
-- Copyright : (c) Austin Seipp 2012
-- License : BSD3
--
-- Maintainer : mad.one@gmail.com
-- Stability : experimental
-- Portability : GHC probably
--
-- This package provides conduit 'Sources' for pcap data ( captured by
-- wireshark, tcpdump, etc.) You can enumerate pcap files and live
-- interfaces.
--
-- Based on @pcap-enumerator@.
--
module Network.Pcap.Conduit
( Packet -- :: *
, sourceOffline -- :: MonadIO m => FilePath -> Source m Packet
, sourceLive -- :: MonadIO m => String -> Int -> Bool -> Int64 -> Source m Packet
) where
import Control.Monad.IO.Class (liftIO, MonadIO)
import Data.ByteString (ByteString)
import Data.Conduit (Source, yield)
import Data.Int (Int64)
import Network.Pcap
-- | Convenient alias.
type Packet = (PktHdr, ByteString)
-- | Create a conduit 'Source' from a pcap data file.
sourceOffline :: MonadIO m => FilePath -> Source m Packet
sourceOffline path = (liftIO $ openOffline path) >>= sourcePcap1
-- | Create a conduit 'Source' from a live interface.
sourceLive :: MonadIO m
=> String -- ^ Device name
-> Int -- ^ Snapshot length in bytes
-> Bool -- ^ Promiscuous mode?
-> Int64 -- ^ Timeout (in microseconds)
-> Source m Packet
sourceLive n s p t = (liftIO $ openLive n s p t) >>= sourcePcap1
sourcePcap1 :: MonadIO m => PcapHandle -> Source m Packet
sourcePcap1 h = do
pkt@(hdr,_) <- liftIO (nextBS h)
if (hdrCaptureLength hdr == 0)
then return ()
else yield pkt >> sourcePcap1 h