packages feed

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