• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(int argc,char ** argv)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 (len != 4 || memcmp(buffer, "PING", 4) != 0)
68     {
69       fprintf(stderr, "Message corrupt!");
70     }
71 
72   if (mq_notify(mqdr, NULL) < 0)
73     {
74       perror("mq_notify");
75       mq_close(mqdr);
76       mq_close(mqdw);
77       exit(1);
78     }
79 
80   if (mq_getattr(mqdr, &mqa) < 0)
81     {
82       perror("mq_getattr");
83       mq_close(mqdr);
84       mq_close(mqdw);
85       exit(1);
86     }
87 
88   if (mq_setattr(mqdw, &mqa, &mqa) < 0)
89     {
90       perror("mq_getattr");
91       mq_close(mqdr);
92       mq_close(mqdw);
93       exit(1);
94     }
95 
96   if (mq_close(mqdr) < 0)
97     {
98       perror("mq_close");
99       mq_close(mqdw);
100       exit(1);
101     }
102 
103   if (mq_close(mqdw) < 0)
104     {
105       perror("mq_close");
106       exit(1);
107     }
108 
109   exit(0);
110 }
111 
112 #else
113 
main(int argc,char ** argv)114 int main(int argc, char **argv)
115 {
116   exit(0);
117 }
118 
119 #endif
120