1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <config.h> 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <errno.h> 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h> 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <string.h> 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <fcntl.h> 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef HAVE_MQUEUE_H 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <mqueue.h> 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MSGMAX 10 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MSGSIZEMAX 1024 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv) 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct mq_attr mqa; 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mqd_t mqdw; 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mqd_t mqdr; 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char buffer[MSGSIZEMAX]; 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned int priority; 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int len; 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mqa.mq_maxmsg = MSGMAX; 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mqa.mq_msgsize = MSGSIZEMAX; 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((mqdw = mq_open("/valgrind-mqueue", O_CREAT|O_EXCL|O_WRONLY, 0600, &mqa)) < 0) 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (errno == ENOSYS) 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(0); 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_open"); 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((mqdr = mq_open("/valgrind-mqueue", O_RDONLY)) < 0) 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_open"); 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_unlink("/valgrind-mqueue"); 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_unlink("/valgrind-mqueue") < 0) 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_unlink"); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_send(mqdw, "PING", 4, 0) < 0) 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_send"); 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if ((len = mq_receive(mqdr, buffer, sizeof(buffer), &priority)) < 0) 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_receive"); 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (len != 4 || memcmp(buffer, "PING", 4) != 0) 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fprintf(stderr, "Message corrupt!"); 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_notify(mqdr, NULL) < 0) 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_notify"); 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_getattr(mqdr, &mqa) < 0) 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_getattr"); 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_setattr(mqdw, &mqa, &mqa) < 0) 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng perror("mq_setattr"); 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdr); 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_close(mqdr) < 0) 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_close"); 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown mq_close(mqdw); 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (mq_close(mqdw) < 0) 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown perror("mq_close"); 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(1); 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(0); 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#else 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv) 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exit(0); 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 120