seeking advice on my POSIX wrapper

Hello, Last night I sent out an announcement about some POSIX work that I have been doing. In any case, one of the FFI wrappers is driving me crazy, i.e. the one for mq_receive: http://opengroup.org/onlinepubs/007908799/xsh/mq_receive.html . When I call this function (mqReceive), I get "message too long". In my test cases I am sending and receiving messages that are only 11 bytes! The wrapper seems really straightforward. Perhaps I am looking right at the problem and don't see. I need other eyes on the wrapper to help me ;^). Please see below. Regards, V. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- mqReceive is still being debugged!!!!!!!!!! -- | Retrieve a message from mqueue designated by "mqd" -- mqReceive :: Fd -> ByteCount -> Maybe Int -> IO (String, Int) mqReceive (Fd mqd) len (Just prio) = do allocaBytes (fromIntegral len) $ \ p_buffer -> do with (fromIntegral prio) $ \ p_prio -> do rc <- throwErrnoIfMinus1 "mqReceive" (c_mq_receive mqd p_buffer (fromIntegral len) p_prio) case fromIntegral rc of 0 -> ioError (IOError Nothing EOF "mqReceive" "EOF" Nothing) n -> do s <- peekCStringLen (p_buffer, fromIntegral n) return (s, n) mqReceive (Fd mqd) len Nothing = do allocaBytes (fromIntegral len) $ \ p_buffer -> do rc <- throwErrnoIfMinus1 "mqReceive" (c_mq_receive mqd p_buffer (fromIntegral len) nullPtr) case fromIntegral rc of 0 -> ioError (IOError Nothing EOF "mqReceive" "EOF" Nothing) n -> do s <- peekCStringLen (p_buffer, fromIntegral n) return (s, n) foreign import ccall unsafe "mqueue.h mq_receive" c_mq_receive :: CInt -> Ptr CChar -> CSize -> Ptr CInt -> IO CInt

Hello Vasili, Sunday, May 11, 2008, 12:47:52 AM, you wrote:
. When I call this function (mqReceive), I get "message too long".
you can divide-and-conquer the problem by trying 1) write the C code that calls mq_receive with the same params 2) call your own function instead of mq_receive and printf parameters it receives -- Best regards, Bulat mailto:Bulat.Ziganshin@gmail.com

On 2008 May 10, at 16:47, Galchin, Vasili wrote:
Last night I sent out an announcement about some POSIX work that I have been doing. In any case, one of the FFI wrappers is driving me crazy, i.e. the one for mq_receive:http://opengroup.org/onlinepubs/007908799/xsh/mq_receive.html . When I call this function (mqReceive), I get "message too long". In my test cases I am sending and receiving messages that are only 11 bytes! The wrapper seems really straightforward. Perhaps I am looking right at the problem and don't see. I need other eyes on the wrapper to help me ;^). Please see below.
What's the other end sending? I suspect most implementations of mq_receive() layer it on top of msgrcv(), which can return E2BIG (== EMSGSIZE) if the message to be received is larger than the receiving buffer --- a condition which I note mq_receive() does not document (unless mq_msgsize means a given queue only supports fixed size messages, which seems odd). -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH

sender ...... main = do fd <- mqOpen "/myipc" ReadWrite (Just nullFileMode) (Just (MQAttributes 0 128 128 0)) mqSend fd "Hello world" 11 1 (MQAttributes flags maxMsgNum maxMsgSize curNumMsgs) <- mqGetAttributes fd putStrLn ("attrs flags->" ++ (show flags) ++ " maxMsgNum -> " ++ (show maxMsgNum) ++ " maxMsgSize -> " ++ (show maxMsgSize) ++ " curNumMsgs -> " ++ (show curNumMsgs)) mqClose fd return fd ~ ----------------------------------------- receiver main = do fd <- mqOpen "/myipc" ReadWrite (Just nullFileMode) (Just (MQAttributes 0 128 128 0)) (MQAttributes flags maxMsgNum maxMsgSize curNumMsgs) <- mqGetAttributes fd putStrLn ("attrs flags->" ++ (show flags) ++ " maxMsgNum -> " ++ (show maxMsgNum) ++ " maxMsgSize -> " ++ (show maxMsgSize) ++ " curNumMsgs -> " ++ (show curNumMsgs)) (MQAttributes flags maxMsgNum maxMsgSize curNumMsgs) <- mqSetAttributes fd (MQAttributes{flags=0, maxMsgNum=127, maxMsgSize=127, curNumMsgs=7}) putStrLn ("attrs flags->" ++ (show flags) ++ " maxMsgNum -> " ++ (show maxMsgNum) ++ " maxMsgSize -> " ++ (show maxMsgSize) ++ " curNumMsgs -> " ++ (show curNumMsgs)) (s, n) <- mqReceive fd 60 Nothing putStrLn ("dump " ++ s) (s, n) <- mqReceive fd 11 (Just 1) putStrLn s mqClose fd -- mqUnlink "/myipc" return fd ~ --------------------------------------------------------------------------------------------------------------------------------------------- Thanks, Vasili On Sat, May 10, 2008 at 4:09 PM, Brandon S. Allbery KF8NH < allbery@ece.cmu.edu> wrote:
On 2008 May 10, at 16:47, Galchin, Vasili wrote:
Last night I sent out an announcement about some POSIX work that I have been doing. In any case, one of the FFI wrappers is driving me crazy, i.e. the one for mq_receive: http://opengroup.org/onlinepubs/007908799/xsh/mq_receive.html . When I call this function (mqReceive), I get "message too long". In my test cases I am sending and receiving messages that are only 11 bytes! The wrapper seems really straightforward. Perhaps I am looking right at the problem and don't see. I need other eyes on the wrapper to help me ;^). Please see below.
What's the other end sending?
I suspect most implementations of mq_receive() layer it on top of msgrcv(), which can return E2BIG (== EMSGSIZE) if the message to be received is larger than the receiving buffer --- a condition which I note mq_receive() does not document (unless mq_msgsize means a given queue only supports fixed size messages, which seems odd).
-- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH

The Linux version of mqueue that I am using is implemented as a Linux filesystem. I am reading now, Brandon. V. On Sat, May 10, 2008 at 4:09 PM, Brandon S. Allbery KF8NH < allbery@ece.cmu.edu> wrote:
On 2008 May 10, at 16:47, Galchin, Vasili wrote:
Last night I sent out an announcement about some POSIX work that I have been doing. In any case, one of the FFI wrappers is driving me crazy, i.e. the one for mq_receive: http://opengroup.org/onlinepubs/007908799/xsh/mq_receive.html . When I call this function (mqReceive), I get "message too long". In my test cases I am sending and receiving messages that are only 11 bytes! The wrapper seems really straightforward. Perhaps I am looking right at the problem and don't see. I need other eyes on the wrapper to help me ;^). Please see below.
What's the other end sending?
I suspect most implementations of mq_receive() layer it on top of msgrcv(), which can return E2BIG (== EMSGSIZE) if the message to be received is larger than the receiving buffer --- a condition which I note mq_receive() does not document (unless mq_msgsize means a given queue only supports fixed size messages, which seems odd).
-- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH
participants (3)
-
Brandon S. Allbery KF8NH
-
Bulat Ziganshin
-
Galchin, Vasili