1 /* 2 * Copyright (c) 2017 Petr Vorel <pvorel (at) suse.cz> 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation; either version 2 of 7 * the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef MQ_H 19 #define MQ_H 20 21 #include "tst_test.h" 22 #include "tst_sig_proc.h" 23 #include "tst_safe_posix_ipc.h" 24 25 #define MAX_MSGSIZE 8192 26 #define MSG_LENGTH 10 27 #define QUEUE_NAME "/test_mqueue" 28 #define QUEUE_NAME_NONBLOCK "/test_mqueue_nonblock" 29 30 static char smsg[MAX_MSGSIZE]; 31 static struct sigaction act; 32 33 static void cleanup_common(void) 34 { 35 if (fd_root > 0) 36 SAFE_CLOSE(fd_root); 37 38 if (fd > 0) 39 SAFE_CLOSE(fd); 40 41 if (fd_nonblock > 0) 42 SAFE_CLOSE(fd_nonblock); 43 44 mq_unlink(QUEUE_NAME); 45 mq_unlink(QUEUE_NAME_NONBLOCK); 46 } 47 48 static void sighandler(int sig LTP_ATTRIBUTE_UNUSED) { } 49 50 static void setup_common(void) 51 { 52 int i; 53 54 act.sa_handler = sighandler; 55 sigaction(SIGINT, &act, NULL); 56 57 cleanup_common(); 58 59 fd_root = SAFE_OPEN("/", O_RDONLY); 60 fd = SAFE_MQ_OPEN(QUEUE_NAME, O_CREAT | O_EXCL | O_RDWR, 0700, NULL); 61 fd_nonblock = SAFE_MQ_OPEN(QUEUE_NAME_NONBLOCK, O_CREAT | O_EXCL | O_RDWR | 62 O_NONBLOCK, 0700, NULL); 63 64 for (i = 0; i < MAX_MSGSIZE; i++) 65 smsg[i] = i; 66 } 67 68 static void cleanup_queue(mqd_t fd) 69 { 70 int i; 71 struct mq_attr mqstat; 72 unsigned int prio; 73 char rmsg[MAX_MSGSIZE]; 74 75 memset(&mqstat, 0, sizeof(mqstat)); 76 if (mq_getattr(fd, &mqstat) == -1) { 77 tst_brk(TWARN, "mq_getattr() failed"); 78 return; 79 } 80 81 for (i = 0; i < mqstat.mq_curmsgs; i++) { 82 tst_res(TINFO, "receive %d/%ld message", i + 1, mqstat.mq_curmsgs); 83 mq_receive(fd, rmsg, MAX_MSGSIZE, &prio); 84 } 85 } 86 87 #endif /* MQ_H */ 88