Home | History | Annotate | Download | only in tests
      1 #include <config.h>
      2 #include <errno.h>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <string.h>
      6 #include <fcntl.h>
      7 
      8 #ifdef HAVE_MQUEUE_H
      9 
     10 #include <mqueue.h>
     11 
     12 #define MSGMAX 10
     13 #define MSGSIZEMAX 1024
     14 
     15 int main(int argc, char **argv)
     16 {
     17   struct mq_attr mqa;
     18   mqd_t mqdw;
     19   mqd_t mqdr;
     20   char buffer[MSGSIZEMAX];
     21   unsigned int priority;
     22   int len;
     23 
     24   mqa.mq_maxmsg = MSGMAX;
     25   mqa.mq_msgsize = MSGSIZEMAX;
     26 
     27   if ((mqdw = mq_open("/valgrind-mqueue", O_CREAT|O_EXCL|O_WRONLY, 0600, &mqa)) < 0)
     28     {
     29       if (errno == ENOSYS)
     30         exit(0);
     31       perror("mq_open");
     32       exit(1);
     33     }
     34 
     35   if ((mqdr = mq_open("/valgrind-mqueue", O_RDONLY)) < 0)
     36     {
     37       perror("mq_open");
     38       mq_unlink("/valgrind-mqueue");
     39       mq_close(mqdw);
     40       exit(1);
     41     }
     42 
     43   if (mq_unlink("/valgrind-mqueue") < 0)
     44     {
     45       perror("mq_unlink");
     46       mq_close(mqdw);
     47       mq_close(mqdr);
     48       exit(1);
     49     }
     50 
     51   if (mq_send(mqdw, "PING", 4, 0) < 0)
     52     {
     53       perror("mq_send");
     54       mq_close(mqdr);
     55       mq_close(mqdw);
     56       exit(1);
     57     }
     58 
     59   if ((len = mq_receive(mqdr, buffer, sizeof(buffer), &priority)) < 0)
     60     {
     61       perror("mq_receive");
     62       mq_close(mqdr);
     63       mq_close(mqdw);
     64       exit(1);
     65     }
     66 
     67 #if !defined(VGO_solaris)
     68   /* On Solaris, there is no existing notification registration. */
     69   if (mq_notify(mqdr, NULL) < 0)
     70     {
     71       perror("mq_notify");
     72       mq_close(mqdr);
     73       mq_close(mqdw);
     74       exit(1);
     75     }
     76 #endif /* !VGO_solaris */
     77 
     78   if (len != 4 || memcmp(buffer, "PING", 4) != 0)
     79     {
     80       fprintf(stderr, "Message corrupt!");
     81     }
     82 
     83   if (mq_getattr(mqdr, &mqa) < 0)
     84     {
     85       perror("mq_getattr");
     86       mq_close(mqdr);
     87       mq_close(mqdw);
     88       exit(1);
     89     }
     90 
     91   if (mq_setattr(mqdw, &mqa, &mqa) < 0)
     92     {
     93       perror("mq_setattr");
     94       mq_close(mqdr);
     95       mq_close(mqdw);
     96       exit(1);
     97     }
     98 
     99   if (mq_close(mqdr) < 0)
    100     {
    101       perror("mq_close");
    102       mq_close(mqdw);
    103       exit(1);
    104     }
    105 
    106   if (mq_close(mqdw) < 0)
    107     {
    108       perror("mq_close");
    109       exit(1);
    110     }
    111 
    112   exit(0);
    113 }
    114 
    115 #else
    116 
    117 int main(int argc, char **argv)
    118 {
    119   exit(0);
    120 }
    121 
    122 #endif
    123