xref: /aosp_15_r20/external/strace/tests-m32/mq_sendrecv.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check decoding of mq_open, mq_timedsend, mq_notify, mq_timedreceive and
3*cf84ac9aSAndroid Build Coastguard Worker  * mq_unlink syscalls.
4*cf84ac9aSAndroid Build Coastguard Worker  *
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
8*cf84ac9aSAndroid Build Coastguard Worker  *
9*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
10*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
11*cf84ac9aSAndroid Build Coastguard Worker  * are met:
12*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
14*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
16*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
17*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
18*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
19*cf84ac9aSAndroid Build Coastguard Worker  *
20*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*cf84ac9aSAndroid Build Coastguard Worker  */
31*cf84ac9aSAndroid Build Coastguard Worker 
32*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
33*cf84ac9aSAndroid Build Coastguard Worker 
34*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
35*cf84ac9aSAndroid Build Coastguard Worker 
36*cf84ac9aSAndroid Build Coastguard Worker #if defined __NR_mq_open && __NR_mq_timedsend && __NR_mq_timedreceive && \
37*cf84ac9aSAndroid Build Coastguard Worker 	__NR_mq_notify && __NR_mq_unlink
38*cf84ac9aSAndroid Build Coastguard Worker 
39*cf84ac9aSAndroid Build Coastguard Worker # include <assert.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <errno.h>
41*cf84ac9aSAndroid Build Coastguard Worker # include <fcntl.h>
42*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
43*cf84ac9aSAndroid Build Coastguard Worker # include <signal.h>
44*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
45*cf84ac9aSAndroid Build Coastguard Worker # include <stdlib.h>
46*cf84ac9aSAndroid Build Coastguard Worker # include <string.h>
47*cf84ac9aSAndroid Build Coastguard Worker # include <time.h>
48*cf84ac9aSAndroid Build Coastguard Worker # include <unistd.h>
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker # include "sigevent.h"
51*cf84ac9aSAndroid Build Coastguard Worker 
52*cf84ac9aSAndroid Build Coastguard Worker # ifndef DUMPIO_READ
53*cf84ac9aSAndroid Build Coastguard Worker #  define DUMPIO_READ 0
54*cf84ac9aSAndroid Build Coastguard Worker # endif
55*cf84ac9aSAndroid Build Coastguard Worker 
56*cf84ac9aSAndroid Build Coastguard Worker # ifndef DUMPIO_WRITE
57*cf84ac9aSAndroid Build Coastguard Worker #  define DUMPIO_WRITE 0
58*cf84ac9aSAndroid Build Coastguard Worker # endif
59*cf84ac9aSAndroid Build Coastguard Worker 
60*cf84ac9aSAndroid Build Coastguard Worker static char *mq_name;
61*cf84ac9aSAndroid Build Coastguard Worker 
62*cf84ac9aSAndroid Build Coastguard Worker enum {
63*cf84ac9aSAndroid Build Coastguard Worker 	NUM_ATTRS = 8,
64*cf84ac9aSAndroid Build Coastguard Worker 	MSG_CUT = 8,
65*cf84ac9aSAndroid Build Coastguard Worker 	MSG_MAX_UNCUT = 32,
66*cf84ac9aSAndroid Build Coastguard Worker 	MSG_SIZE = 64,
67*cf84ac9aSAndroid Build Coastguard Worker 	MSG_START = 0x80,
68*cf84ac9aSAndroid Build Coastguard Worker };
69*cf84ac9aSAndroid Build Coastguard Worker 
70*cf84ac9aSAndroid Build Coastguard Worker 
71*cf84ac9aSAndroid Build Coastguard Worker static void
printstr(unsigned char start,unsigned int count)72*cf84ac9aSAndroid Build Coastguard Worker printstr(unsigned char start, unsigned int count)
73*cf84ac9aSAndroid Build Coastguard Worker {
74*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int i;
75*cf84ac9aSAndroid Build Coastguard Worker 
76*cf84ac9aSAndroid Build Coastguard Worker 	printf("\"");
77*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < count; i++) {
78*cf84ac9aSAndroid Build Coastguard Worker 		printf("\\%hho", (unsigned char) (start + i));
79*cf84ac9aSAndroid Build Coastguard Worker 	}
80*cf84ac9aSAndroid Build Coastguard Worker 	printf("\"");
81*cf84ac9aSAndroid Build Coastguard Worker }
82*cf84ac9aSAndroid Build Coastguard Worker 
83*cf84ac9aSAndroid Build Coastguard Worker #if DUMPIO_READ || DUMPIO_WRITE
84*cf84ac9aSAndroid Build Coastguard Worker static void
dumpstr(unsigned char start,unsigned int count)85*cf84ac9aSAndroid Build Coastguard Worker dumpstr(unsigned char start, unsigned int count)
86*cf84ac9aSAndroid Build Coastguard Worker {
87*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int i;
88*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int j;
89*cf84ac9aSAndroid Build Coastguard Worker 
90*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < count; i++) {
91*cf84ac9aSAndroid Build Coastguard Worker 		if (i < count) {
92*cf84ac9aSAndroid Build Coastguard Worker 			if (!(i % 16))
93*cf84ac9aSAndroid Build Coastguard Worker 				printf(" | %05x ", i);
94*cf84ac9aSAndroid Build Coastguard Worker 			if (!(i % 8))
95*cf84ac9aSAndroid Build Coastguard Worker 				printf(" ");
96*cf84ac9aSAndroid Build Coastguard Worker 
97*cf84ac9aSAndroid Build Coastguard Worker 			printf("%02hhx ", (unsigned char) (start + i));
98*cf84ac9aSAndroid Build Coastguard Worker 		}
99*cf84ac9aSAndroid Build Coastguard Worker 
100*cf84ac9aSAndroid Build Coastguard Worker 		if ((i % 16 == 15) || (i == (count - 1))) {
101*cf84ac9aSAndroid Build Coastguard Worker 			if (i % 16 != 15)
102*cf84ac9aSAndroid Build Coastguard Worker 				printf("%*s", 3 * (15 - i % 16) +
103*cf84ac9aSAndroid Build Coastguard Worker 				       ((i + 8) % 16) / 8, " ");
104*cf84ac9aSAndroid Build Coastguard Worker 
105*cf84ac9aSAndroid Build Coastguard Worker 			printf(" ");
106*cf84ac9aSAndroid Build Coastguard Worker 
107*cf84ac9aSAndroid Build Coastguard Worker 			for (j = 0; j <= (i % 16); j++)
108*cf84ac9aSAndroid Build Coastguard Worker 				printf(".");
109*cf84ac9aSAndroid Build Coastguard Worker 			for (j = i % 16; j < 15; j++)
110*cf84ac9aSAndroid Build Coastguard Worker 				printf(" ");
111*cf84ac9aSAndroid Build Coastguard Worker 
112*cf84ac9aSAndroid Build Coastguard Worker 			printf(" |\n");
113*cf84ac9aSAndroid Build Coastguard Worker 
114*cf84ac9aSAndroid Build Coastguard Worker 		}
115*cf84ac9aSAndroid Build Coastguard Worker 	}
116*cf84ac9aSAndroid Build Coastguard Worker }
117*cf84ac9aSAndroid Build Coastguard Worker #endif /* DUMPIO_READ || DUMPIO_WRITE */
118*cf84ac9aSAndroid Build Coastguard Worker 
119*cf84ac9aSAndroid Build Coastguard Worker static void
cleanup(void)120*cf84ac9aSAndroid Build Coastguard Worker cleanup(void)
121*cf84ac9aSAndroid Build Coastguard Worker {
122*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
123*cf84ac9aSAndroid Build Coastguard Worker 
124*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_unlink, mq_name);
125*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_unlink(\"%s\") = %s\n", mq_name, sprintrc(rc));
126*cf84ac9aSAndroid Build Coastguard Worker 
127*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
128*cf84ac9aSAndroid Build Coastguard Worker }
129*cf84ac9aSAndroid Build Coastguard Worker 
130*cf84ac9aSAndroid Build Coastguard Worker static void
do_send(int fd,char * msg,unsigned int msg_size,struct timespec * tmout,bool cropped)131*cf84ac9aSAndroid Build Coastguard Worker do_send(int fd, char *msg, unsigned int msg_size, struct timespec *tmout,
132*cf84ac9aSAndroid Build Coastguard Worker 	bool cropped)
133*cf84ac9aSAndroid Build Coastguard Worker {
134*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
135*cf84ac9aSAndroid Build Coastguard Worker 	long saved_errno;
136*cf84ac9aSAndroid Build Coastguard Worker 
137*cf84ac9aSAndroid Build Coastguard Worker 	do {
138*cf84ac9aSAndroid Build Coastguard Worker 		rc = syscall(__NR_mq_timedsend, fd, msg, msg_size, 42,
139*cf84ac9aSAndroid Build Coastguard Worker 			     tmout);
140*cf84ac9aSAndroid Build Coastguard Worker 		saved_errno = errno;
141*cf84ac9aSAndroid Build Coastguard Worker 		printf("mq_timedsend(%d, ", fd);
142*cf84ac9aSAndroid Build Coastguard Worker 		printstr(MSG_START, msg_size > MSG_MAX_UNCUT ? MSG_MAX_UNCUT :
143*cf84ac9aSAndroid Build Coastguard Worker 			 msg_size);
144*cf84ac9aSAndroid Build Coastguard Worker 		if (cropped)
145*cf84ac9aSAndroid Build Coastguard Worker 			printf("...");
146*cf84ac9aSAndroid Build Coastguard Worker 		errno = saved_errno;
147*cf84ac9aSAndroid Build Coastguard Worker 		printf(", %u, 42, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", msg_size,
148*cf84ac9aSAndroid Build Coastguard Worker 		       (long long) tmout->tv_sec,
149*cf84ac9aSAndroid Build Coastguard Worker 		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
150*cf84ac9aSAndroid Build Coastguard Worker 		errno = saved_errno;
151*cf84ac9aSAndroid Build Coastguard Worker 
152*cf84ac9aSAndroid Build Coastguard Worker 		if (rc == -1) {
153*cf84ac9aSAndroid Build Coastguard Worker 			if (errno == EINTR)
154*cf84ac9aSAndroid Build Coastguard Worker 				continue;
155*cf84ac9aSAndroid Build Coastguard Worker 			perror_msg_and_skip("mq_timedsend");
156*cf84ac9aSAndroid Build Coastguard Worker 		}
157*cf84ac9aSAndroid Build Coastguard Worker # if DUMPIO_WRITE
158*cf84ac9aSAndroid Build Coastguard Worker 		dumpstr(MSG_START, msg_size);
159*cf84ac9aSAndroid Build Coastguard Worker # endif
160*cf84ac9aSAndroid Build Coastguard Worker 	} while (rc);
161*cf84ac9aSAndroid Build Coastguard Worker }
162*cf84ac9aSAndroid Build Coastguard Worker 
163*cf84ac9aSAndroid Build Coastguard Worker static void
do_recv(int fd,char * msg,unsigned int msg_size,struct timespec * tmout,bool cropped)164*cf84ac9aSAndroid Build Coastguard Worker do_recv(int fd, char *msg, unsigned int msg_size, struct timespec *tmout,
165*cf84ac9aSAndroid Build Coastguard Worker 	bool cropped)
166*cf84ac9aSAndroid Build Coastguard Worker {
167*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
168*cf84ac9aSAndroid Build Coastguard Worker 	long saved_errno;
169*cf84ac9aSAndroid Build Coastguard Worker 	unsigned prio;
170*cf84ac9aSAndroid Build Coastguard Worker 
171*cf84ac9aSAndroid Build Coastguard Worker 	do {
172*cf84ac9aSAndroid Build Coastguard Worker 		rc = syscall(__NR_mq_timedreceive, fd, msg, MSG_SIZE, &prio,
173*cf84ac9aSAndroid Build Coastguard Worker 			     tmout);
174*cf84ac9aSAndroid Build Coastguard Worker 		saved_errno = errno;
175*cf84ac9aSAndroid Build Coastguard Worker 		printf("mq_timedreceive(%d, ", fd);
176*cf84ac9aSAndroid Build Coastguard Worker 		if (rc >= 0) {
177*cf84ac9aSAndroid Build Coastguard Worker 			printstr(MSG_START, rc > MSG_MAX_UNCUT ? MSG_MAX_UNCUT :
178*cf84ac9aSAndroid Build Coastguard Worker 				 rc);
179*cf84ac9aSAndroid Build Coastguard Worker 			if (cropped)
180*cf84ac9aSAndroid Build Coastguard Worker 				printf("...");
181*cf84ac9aSAndroid Build Coastguard Worker 		} else {
182*cf84ac9aSAndroid Build Coastguard Worker 			printf("%p", msg);
183*cf84ac9aSAndroid Build Coastguard Worker 		}
184*cf84ac9aSAndroid Build Coastguard Worker 		errno = saved_errno;
185*cf84ac9aSAndroid Build Coastguard Worker 		printf(", %u, [42], {tv_sec=%lld, tv_nsec=%llu}) = %s\n", MSG_SIZE,
186*cf84ac9aSAndroid Build Coastguard Worker 		       (long long) tmout->tv_sec,
187*cf84ac9aSAndroid Build Coastguard Worker 		       zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc));
188*cf84ac9aSAndroid Build Coastguard Worker 		errno = saved_errno;
189*cf84ac9aSAndroid Build Coastguard Worker 
190*cf84ac9aSAndroid Build Coastguard Worker 		if (rc == -1) {
191*cf84ac9aSAndroid Build Coastguard Worker 			if (errno == EINTR)
192*cf84ac9aSAndroid Build Coastguard Worker 				continue;
193*cf84ac9aSAndroid Build Coastguard Worker 			perror_msg_and_skip("mq_timedreceive");
194*cf84ac9aSAndroid Build Coastguard Worker 		}
195*cf84ac9aSAndroid Build Coastguard Worker 		if ((rc >= 0) && ((unsigned long) rc != msg_size))
196*cf84ac9aSAndroid Build Coastguard Worker 			error_msg_and_skip("mq_timedreceive size mismatch"
197*cf84ac9aSAndroid Build Coastguard Worker 					   ": expected %u, got %ld",
198*cf84ac9aSAndroid Build Coastguard Worker 					   msg_size, rc);
199*cf84ac9aSAndroid Build Coastguard Worker # if DUMPIO_READ
200*cf84ac9aSAndroid Build Coastguard Worker 		dumpstr(MSG_START, rc);
201*cf84ac9aSAndroid Build Coastguard Worker # endif
202*cf84ac9aSAndroid Build Coastguard Worker 	} while (rc < 0);
203*cf84ac9aSAndroid Build Coastguard Worker }
204*cf84ac9aSAndroid Build Coastguard Worker 
205*cf84ac9aSAndroid Build Coastguard Worker int
main(void)206*cf84ac9aSAndroid Build Coastguard Worker main(void)
207*cf84ac9aSAndroid Build Coastguard Worker {
208*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_zero =
209*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0x8765432100000000ULL;
210*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_oflags =
211*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xdefaced100000003ULL;
212*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_mode =
213*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xdec0deadfacefeedULL;
214*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_fd =
215*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xfeedfacedeadba5eULL;
216*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_zero_size =
217*cf84ac9aSAndroid Build Coastguard Worker 		(sizeof(kernel_ulong_t) > sizeof(int)) ? (kernel_ulong_t) 0 :
218*cf84ac9aSAndroid Build Coastguard Worker 			(kernel_ulong_t) 0xface1e5500000000ULL;
219*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_size =
220*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xbadc0dedda7a1057ULL;
221*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_prio =
222*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xdec0ded1defaced3ULL;
223*cf84ac9aSAndroid Build Coastguard Worker 	static const struct timespec bogus_tmout_data = {
224*cf84ac9aSAndroid Build Coastguard Worker 		.tv_sec = (time_t) 0xdeadfacebeeff00dLL,
225*cf84ac9aSAndroid Build Coastguard Worker 		.tv_nsec = (long) 0xfacefee1deadfeedLL,
226*cf84ac9aSAndroid Build Coastguard Worker 	};
227*cf84ac9aSAndroid Build Coastguard Worker 	static const struct timespec future_tmout_data = {
228*cf84ac9aSAndroid Build Coastguard Worker 		.tv_sec = (time_t) 0x7ea1fade7e57faceLL,
229*cf84ac9aSAndroid Build Coastguard Worker 		.tv_nsec = 999999999,
230*cf84ac9aSAndroid Build Coastguard Worker 	};
231*cf84ac9aSAndroid Build Coastguard Worker 	struct_sigevent bogus_sev_data = {
232*cf84ac9aSAndroid Build Coastguard Worker 		.sigev_notify = 0xdefaced,
233*cf84ac9aSAndroid Build Coastguard Worker 		.sigev_signo = 0xfacefeed,
234*cf84ac9aSAndroid Build Coastguard Worker 		.sigev_value.sival_ptr = (unsigned long) 0xdeadbeefbadc0dedULL
235*cf84ac9aSAndroid Build Coastguard Worker 	};
236*cf84ac9aSAndroid Build Coastguard Worker 
237*cf84ac9aSAndroid Build Coastguard Worker 	const char *errstr;
238*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
239*cf84ac9aSAndroid Build Coastguard Worker 	kernel_long_t *bogus_attrs = tail_alloc(sizeof(*bogus_attrs) *
240*cf84ac9aSAndroid Build Coastguard Worker 		NUM_ATTRS);
241*cf84ac9aSAndroid Build Coastguard Worker 	char *msg = tail_alloc(MSG_SIZE);
242*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned, bogus_prio_ptr);
243*cf84ac9aSAndroid Build Coastguard Worker 	struct timespec *bogus_tmout = tail_memdup(&bogus_tmout_data,
244*cf84ac9aSAndroid Build Coastguard Worker 		sizeof(*bogus_tmout));
245*cf84ac9aSAndroid Build Coastguard Worker 	struct timespec *future_tmout = tail_memdup(&future_tmout_data,
246*cf84ac9aSAndroid Build Coastguard Worker 		sizeof(*future_tmout));
247*cf84ac9aSAndroid Build Coastguard Worker 	struct_sigevent *bogus_sev = tail_memdup(&bogus_sev_data,
248*cf84ac9aSAndroid Build Coastguard Worker 		sizeof(*bogus_sev));
249*cf84ac9aSAndroid Build Coastguard Worker 	int fd = -1;
250*cf84ac9aSAndroid Build Coastguard Worker 
251*cf84ac9aSAndroid Build Coastguard Worker 
252*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex(msg, MSG_SIZE, MSG_START, MSG_SIZE);
253*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex(bogus_attrs, sizeof(*bogus_attrs) * NUM_ATTRS,
254*cf84ac9aSAndroid Build Coastguard Worker 		       0xbb, 0x70);
255*cf84ac9aSAndroid Build Coastguard Worker 
256*cf84ac9aSAndroid Build Coastguard Worker 
257*cf84ac9aSAndroid Build Coastguard Worker 	/* mq_open */
258*cf84ac9aSAndroid Build Coastguard Worker 
259*cf84ac9aSAndroid Build Coastguard Worker 	/* Zero values, non-O_CREAT mode */
260*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_open, NULL, bogus_zero, bogus_mode, NULL);
261*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_open(NULL, O_RDONLY) = %s\n", sprintrc(rc));
262*cf84ac9aSAndroid Build Coastguard Worker 
263*cf84ac9aSAndroid Build Coastguard Worker 	/* O_CREAT parsing, other flags, bogs values */
264*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
265*cf84ac9aSAndroid Build Coastguard Worker 		     NULL);
266*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, NULL) = %s\n",
267*cf84ac9aSAndroid Build Coastguard Worker 	       msg, (unsigned short) bogus_mode, sprintrc(rc));
268*cf84ac9aSAndroid Build Coastguard Worker 
269*cf84ac9aSAndroid Build Coastguard Worker 	/* Partially invalid attributes structure */
270*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
271*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_attrs + 1);
272*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, %p) = %s\n",
273*cf84ac9aSAndroid Build Coastguard Worker 	       msg, (unsigned short) bogus_mode, bogus_attrs + 1, sprintrc(rc));
274*cf84ac9aSAndroid Build Coastguard Worker 
275*cf84ac9aSAndroid Build Coastguard Worker 	/* Valid attributes structure */
276*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_open, msg, O_CREAT | bogus_oflags, bogus_mode,
277*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_attrs);
278*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_open(%p, O_ACCMODE|O_CREAT, %#o, {mq_flags=%#llx"
279*cf84ac9aSAndroid Build Coastguard Worker 	       ", mq_maxmsg=%lld, mq_msgsize=%lld, mq_curmsgs=%lld}) = %s\n",
280*cf84ac9aSAndroid Build Coastguard Worker 	       msg, (unsigned short) bogus_mode,
281*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
282*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_attrs[1],
283*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_attrs[2],
284*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_attrs[3], sprintrc(rc));
285*cf84ac9aSAndroid Build Coastguard Worker 
286*cf84ac9aSAndroid Build Coastguard Worker 
287*cf84ac9aSAndroid Build Coastguard Worker 	/* mq_timedsend */
288*cf84ac9aSAndroid Build Coastguard Worker 
289*cf84ac9aSAndroid Build Coastguard Worker 	/* Zero values*/
290*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedsend, bogus_zero, NULL, bogus_zero_size,
291*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_zero, NULL);
292*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedsend(0, NULL, 0, 0, NULL) = %s\n", sprintrc(rc));
293*cf84ac9aSAndroid Build Coastguard Worker 
294*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid pointers */
295*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE, bogus_size,
296*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_prio, bogus_tmout + 1);
297*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedsend(%d, %p, %llu, %u, %p) = %s\n",
298*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, msg + MSG_SIZE, (unsigned long long) bogus_size,
299*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned) bogus_prio, bogus_tmout + 1, sprintrc(rc));
300*cf84ac9aSAndroid Build Coastguard Worker 
301*cf84ac9aSAndroid Build Coastguard Worker 	/* Partially invalid message (memory only partially available) */
302*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
303*cf84ac9aSAndroid Build Coastguard Worker 		     MSG_SIZE, bogus_prio, bogus_tmout);
304*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedsend(%d, %p, %llu, %u, {tv_sec=%lld, tv_nsec=%llu})"
305*cf84ac9aSAndroid Build Coastguard Worker 	       " = %s\n",
306*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, msg + MSG_SIZE - MSG_CUT,
307*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
308*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_tmout->tv_sec,
309*cf84ac9aSAndroid Build Coastguard Worker 	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
310*cf84ac9aSAndroid Build Coastguard Worker 
311*cf84ac9aSAndroid Build Coastguard Worker 	/* Fully valid message, uncut */
312*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_SIZE - MSG_CUT,
313*cf84ac9aSAndroid Build Coastguard Worker 		     MSG_CUT, bogus_prio, bogus_tmout);
314*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
315*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedsend(%d, ", (int) bogus_fd);
316*cf84ac9aSAndroid Build Coastguard Worker 	printstr(MSG_START + MSG_SIZE - MSG_CUT, MSG_CUT);
317*cf84ac9aSAndroid Build Coastguard Worker 	printf(", %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
318*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) MSG_CUT, (unsigned) bogus_prio,
319*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_tmout->tv_sec,
320*cf84ac9aSAndroid Build Coastguard Worker 	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
321*cf84ac9aSAndroid Build Coastguard Worker 
322*cf84ac9aSAndroid Build Coastguard Worker 	/* Partially invalid message, cut at maxstrlen */
323*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedsend, bogus_fd, msg + MSG_CUT, MSG_SIZE,
324*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_prio, bogus_tmout);
325*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
326*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedsend(%d, ", (int) bogus_fd);
327*cf84ac9aSAndroid Build Coastguard Worker 	printstr(MSG_START + MSG_CUT, MSG_MAX_UNCUT);
328*cf84ac9aSAndroid Build Coastguard Worker 	printf("..., %llu, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n",
329*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) MSG_SIZE, (unsigned) bogus_prio,
330*cf84ac9aSAndroid Build Coastguard Worker 	       (long long) bogus_tmout->tv_sec,
331*cf84ac9aSAndroid Build Coastguard Worker 	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), errstr);
332*cf84ac9aSAndroid Build Coastguard Worker 
333*cf84ac9aSAndroid Build Coastguard Worker 
334*cf84ac9aSAndroid Build Coastguard Worker 	/* mq_timedreceive */
335*cf84ac9aSAndroid Build Coastguard Worker 
336*cf84ac9aSAndroid Build Coastguard Worker 	/* Zero values */
337*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedreceive, bogus_zero, NULL, bogus_zero_size,
338*cf84ac9aSAndroid Build Coastguard Worker 		     NULL, NULL);
339*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedreceive(0, NULL, 0, NULL, NULL) = %s\n", sprintrc(rc));
340*cf84ac9aSAndroid Build Coastguard Worker 
341*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid addresses */
342*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedreceive, bogus_fd, msg + MSG_SIZE, bogus_size,
343*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_prio_ptr + 1, bogus_tmout + 1);
344*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedreceive(%d, %p, %llu, %p, %p) = %s\n",
345*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, msg + MSG_SIZE, (unsigned long long) bogus_size,
346*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_prio_ptr + 1, bogus_tmout + 1, sprintrc(rc));
347*cf84ac9aSAndroid Build Coastguard Worker 
348*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid fd, valid msg pointer */
349*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_timedreceive, bogus_fd, msg, bogus_size,
350*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_prio_ptr, bogus_tmout);
351*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_timedreceive(%d, %p, %llu, %p, {tv_sec=%lld, tv_nsec=%llu}) "
352*cf84ac9aSAndroid Build Coastguard Worker 	       "= %s\n",
353*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, msg, (unsigned long long) bogus_size,
354*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_prio_ptr, (long long) bogus_tmout->tv_sec,
355*cf84ac9aSAndroid Build Coastguard Worker 	       zero_extend_signed_to_ull(bogus_tmout->tv_nsec), sprintrc(rc));
356*cf84ac9aSAndroid Build Coastguard Worker 
357*cf84ac9aSAndroid Build Coastguard Worker 
358*cf84ac9aSAndroid Build Coastguard Worker 	/* mq_notify */
359*cf84ac9aSAndroid Build Coastguard Worker 
360*cf84ac9aSAndroid Build Coastguard Worker 	/* Zero values */
361*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_zero, NULL);
362*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(0, NULL) = %s\n", sprintrc(rc));
363*cf84ac9aSAndroid Build Coastguard Worker 
364*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid pointer */
365*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev + 1);
366*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(%d, %p) = %s\n",
367*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, bogus_sev + 1, sprintrc(rc));
368*cf84ac9aSAndroid Build Coastguard Worker 
369*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid SIGEV_* */
370*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
371*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
372*cf84ac9aSAndroid Build Coastguard Worker 	       ", sigev_signo=%u, sigev_notify=%#x /* SIGEV_??? */}) = %s\n",
373*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
374*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_value.sival_ptr,
375*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_signo, bogus_sev->sigev_notify,
376*cf84ac9aSAndroid Build Coastguard Worker 	       sprintrc(rc));
377*cf84ac9aSAndroid Build Coastguard Worker 
378*cf84ac9aSAndroid Build Coastguard Worker 	/* SIGEV_NONE */
379*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_notify = SIGEV_NONE;
380*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
381*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
382*cf84ac9aSAndroid Build Coastguard Worker 	       ", sigev_signo=%u, sigev_notify=SIGEV_NONE}) = %s\n",
383*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
384*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_value.sival_ptr,
385*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_signo, sprintrc(rc));
386*cf84ac9aSAndroid Build Coastguard Worker 
387*cf84ac9aSAndroid Build Coastguard Worker 	/* SIGEV_SIGNAL */
388*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_notify = SIGEV_SIGNAL;
389*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_signo = SIGALRM;
390*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
391*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
392*cf84ac9aSAndroid Build Coastguard Worker 	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_SIGNAL}) = %s\n",
393*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
394*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_value.sival_ptr, sprintrc(rc));
395*cf84ac9aSAndroid Build Coastguard Worker 
396*cf84ac9aSAndroid Build Coastguard Worker 	/* SIGEV_THREAD */
397*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_notify = SIGEV_THREAD;
398*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_un.sigev_thread.function =
399*cf84ac9aSAndroid Build Coastguard Worker 		(unsigned long) 0xdeadbeefbadc0dedULL;
400*cf84ac9aSAndroid Build Coastguard Worker 	bogus_sev->sigev_un.sigev_thread.attribute =
401*cf84ac9aSAndroid Build Coastguard Worker 		(unsigned long) 0xcafef00dfacefeedULL;
402*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_notify, bogus_fd, bogus_sev);
403*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_notify(%d, {sigev_value={sival_int=%d, sival_ptr=%#lx}"
404*cf84ac9aSAndroid Build Coastguard Worker 	       ", sigev_signo=SIGALRM, sigev_notify=SIGEV_THREAD"
405*cf84ac9aSAndroid Build Coastguard Worker 	       ", sigev_notify_function=%#lx, sigev_notify_attributes=%#lx})"
406*cf84ac9aSAndroid Build Coastguard Worker 	       " = %s\n",
407*cf84ac9aSAndroid Build Coastguard Worker 	       (int) bogus_fd, bogus_sev->sigev_value.sival_int,
408*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_value.sival_ptr,
409*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_un.sigev_thread.function,
410*cf84ac9aSAndroid Build Coastguard Worker 	       bogus_sev->sigev_un.sigev_thread.attribute, sprintrc(rc));
411*cf84ac9aSAndroid Build Coastguard Worker 
412*cf84ac9aSAndroid Build Coastguard Worker 	/* mq_unlink */
413*cf84ac9aSAndroid Build Coastguard Worker 
414*cf84ac9aSAndroid Build Coastguard Worker 	/* Zero values */
415*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_unlink, NULL);
416*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_unlink(NULL) = %s\n", sprintrc(rc));
417*cf84ac9aSAndroid Build Coastguard Worker 
418*cf84ac9aSAndroid Build Coastguard Worker 	/* Invalid ptr */
419*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_unlink, msg + MSG_SIZE);
420*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_unlink(%p) = %s\n", msg + MSG_SIZE, sprintrc(rc));
421*cf84ac9aSAndroid Build Coastguard Worker 
422*cf84ac9aSAndroid Build Coastguard Worker 	/* Long unterminated string */
423*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_unlink, msg);
424*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
425*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_unlink(%p) = %s\n", msg, errstr);
426*cf84ac9aSAndroid Build Coastguard Worker 
427*cf84ac9aSAndroid Build Coastguard Worker 
428*cf84ac9aSAndroid Build Coastguard Worker 	/* Sending and receiving test */
429*cf84ac9aSAndroid Build Coastguard Worker 
430*cf84ac9aSAndroid Build Coastguard Worker 	if (asprintf(&mq_name, "strace-mq_sendrecv-%u.sample", getpid()) < 0)
431*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_fail("asprintf");
432*cf84ac9aSAndroid Build Coastguard Worker 
433*cf84ac9aSAndroid Build Coastguard Worker # if DUMPIO_READ || DUMPIO_WRITE
434*cf84ac9aSAndroid Build Coastguard Worker 	close(0);
435*cf84ac9aSAndroid Build Coastguard Worker # endif
436*cf84ac9aSAndroid Build Coastguard Worker 	bogus_attrs[1] = 2;
437*cf84ac9aSAndroid Build Coastguard Worker 	bogus_attrs[2] = MSG_SIZE;
438*cf84ac9aSAndroid Build Coastguard Worker 	fd = rc = syscall(__NR_mq_open, mq_name,
439*cf84ac9aSAndroid Build Coastguard Worker 			  O_CREAT|O_RDWR|O_NONBLOCK, S_IRWXU, bogus_attrs);
440*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
441*cf84ac9aSAndroid Build Coastguard Worker 	if (rc < 0)
442*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("mq_open");
443*cf84ac9aSAndroid Build Coastguard Worker 	else
444*cf84ac9aSAndroid Build Coastguard Worker 		atexit(cleanup);
445*cf84ac9aSAndroid Build Coastguard Worker # if DUMPIO_READ || DUMPIO_WRITE
446*cf84ac9aSAndroid Build Coastguard Worker 	if (fd != 0)
447*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_skip("mq_open returned fd other than 0");
448*cf84ac9aSAndroid Build Coastguard Worker # endif
449*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex(bogus_attrs, sizeof(*bogus_attrs) * NUM_ATTRS,
450*cf84ac9aSAndroid Build Coastguard Worker 		       0xbb, 0x70);
451*cf84ac9aSAndroid Build Coastguard Worker 	printf("mq_open(\"%s\", O_RDWR|O_CREAT|O_NONBLOCK, 0700"
452*cf84ac9aSAndroid Build Coastguard Worker 	       ", {mq_flags=%#llx, mq_maxmsg=2, mq_msgsize=%u"
453*cf84ac9aSAndroid Build Coastguard Worker 	       ", mq_curmsgs=%lld}) = %s\n",
454*cf84ac9aSAndroid Build Coastguard Worker 	       mq_name, (unsigned long long) (kernel_ulong_t) bogus_attrs[0],
455*cf84ac9aSAndroid Build Coastguard Worker 	       MSG_SIZE, (long long) bogus_attrs[3], errstr);
456*cf84ac9aSAndroid Build Coastguard Worker 
457*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_mq_getsetattr, fd, NULL, bogus_attrs);
458*cf84ac9aSAndroid Build Coastguard Worker 	if (rc < 0)
459*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_skip("mq_getsetattr");
460*cf84ac9aSAndroid Build Coastguard Worker 	if ((bogus_attrs[1] < 2) || (bogus_attrs[2] < MSG_SIZE))
461*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_skip("mq too small");
462*cf84ac9aSAndroid Build Coastguard Worker 
463*cf84ac9aSAndroid Build Coastguard Worker 	do_send(fd, msg, MSG_CUT, future_tmout, false);
464*cf84ac9aSAndroid Build Coastguard Worker 	do_send(fd, msg, MSG_SIZE, future_tmout, true);
465*cf84ac9aSAndroid Build Coastguard Worker 
466*cf84ac9aSAndroid Build Coastguard Worker 	memset(msg, '\0', MSG_SIZE);
467*cf84ac9aSAndroid Build Coastguard Worker 	do_recv(fd, msg, MSG_CUT, future_tmout, false);
468*cf84ac9aSAndroid Build Coastguard Worker 
469*cf84ac9aSAndroid Build Coastguard Worker 	memset(msg, '\0', MSG_SIZE);
470*cf84ac9aSAndroid Build Coastguard Worker 	do_recv(fd, msg, MSG_SIZE, future_tmout, true);
471*cf84ac9aSAndroid Build Coastguard Worker 
472*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
473*cf84ac9aSAndroid Build Coastguard Worker }
474*cf84ac9aSAndroid Build Coastguard Worker 
475*cf84ac9aSAndroid Build Coastguard Worker #else
476*cf84ac9aSAndroid Build Coastguard Worker 
477*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("__NR_mq_open && __NR_mq_timedsend && "
478*cf84ac9aSAndroid Build Coastguard Worker 	"__NR_mq_timedreceive && __NR_mq_notify && __NR_mq_unlink");
479*cf84ac9aSAndroid Build Coastguard Worker 
480*cf84ac9aSAndroid Build Coastguard Worker #endif
481