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
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    {
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
117int main(int argc, char **argv)
118{
119  exit(0);
120}
121
122#endif
123