bindings-sipc-1.0: src/Examples/MQReader.hs
-- A program to test receiving messages on a message queue.
--
-- Based on sipc code from: examples/mq_reader.c
--
module Main where
import Bindings.SELinux.SIPC
import Control.Monad (when)
import Foreign
import Foreign.C
import System.IO
-- Key which sender and receiver have agreed upon
sipcKey = "sipc_mq_test"
-- Amount of data to allocate inside the IPC handle
dataLen = 8192
-- End of message marker which sender and receiver have agreed upon
dataEnd = "0xDEADBEEF"
main :: IO ()
main = do
sipc <- sipcOpen sipcKey SipcReceiver SipcSysvMqueues dataLen
if sipc == nullPtr
then do
hPutStrLn stderr "Error: Unable to create message queue"
else do
recvMessages sipc
sipcClose sipc
-- |Receive data from shared memory until the end of transmission
-- marker has been received.
recvMessages :: SipcPtr -> IO ()
recvMessages sipc = do
(result, dataP, len) <- sipcRecvData sipc
when (result == 0) $ recv dataP
where
recv dataP = do
dataStr <- peekCString dataP
free dataP
when (dataStr /= dataEnd) $ recvNext dataStr
recvNext msg = do
putStr msg
recvMessages sipc