Home | History | Annotate | Download | only in utils
      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