]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - tools/regression/mqueue/mqtest3/mqtest3.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.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         mqd_t mq;
22         int status;
23         struct mq_attr attr;
24         int pid;
25         fd_set set;
26
27         mq_unlink(MQNAME);
28
29         attr.mq_maxmsg  = 5;
30         attr.mq_msgsize = 128;
31         mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
32         if (mq == (mqd_t)-1)
33                 err(1, "mq_open()");
34         status = mq_getattr(mq, &attr);
35         if (status)
36                 err(1, "mq_getattr()");
37         
38         pid = fork();
39         if (pid == 0) { /* child */
40                 int prio, j, i;
41                 char *buf;
42
43                 mq_close(mq);
44
45                 signal(SIGALRM, sighandler);
46
47                 mq = mq_open(MQNAME, O_RDWR);
48                 if (mq == (mqd_t)-1)
49                         err(1, "child process: mq_open");
50                 buf = malloc(attr.mq_msgsize);
51                 for (j = 0; j < LOOPS; ++j) {
52                         FD_ZERO(&set);
53                         FD_SET(__mq_oshandle(mq), &set);
54                         alarm(3);
55                         status = select(__mq_oshandle(mq)+1, &set, NULL, NULL, NULL);
56                         if (status != 1)
57                                 err(1, "child process: select()");
58                         status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
59                         if (status == -1)
60                                 err(2, "child process: mq_receive");
61                         for (i = 0; i < attr.mq_msgsize; ++i)
62                                 if (buf[i] != i)
63                                         err(3, "message data corrupted");
64                         if (prio != PRIO)
65                                 err(4, "priority is incorrect: %d", prio);
66                 }
67                 alarm(0);
68                 free(buf);
69                 mq_close(mq);
70                 return (0);
71         } else if (pid == -1) {
72                 err(1, "fork()");
73         } else {
74                 char *buf;
75                 int i, j, prio;
76
77                 signal(SIGALRM, sighandler);
78                 buf = malloc(attr.mq_msgsize);
79                 for (j = 0; j < LOOPS; ++j) {
80                         for (i = 0; i < attr.mq_msgsize; ++i) {
81                                 buf[i] = i;
82                         }
83                         alarm(3);
84                         FD_ZERO(&set);
85                         FD_SET(__mq_oshandle(mq), &set);
86                         status = select(__mq_oshandle(mq)+1, NULL, &set, NULL, NULL);
87                         if (status != 1)
88                                 err(1, "select()");
89                         status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
90                         if (status) {
91                                 kill(pid, SIGKILL);
92                                 err(2, "mq_send()");
93                         }
94                 }
95                 alarm(3);
96                 wait(&status);
97                 alarm(0);
98         }
99         status = mq_close(mq);
100         if (status)
101                 err(1, "mq_close");
102         mq_unlink(MQNAME);
103         return (0);
104 }