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