xref: /aosp_15_r20/external/strace/tests/ioctl_sg_io_v3.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check decoding of ioctl SG_IO v3 commands.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2017 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
6*cf84ac9aSAndroid Build Coastguard Worker  *
7*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
8*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
9*cf84ac9aSAndroid Build Coastguard Worker  * are met:
10*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
11*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
12*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
14*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
15*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
16*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
17*cf84ac9aSAndroid Build Coastguard Worker  *
18*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*cf84ac9aSAndroid Build Coastguard Worker  */
29*cf84ac9aSAndroid Build Coastguard Worker 
30*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
31*cf84ac9aSAndroid Build Coastguard Worker 
32*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_SCSI_SG_H
33*cf84ac9aSAndroid Build Coastguard Worker 
34*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
35*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
36*cf84ac9aSAndroid Build Coastguard Worker # include <sys/ioctl.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <sys/uio.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <scsi/sg.h>
39*cf84ac9aSAndroid Build Coastguard Worker 
40*cf84ac9aSAndroid Build Coastguard Worker int
main(void)41*cf84ac9aSAndroid Build Coastguard Worker main(void)
42*cf84ac9aSAndroid Build Coastguard Worker {
43*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, 0);
44*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, NULL) = -1 EBADF (%m)\n");
45*cf84ac9aSAndroid Build Coastguard Worker 
46*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(struct sg_io_hdr, sg_io);
47*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory(sg_io, sizeof(*sg_io));
48*cf84ac9aSAndroid Build Coastguard Worker 
49*cf84ac9aSAndroid Build Coastguard Worker 	const void *const efault = sg_io + 1;
50*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, efault);
51*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, %p) = -1 EBADF (%m)\n", efault);
52*cf84ac9aSAndroid Build Coastguard Worker 
53*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
54*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, [%u]) = -1 EBADF (%m)\n", sg_io->interface_id);
55*cf84ac9aSAndroid Build Coastguard Worker 
56*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, piid);
57*cf84ac9aSAndroid Build Coastguard Worker 	*piid = (unsigned char) 'S';
58*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, piid);
59*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S', %p}) = -1 EBADF (%m)\n", piid + 1);
60*cf84ac9aSAndroid Build Coastguard Worker 
61*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->interface_id = (unsigned char) 'S';
62*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_direction = -2;
63*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = -1U;
64*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->info = -1U;
65*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxferp = (void *) (unsigned long) 0xfacefeedfffffff1ULL;
66*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->cmdp = (void *) (unsigned long) 0xfacefeedfffffff2ULL;
67*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->sbp = (void *) (unsigned long) 0xfacefeedfffffff3ULL;
68*cf84ac9aSAndroid Build Coastguard Worker 
69*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
70*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
71*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_TO_DEV"
72*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
73*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
74*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
75*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
76*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
77*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
78*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_DIRECT_IO|SG_FLAG_UNUSED_LUN_INHIBIT"
79*cf84ac9aSAndroid Build Coastguard Worker 	       "|SG_FLAG_MMAP_IO|SG_FLAG_NO_DXFER"
80*cf84ac9aSAndroid Build Coastguard Worker 	       "|SG_FLAG_Q_AT_TAIL|SG_FLAG_Q_AT_HEAD|0xfffeffc8"
81*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=%p"
82*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
83*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
84*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
85*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
86*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
87*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
88*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
89*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
90*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
91*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK|SG_INFO_DIRECT_IO|SG_INFO_MIXED_IO|0xfffffff8"
92*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
93*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
94*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
95*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
96*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
97*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
98*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
99*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxferp,
100*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
101*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
102*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
103*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
104*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
105*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
106*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
107*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
108*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
109*cf84ac9aSAndroid Build Coastguard Worker 
110*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_direction = -3;
111*cf84ac9aSAndroid Build Coastguard Worker 
112*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
113*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
114*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_FROM_DEV"
115*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
116*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
117*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
118*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
119*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
120*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
121*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_DIRECT_IO|SG_FLAG_UNUSED_LUN_INHIBIT"
122*cf84ac9aSAndroid Build Coastguard Worker 	       "|SG_FLAG_MMAP_IO|SG_FLAG_NO_DXFER"
123*cf84ac9aSAndroid Build Coastguard Worker 	       "|SG_FLAG_Q_AT_TAIL|SG_FLAG_Q_AT_HEAD|0xfffeffc8"
124*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=%p"
125*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
126*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
127*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
128*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
129*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
130*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
131*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
132*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
133*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
134*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK|SG_INFO_DIRECT_IO|SG_INFO_MIXED_IO|0xfffffff8"
135*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
136*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
137*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
138*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
139*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
140*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
141*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
142*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxferp,
143*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
144*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
145*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
146*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
147*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
148*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
149*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
150*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
151*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
152*cf84ac9aSAndroid Build Coastguard Worker 
153*cf84ac9aSAndroid Build Coastguard Worker 	const struct iovec iov[] = {
154*cf84ac9aSAndroid Build Coastguard Worker 		{
155*cf84ac9aSAndroid Build Coastguard Worker 			.iov_base = (void *) efault - 2,
156*cf84ac9aSAndroid Build Coastguard Worker 			.iov_len = 2
157*cf84ac9aSAndroid Build Coastguard Worker 		}, {
158*cf84ac9aSAndroid Build Coastguard Worker 			.iov_base = (void *) efault - 3,
159*cf84ac9aSAndroid Build Coastguard Worker 			.iov_len = 4
160*cf84ac9aSAndroid Build Coastguard Worker 		}
161*cf84ac9aSAndroid Build Coastguard Worker 	};
162*cf84ac9aSAndroid Build Coastguard Worker 	struct iovec *const t_iov = tail_memdup(iov, sizeof(iov));
163*cf84ac9aSAndroid Build Coastguard Worker 
164*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = 0x24;
165*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->info = 1;
166*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_direction = -2;
167*cf84ac9aSAndroid Build Coastguard Worker 
168*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->iovec_count = ARRAY_SIZE(iov);
169*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_len = iov[0].iov_len + iov[1].iov_len - 1;
170*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxferp = t_iov;
171*cf84ac9aSAndroid Build Coastguard Worker 
172*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
173*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
174*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_TO_DEV"
175*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
176*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
177*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
178*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
179*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
180*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
181*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_MMAP_IO|SG_FLAG_Q_AT_HEAD"
182*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=[{iov_base=\"\\%o\\%o\", iov_len=%u}"
183*cf84ac9aSAndroid Build Coastguard Worker 	       ", {iov_base=\"\\%o\\%o\\%o\", iov_len=%u}]"
184*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
185*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
186*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
187*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
188*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
189*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
190*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
191*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
192*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
193*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK"
194*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
195*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
196*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
197*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
198*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
199*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
200*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
201*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[0].iov_base + 0),
202*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[0].iov_base + 1),
203*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) iov[0].iov_len,
204*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 0),
205*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 1),
206*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 2),
207*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) iov[1].iov_len,
208*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
209*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
210*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
211*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
212*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
213*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
214*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
215*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
216*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
217*cf84ac9aSAndroid Build Coastguard Worker 
218*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = 0x11;
219*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_direction = -3;
220*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->resid = sg_io->dxfer_len + 1;
221*cf84ac9aSAndroid Build Coastguard Worker 
222*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
223*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
224*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_FROM_DEV"
225*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
226*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
227*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
228*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
229*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
230*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
231*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_DIRECT_IO|SG_FLAG_Q_AT_TAIL"
232*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=[{iov_base=\"\\%o\\%o\", iov_len=%u}"
233*cf84ac9aSAndroid Build Coastguard Worker 	       ", {iov_base=\"\\%o\\%o\\%o\", iov_len=%u}]"
234*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
235*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
236*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
237*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
238*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
239*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
240*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
241*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
242*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
243*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK"
244*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
245*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
246*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
247*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
248*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
249*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
250*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
251*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[0].iov_base + 0),
252*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[0].iov_base + 1),
253*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) iov[0].iov_len,
254*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 0),
255*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 1),
256*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (iov[1].iov_base + 2),
257*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) iov[1].iov_len,
258*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
259*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
260*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
261*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
262*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
263*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
264*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
265*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
266*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
267*cf84ac9aSAndroid Build Coastguard Worker 
268*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = 0x10000;
269*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->info = 0xdeadbeef;
270*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->iovec_count = 0;
271*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_len = 5;
272*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->resid = 1;
273*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxferp = (void *) efault - (sg_io->dxfer_len - sg_io->resid);
274*cf84ac9aSAndroid Build Coastguard Worker 
275*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
276*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
277*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_FROM_DEV"
278*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
279*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
280*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
281*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
282*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
283*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
284*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_NO_DXFER"
285*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=\"\\x%x\\x%x\\x%x\\x%x\""
286*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
287*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
288*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
289*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
290*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
291*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
292*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
293*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
294*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
295*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK|SG_INFO_DIRECT_IO|SG_INFO_MIXED_IO|0xdeadbee8"
296*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
297*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
298*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
299*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
300*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
301*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
302*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
303*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 0),
304*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 1),
305*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 2),
306*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 3),
307*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
308*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
309*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
310*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
311*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
312*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
313*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
314*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
315*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
316*cf84ac9aSAndroid Build Coastguard Worker 
317*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = 2;
318*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_direction = -4;
319*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxfer_len = 3;
320*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->resid = 1;
321*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->dxferp = (void *) efault - sg_io->dxfer_len;
322*cf84ac9aSAndroid Build Coastguard Worker 
323*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
324*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
325*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_TO_FROM_DEV"
326*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
327*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
328*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
329*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
330*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
331*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
332*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=SG_FLAG_UNUSED_LUN_INHIBIT"
333*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=\"\\x%x\\x%x\\x%x\" => dxferp=\"\\x%x\\x%x\""
334*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
335*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
336*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
337*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
338*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
339*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
340*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
341*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
342*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
343*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK|SG_INFO_DIRECT_IO|SG_INFO_MIXED_IO|0xdeadbee8"
344*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
345*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
346*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
347*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
348*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
349*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
350*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
351*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 0),
352*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 1),
353*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 2),
354*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 0),
355*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 1),
356*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
357*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
358*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
359*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
360*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
361*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
362*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
363*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
364*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
365*cf84ac9aSAndroid Build Coastguard Worker 
366*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->flags = 0;
367*cf84ac9aSAndroid Build Coastguard Worker 	sg_io->resid = sg_io->dxfer_len;
368*cf84ac9aSAndroid Build Coastguard Worker 
369*cf84ac9aSAndroid Build Coastguard Worker 	ioctl(-1, SG_IO, sg_io);
370*cf84ac9aSAndroid Build Coastguard Worker 	printf("ioctl(-1, SG_IO, {interface_id='S'"
371*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_direction=SG_DXFER_TO_FROM_DEV"
372*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmd_len=%u"
373*cf84ac9aSAndroid Build Coastguard Worker 	       ", cmdp=%p"
374*cf84ac9aSAndroid Build Coastguard Worker 	       ", mx_sb_len=%u"
375*cf84ac9aSAndroid Build Coastguard Worker 	       ", iovec_count=%u"
376*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxfer_len=%u"
377*cf84ac9aSAndroid Build Coastguard Worker 	       ", timeout=%u"
378*cf84ac9aSAndroid Build Coastguard Worker 	       ", flags=0"
379*cf84ac9aSAndroid Build Coastguard Worker 	       ", dxferp=\"\\x%x\\x%x\\x%x\""
380*cf84ac9aSAndroid Build Coastguard Worker 	       ", status=%#x"
381*cf84ac9aSAndroid Build Coastguard Worker 	       ", masked_status=%#x"
382*cf84ac9aSAndroid Build Coastguard Worker 	       ", msg_status=%#x"
383*cf84ac9aSAndroid Build Coastguard Worker 	       ", sb_len_wr=%u"
384*cf84ac9aSAndroid Build Coastguard Worker 	       ", sbp=%p"
385*cf84ac9aSAndroid Build Coastguard Worker 	       ", host_status=%#x"
386*cf84ac9aSAndroid Build Coastguard Worker 	       ", driver_status=%#x"
387*cf84ac9aSAndroid Build Coastguard Worker 	       ", resid=%d"
388*cf84ac9aSAndroid Build Coastguard Worker 	       ", duration=%u"
389*cf84ac9aSAndroid Build Coastguard Worker 	       ", info=SG_INFO_CHECK|SG_INFO_DIRECT_IO|SG_INFO_MIXED_IO|0xdeadbee8"
390*cf84ac9aSAndroid Build Coastguard Worker 	       "}) = -1 EBADF (%m)\n",
391*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmd_len,
392*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->cmdp,
393*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->mx_sb_len,
394*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->iovec_count,
395*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->dxfer_len,
396*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->timeout,
397*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 0),
398*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 1),
399*cf84ac9aSAndroid Build Coastguard Worker 	       *(unsigned char *) (sg_io->dxferp + 2),
400*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->status,
401*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->masked_status,
402*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->msg_status,
403*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sb_len_wr,
404*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->sbp,
405*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->host_status,
406*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->driver_status,
407*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->resid,
408*cf84ac9aSAndroid Build Coastguard Worker 	       sg_io->duration);
409*cf84ac9aSAndroid Build Coastguard Worker 
410*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
411*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
412*cf84ac9aSAndroid Build Coastguard Worker }
413*cf84ac9aSAndroid Build Coastguard Worker 
414*cf84ac9aSAndroid Build Coastguard Worker #else
415*cf84ac9aSAndroid Build Coastguard Worker 
416*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("HAVE_SCSI_SG_H")
417*cf84ac9aSAndroid Build Coastguard Worker 
418*cf84ac9aSAndroid Build Coastguard Worker #endif
419