]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/regression/mqueue/mqtest3/mqtest3.c
This commit was generated by cvs2svn to compensate for changes in r156066,
[FreeBSD/FreeBSD.git] / tools / regression / mqueue / mqtest3 / mqtest3.c
1 /* $FreeBSD$ */
2 #include <stdio.h>
3 #include <mqueue.h>
4 #include <fcntl.h>
5 #include <signal.h>
6 #include <unistd.h>
7 #include <sys/select.h>
8
9 #define MQNAME  "/mytstqueue3"
10 #define LOOPS   1000
11 #define PRIO    10
12
13 void sighandler(int sig)
14 {
15         write(1, "timeout\n", 8);
16         _exit(1);
17 }
18
19 int main()
20 {
21         int mq, status;
22         struct mq_attr attr;
23         int pid;
24         fd_set set;
25
26         mq_unlink(MQNAME);
27
28         attr.mq_maxmsg  = 5;
29         attr.mq_msgsize = 128;
30         mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
31         if (mq == -1)
32                 err(1, "mq_open()");
33         status = mq_getattr(mq, &attr);
34         if (status)
35                 err(1, "mq_getattr()");
36         
37         pid = fork();
38         if (pid == 0) { /* child */
39                 int prio, j, i;
40                 char *buf;
41
42                 mq_close(mq);
43
44                 signal(SIGALRM, sighandler);
45
46                 mq = mq_open(MQNAME, O_RDWR);
47                 if (mq == -1)
48                         err(1, "child process: mq_open");
49                 buf = malloc(attr.mq_msgsize);
50                 for (j = 0; j < LOOPS; ++j) {
51                         FD_ZERO(&set);
52                         FD_SET(mq, &set);
53                         alarm(3);
54                         status = select(mq+1, &set, NULL, NULL, NULL);
55                         if (status != 1)
56                                 err(1, "child process: select()");
57                         status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
58                         if (status == -1)
59                                 err(2, "child process: mq_receive");
60                         for (i = 0; i < attr.mq_msgsize; ++i)
61                                 if (buf[i] != i)
62                                         err(3, "message data corrupted");
63                         if (prio != PRIO)
64                                 err(4, "priority is incorrect: %d", prio);
65                 }
66                 alarm(0);
67                 free(buf);
68                 mq_close(mq);
69                 return (0);
70         } else if (pid == -1) {
71                 err(1, "fork()");
72         } else {
73                 char *buf;
74                 int i, j, prio;
75
76                 signal(SIGALRM, sighandler);
77                 buf = malloc(attr.mq_msgsize);
78                 for (j = 0; j < LOOPS; ++j) {
79                         for (i = 0; i < attr.mq_msgsize; ++i) {
80                                 buf[i] = i;
81                         }
82                         alarm(3);
83                         FD_ZERO(&set);
84                         FD_SET(mq, &set);
85                         status = select(mq+1, NULL, &set, NULL, NULL);
86                         if (status != 1)
87                                 err(1, "select()");
88                         status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
89                         if (status) {
90                                 kill(pid, SIGKILL);
91                                 err(2, "mq_send()");
92                         }
93                 }
94                 alarm(3);
95                 wait(&status);
96                 alarm(0);
97         }
98         status = mq_close(mq);
99         if (status)
100                 err(1, "mq_close");
101         mq_unlink(MQNAME);
102         return (0);
103 }