1*57718be8SEnji Cooper /* $NetBSD: t_mqueue.c,v 1.4 2014/03/02 19:56:48 jmmv Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /* 4*57718be8SEnji Cooper * Test for POSIX message queue priority handling. 5*57718be8SEnji Cooper * 6*57718be8SEnji Cooper * This file is in the Public Domain. 7*57718be8SEnji Cooper */ 8*57718be8SEnji Cooper 9*57718be8SEnji Cooper #include <atf-c.h> 10*57718be8SEnji Cooper 11*57718be8SEnji Cooper #include <stdio.h> 12*57718be8SEnji Cooper #include <stdlib.h> 13*57718be8SEnji Cooper #include <string.h> 14*57718be8SEnji Cooper #include <errno.h> 15*57718be8SEnji Cooper #include <unistd.h> 16*57718be8SEnji Cooper 17*57718be8SEnji Cooper #include <mqueue.h> 18*57718be8SEnji Cooper 19*57718be8SEnji Cooper #define MQ_PRIO_BASE 24 20*57718be8SEnji Cooper 21*57718be8SEnji Cooper static void 22*57718be8SEnji Cooper send_msgs(mqd_t mqfd) 23*57718be8SEnji Cooper { 24*57718be8SEnji Cooper char msg[2]; 25*57718be8SEnji Cooper 26*57718be8SEnji Cooper msg[1] = '\0'; 27*57718be8SEnji Cooper 28*57718be8SEnji Cooper msg[0] = 'a'; 29*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1, 30*57718be8SEnji Cooper "mq_send 1 failed: %d", errno); 31*57718be8SEnji Cooper 32*57718be8SEnji Cooper msg[0] = 'b'; 33*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1, 34*57718be8SEnji Cooper "mq_send 2 failed: %d", errno); 35*57718be8SEnji Cooper 36*57718be8SEnji Cooper msg[0] = 'c'; 37*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE) != -1, 38*57718be8SEnji Cooper "mq_send 3 failed: %d", errno); 39*57718be8SEnji Cooper 40*57718be8SEnji Cooper msg[0] = 'd'; 41*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE - 1) != -1, 42*57718be8SEnji Cooper "mq_send 4 failed: %d", errno); 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper msg[0] = 'e'; 45*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), 0) != -1, 46*57718be8SEnji Cooper "mq_send 5 failed: %d", errno); 47*57718be8SEnji Cooper 48*57718be8SEnji Cooper msg[0] = 'f'; 49*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BASE + 1) != -1, 50*57718be8SEnji Cooper "mq_send 6 failed: %d", errno); 51*57718be8SEnji Cooper } 52*57718be8SEnji Cooper 53*57718be8SEnji Cooper static void 54*57718be8SEnji Cooper receive_msgs(mqd_t mqfd) 55*57718be8SEnji Cooper { 56*57718be8SEnji Cooper struct mq_attr mqa; 57*57718be8SEnji Cooper char *m; 58*57718be8SEnji Cooper unsigned p; 59*57718be8SEnji Cooper int len; 60*57718be8SEnji Cooper 61*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_getattr(mqfd, &mqa) != -1, "mq_getattr failed %d", 62*57718be8SEnji Cooper errno); 63*57718be8SEnji Cooper 64*57718be8SEnji Cooper len = mqa.mq_msgsize; 65*57718be8SEnji Cooper m = calloc(1, len); 66*57718be8SEnji Cooper ATF_REQUIRE_MSG(m != NULL, "calloc failed"); 67*57718be8SEnji Cooper 68*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 69*57718be8SEnji Cooper "mq_receive 1 failed: %d", errno); 70*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'b', 71*57718be8SEnji Cooper "mq_receive 1 prio/data mismatch"); 72*57718be8SEnji Cooper 73*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 74*57718be8SEnji Cooper "mq_receive 2 failed: %d", errno); 75*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE + 1) && m[0] == 'f', 76*57718be8SEnji Cooper "mq_receive 2 prio/data mismatch"); 77*57718be8SEnji Cooper 78*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 79*57718be8SEnji Cooper "mq_receive 3 failed: %d", errno); 80*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'a', 81*57718be8SEnji Cooper "mq_receive 3 prio/data mismatch"); 82*57718be8SEnji Cooper 83*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 84*57718be8SEnji Cooper "mq_receive 4 failed: %d", errno); 85*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == MQ_PRIO_BASE && m[0] == 'c', 86*57718be8SEnji Cooper "mq_receive 4 prio/data mismatch"); 87*57718be8SEnji Cooper 88*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 89*57718be8SEnji Cooper "mq_receive 5 failed: %d", errno); 90*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == (MQ_PRIO_BASE - 1) && m[0] == 'd', 91*57718be8SEnji Cooper "mq_receive 5 prio/data mismatch"); 92*57718be8SEnji Cooper 93*57718be8SEnji Cooper ATF_REQUIRE_MSG(mq_receive(mqfd, m, len, &p) != -1, 94*57718be8SEnji Cooper "mq_receive 6 failed: %d", errno); 95*57718be8SEnji Cooper ATF_REQUIRE_MSG(p == 0 && m[0] == 'e', 96*57718be8SEnji Cooper "mq_receive 6 prio/data mismatch"); 97*57718be8SEnji Cooper } 98*57718be8SEnji Cooper 99*57718be8SEnji Cooper ATF_TC(mqueue); 100*57718be8SEnji Cooper ATF_TC_HEAD(mqueue, tc) 101*57718be8SEnji Cooper { 102*57718be8SEnji Cooper 103*57718be8SEnji Cooper atf_tc_set_md_var(tc, "timeout", "3"); 104*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Checks mqueue send/receive"); 105*57718be8SEnji Cooper } 106*57718be8SEnji Cooper 107*57718be8SEnji Cooper ATF_TC_BODY(mqueue, tc) 108*57718be8SEnji Cooper { 109*57718be8SEnji Cooper int status; 110*57718be8SEnji Cooper char *tmpdir; 111*57718be8SEnji Cooper char template[32]; 112*57718be8SEnji Cooper char mq_name[64]; 113*57718be8SEnji Cooper 114*57718be8SEnji Cooper strlcpy(template, "./t_mqueue.XXXXXX", sizeof(template)); 115*57718be8SEnji Cooper tmpdir = mkdtemp(template); 116*57718be8SEnji Cooper ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp failed: %d", errno); 117*57718be8SEnji Cooper snprintf(mq_name, sizeof(mq_name), "%s/mq", tmpdir); 118*57718be8SEnji Cooper 119*57718be8SEnji Cooper mqd_t mqfd; 120*57718be8SEnji Cooper 121*57718be8SEnji Cooper mqfd = mq_open(mq_name, O_RDWR | O_CREAT, 122*57718be8SEnji Cooper S_IRUSR | S_IRWXG | S_IROTH, NULL); 123*57718be8SEnji Cooper ATF_REQUIRE_MSG(mqfd != -1, "mq_open failed: %d", errno); 124*57718be8SEnji Cooper 125*57718be8SEnji Cooper send_msgs(mqfd); 126*57718be8SEnji Cooper receive_msgs(mqfd); 127*57718be8SEnji Cooper 128*57718be8SEnji Cooper status = mq_close(mqfd); 129*57718be8SEnji Cooper ATF_REQUIRE_MSG(status == 0, "mq_close failed: %d", errno); 130*57718be8SEnji Cooper } 131*57718be8SEnji Cooper 132*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 133*57718be8SEnji Cooper { 134*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, mqueue); 135*57718be8SEnji Cooper 136*57718be8SEnji Cooper return atf_no_error(); 137*57718be8SEnji Cooper } 138