#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>

#include <assert.h>


static mqd_t mq_test;
static const size_t bufsiz = 256;

int main(int argc, char **argv)
{
  struct mq_attr m_attr;
  char buf[bufsiz], recv[bufsiz];

  memset(buf, '\0', bufsiz);
  memset(buf, '\0', bufsiz);
  if (argc > 1)
    strncpy(buf, argv[1], bufsiz-1);

  mq_unlink("/testmq");
  assert( (mq_test = mq_open( "/testmq", O_CREAT | O_EXCL | O_RDWR  | O_NONBLOCK, S_IRUSR | S_IWUSR, NULL )) != (mqd_t)-1 );
  assert( mq_getattr(mq_test, &m_attr) == 0 );
  printf("flags.....: %ld\n"
         "maxmsg....: %ld\n"
         "msgsize...: %ld\n"
         "curmsg....: %ld\n",
         m_attr.mq_flags, m_attr.mq_maxmsg, m_attr.mq_msgsize, m_attr.mq_curmsgs);

  m_attr.mq_msgsize = bufsiz-1;
  assert ( mq_setattr(mq_test, &m_attr, NULL) == 0 );
  assert ( mq_send(mq_test, buf, bufsiz-1, 0) == 0 );
  assert ( mq_getattr(mq_test, &m_attr) == 0 );
  printf("new msgsize...: %ld\n"
         "new curmsg....: %ld\n",
         m_attr.mq_msgsize, m_attr.mq_curmsgs);
  assert ( mq_receive(mq_test, recv, bufsiz-1, 0) > 0 );

  printf("RECV: %s\n", recv);

  return 0;
}