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