]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - tools/regression/mqueue/mqtest2/mqtest2.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / tools / regression / mqueue / mqtest2 / mqtest2.c
1 /* $FreeBSD$ */
2 #include <stdio.h>
3 #include <mqueue.h>
4 #include <fcntl.h>
5 #include <signal.h>
6 #include <unistd.h>
7
8 #define MQNAME  "/mytstqueue2"
9 #define LOOPS   1000
10 #define PRIO    10
11
12 void alarmhandler(int sig)
13 {
14         write(1, "timeout\n", 8);
15         _exit(1);
16 }
17
18 int main()
19 {
20         struct mq_attr attr;
21         mqd_t mq;
22         int status, pid;
23         
24         mq_unlink(MQNAME);
25
26         attr.mq_maxmsg  = 5;
27         attr.mq_msgsize = 128;
28         mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr);
29         if (mq == (mqd_t)-1)
30                 err(1, "mq_open");
31         status = mq_getattr(mq, &attr);
32         if (status)
33                 err(1, "mq_getattr");
34         pid = fork();
35         if (pid == 0) { /* child */
36                 int prio, j, i;
37                 char *buf;
38
39                 mq_close(mq);
40
41                 signal(SIGALRM, alarmhandler);
42
43                 mq = mq_open(MQNAME, O_RDWR);
44                 if (mq == (mqd_t)-1)
45                         err(1, "child: mq_open");
46                 buf = malloc(attr.mq_msgsize);
47                 for (j = 0; j < LOOPS; ++j) {
48                         alarm(3);
49                         status = mq_receive(mq, buf, attr.mq_msgsize, &prio);
50                         if (status == -1)
51                                 err(2, "child: mq_receive");
52                         for (i = 0; i < attr.mq_msgsize; ++i)
53                                 if (buf[i] != i)
54                                         err(3, "child: message data corrupted");
55                         if (prio != PRIO)
56                                 err(4, "child: priority is incorrect: %d",
57                                         prio);
58                 }
59                 alarm(0);
60                 free(buf);
61                 mq_close(mq);
62                 return (0);
63         } else if (pid == -1) {
64                 err(1, "fork()");
65         } else {
66                 char *buf;
67                 int i, j, prio;
68
69                 signal(SIGALRM, alarmhandler);
70                 buf = malloc(attr.mq_msgsize);
71                 for (j = 0; j < LOOPS; ++j) {
72                         for (i = 0; i < attr.mq_msgsize; ++i)
73                                 buf[i] = i;
74                         alarm(3);
75                         status = mq_send(mq, buf, attr.mq_msgsize, PRIO);
76                         if (status)
77                                 err(1, "mq_send");
78                 }
79                 alarm(3);
80                 wait(&status);
81                 alarm(0);
82         }
83         status = mq_close(mq);
84         if (status)
85                 err(1, "mq_close");
86         mq_unlink(MQNAME);
87         return (0);
88 }