1152832Sdavidxu/* $FreeBSD$ */ 2205225Skib 3205225Skib#include <sys/types.h> 4205225Skib#include <sys/wait.h> 5205225Skib#include <err.h> 6205225Skib#include <fcntl.h> 7152832Sdavidxu#include <mqueue.h> 8152832Sdavidxu#include <signal.h> 9205225Skib#include <stdio.h> 10205225Skib#include <stdlib.h> 11152832Sdavidxu#include <unistd.h> 12152832Sdavidxu 13282858Sngie#include "freebsd_test_suite/macros.h" 14282858Sngie 15152832Sdavidxu#define MQNAME "/mytstqueue2" 16152832Sdavidxu#define LOOPS 1000 17152832Sdavidxu#define PRIO 10 18152832Sdavidxu 19281428Sngiestatic void 20281428Sngiealarmhandler(int sig __unused) 21152832Sdavidxu{ 22152832Sdavidxu write(1, "timeout\n", 8); 23152832Sdavidxu _exit(1); 24152832Sdavidxu} 25152832Sdavidxu 26281428Sngieint 27281428Sngiemain(void) 28152832Sdavidxu{ 29152832Sdavidxu struct mq_attr attr; 30165829Sdavidxu mqd_t mq; 31281428Sngie int status; 32281428Sngie pid_t pid; 33152832Sdavidxu 34282858Sngie PLAIN_REQUIRE_KERNEL_MODULE("mqueuefs", 0); 35282858Sngie 36152832Sdavidxu mq_unlink(MQNAME); 37152832Sdavidxu 38152832Sdavidxu attr.mq_maxmsg = 5; 39152832Sdavidxu attr.mq_msgsize = 128; 40152832Sdavidxu mq = mq_open(MQNAME, O_CREAT | O_RDWR | O_EXCL, 0666, &attr); 41165829Sdavidxu if (mq == (mqd_t)-1) 42152832Sdavidxu err(1, "mq_open"); 43152832Sdavidxu status = mq_getattr(mq, &attr); 44152832Sdavidxu if (status) 45152832Sdavidxu err(1, "mq_getattr"); 46152832Sdavidxu pid = fork(); 47152832Sdavidxu if (pid == 0) { /* child */ 48152832Sdavidxu char *buf; 49281428Sngie int j, i; 50281428Sngie unsigned int prio; 51152832Sdavidxu 52152832Sdavidxu mq_close(mq); 53152832Sdavidxu 54152832Sdavidxu signal(SIGALRM, alarmhandler); 55152832Sdavidxu 56152832Sdavidxu mq = mq_open(MQNAME, O_RDWR); 57165829Sdavidxu if (mq == (mqd_t)-1) 58152832Sdavidxu err(1, "child: mq_open"); 59152832Sdavidxu buf = malloc(attr.mq_msgsize); 60152832Sdavidxu for (j = 0; j < LOOPS; ++j) { 61152832Sdavidxu alarm(3); 62152832Sdavidxu status = mq_receive(mq, buf, attr.mq_msgsize, &prio); 63152832Sdavidxu if (status == -1) 64152832Sdavidxu err(2, "child: mq_receive"); 65152832Sdavidxu for (i = 0; i < attr.mq_msgsize; ++i) 66152832Sdavidxu if (buf[i] != i) 67152832Sdavidxu err(3, "child: message data corrupted"); 68152832Sdavidxu if (prio != PRIO) 69152832Sdavidxu err(4, "child: priority is incorrect: %d", 70152832Sdavidxu prio); 71152832Sdavidxu } 72152832Sdavidxu alarm(0); 73152832Sdavidxu free(buf); 74152832Sdavidxu mq_close(mq); 75152832Sdavidxu return (0); 76152832Sdavidxu } else if (pid == -1) { 77152832Sdavidxu err(1, "fork()"); 78152832Sdavidxu } else { 79152832Sdavidxu char *buf; 80281428Sngie int i, j; 81152832Sdavidxu 82152832Sdavidxu signal(SIGALRM, alarmhandler); 83152832Sdavidxu buf = malloc(attr.mq_msgsize); 84152832Sdavidxu for (j = 0; j < LOOPS; ++j) { 85152832Sdavidxu for (i = 0; i < attr.mq_msgsize; ++i) 86152832Sdavidxu buf[i] = i; 87152832Sdavidxu alarm(3); 88152832Sdavidxu status = mq_send(mq, buf, attr.mq_msgsize, PRIO); 89152832Sdavidxu if (status) 90152832Sdavidxu err(1, "mq_send"); 91152832Sdavidxu } 92152832Sdavidxu alarm(3); 93152832Sdavidxu wait(&status); 94152832Sdavidxu alarm(0); 95152832Sdavidxu } 96152832Sdavidxu status = mq_close(mq); 97152832Sdavidxu if (status) 98152832Sdavidxu err(1, "mq_close"); 99152832Sdavidxu mq_unlink(MQNAME); 100152832Sdavidxu return (0); 101152832Sdavidxu} 102