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