blob: b2ab7bc73a420b2a456f02ca1e5fba5d560fc8f3 [file] [log] [blame]
thughes8579b102004-08-14 18:52:27 +00001#include <config.h>
njned321c12005-08-17 02:44:43 +00002#include <errno.h>
thughes8579b102004-08-14 18:52:27 +00003#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
sewardj4bdd5052006-10-17 01:28:48 +00006#include <fcntl.h>
thughes8579b102004-08-14 18:52:27 +00007
8#ifdef HAVE_MQUEUE_H
9
10#include <mqueue.h>
11
12#define MSGMAX 10
13#define MSGSIZEMAX 1024
14
15int 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 {
njn4fe49432005-08-16 02:30:24 +000029 if (errno == ENOSYS)
30 exit(0);
thughes8579b102004-08-14 18:52:27 +000031 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 {
bart859b3fa2012-03-02 09:57:14 +000090 perror("mq_setattr");
thughes8579b102004-08-14 18:52:27 +000091 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
114int main(int argc, char **argv)
115{
116 exit(0);
117}
118
119#endif