1 /*
2 * Copyright (c) International Business Machines Corp., 2002
3 * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it would be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #include <errno.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/stat.h>
25 #include <sys/types.h>
26 #include <sys/ipc.h>
27 #include <sys/msg.h>
28 #include "libmsgctl.h"
29
doreader(long key,int tid,long type,int child,int nreps)30 int doreader(long key, int tid, long type, int child, int nreps)
31 {
32 int i, size;
33 int id;
34 struct mbuffer buffer;
35
36 id = msgget(key, 0);
37 if (id < 0) {
38 printf("msgget() error in the reader of child group %d: %s\n",
39 child, strerror(errno));
40
41 return FAIL;
42 }
43 if (id != tid) {
44 printf("Message queue mismatch in the reader of child group %d for message queue id %d\n",
45 child, id);
46
47 return FAIL;
48 }
49 for (i = 0; i < nreps; i++) {
50 memset(&buffer, 0, sizeof(buffer));
51
52 size = msgrcv(id, &buffer, 100, type, 0);
53 if (size < 0) {
54 printf("msgrcv() error in child %d, read # = %d: %s\n",
55 child, (i + 1), strerror(errno));
56
57 return FAIL;
58 }
59 if (buffer.type != type) {
60 printf("Type mismatch in child %d, read #d = %d: ",
61 child, (i + 1));
62 printf("for message got %ld, expected - %ld\n",
63 buffer.type, type);
64
65 return FAIL;
66 }
67 if (buffer.data.len + 1 != size) {
68 printf("Size mismatch in child %d, read # = %d: ",
69 child, (i + 1));
70 printf("for message got %d, expected - %d\n",
71 buffer.data.len + 1, size);
72
73 return FAIL;
74 }
75 if (verify(buffer.data.pbytes, (key % 255), size - 1, child)) {
76 printf("Verify failed in child %d read # = %d, key = %lx\n",
77 child, (i + 1), key);
78
79 return FAIL;
80 }
81 key++;
82 }
83 return PASS;
84 }
85
dowriter(long key,int tid,long type,int child,int nreps)86 int dowriter(long key, int tid, long type, int child, int nreps)
87 {
88 int i, size;
89 int id;
90 struct mbuffer buffer;
91
92 id = msgget(key, 0);
93 if (id < 0) {
94 printf("msgget() error in the writer of child group %d: %s\n",
95 child, strerror(errno));
96
97 return FAIL;
98 }
99 if (id != tid) {
100 printf("Message queue mismatch in the reader of child group %d for message queue id %d\n",
101 child, id);
102
103 return FAIL;
104 }
105
106 for (i = 0; i < nreps; i++) {
107 memset(&buffer, 0, sizeof(buffer));
108
109 do {
110 size = (lrand48() % 99);
111 } while (size == 0);
112 fill_buffer(buffer.data.pbytes, (key % 255), size);
113 buffer.data.len = size;
114 buffer.type = type;
115 if (msgsnd(id, &buffer, size + 1, 0) < 0) {
116 printf("msgsnd() error in child %d, write # = %d, key = %lx: %s\n",
117 child, nreps, key, strerror(errno));
118
119 return FAIL;
120 }
121 key++;
122 }
123 return PASS;
124 }
125
fill_buffer(char * buf,char val,int size)126 int fill_buffer(char *buf, char val, int size)
127 {
128 int i;
129
130 for (i = 0; i < size; i++)
131 buf[i] = val;
132 return 0;
133 }
134
135 /* Check a buffer for correct values */
verify(char * buf,char val,int size,int child)136 int verify(char *buf, char val, int size, int child)
137 {
138 while (size-- > 0) {
139 if (*buf++ != val) {
140 printf("Verify error in child %d, *buf = %x, val = %x, size = %d\n",
141 child, *buf, val, size);
142
143 return FAIL;
144 }
145 }
146 return PASS;
147 }
148