1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes/*
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Check decoding of DM_* commands of ioctl syscall.
3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Mikulas Patocka <mpatocka@redhat.com>
5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
639bac055674d23770b9a724221b728e443196ea7Elliott Hughes * Copyright (c) 2016-2017 The strace developers.
7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * All rights reserved.
8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * Redistribution and use in source and binary forms, with or without
10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * modification, are permitted provided that the following conditions
11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * are met:
12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 1. Redistributions of source code must retain the above copyright
13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer.
14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright
15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    notice, this list of conditions and the following disclaimer in the
16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    documentation and/or other materials provided with the distribution.
17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * 3. The name of the author may not be used to endorse or promote products
18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *    derived from this software without specific prior written permission.
19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes *
20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes */
31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "tests.h"
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef HAVE_LINUX_DM_IOCTL_H
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <errno.h>
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <inttypes.h>
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdbool.h>
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stdio.h>
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <stddef.h>
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <string.h>
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <sys/ioctl.h>
43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <linux/ioctl.h>
44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# include <linux/dm-ioctl.h>
45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# ifndef VERBOSE
47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#  define VERBOSE 0
48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif
49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define STR32 "AbCdEfGhIjKlMnOpQrStUvWxYz012345"
51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define ALIGNED_SIZE(s_, t_) \
53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	(((s_) + (ALIGNOF(t_) - 1UL)) & ~(ALIGNOF(t_) - 1UL))
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# define ALIGNED_OFFSET(t_, m_) \
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ALIGNED_SIZE(offsetof(t_, m_), t_)
56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const char str129[] = STR32 STR32 STR32 STR32 "6";
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __u64 dts_sector_base = (__u64) 0xdeadca75facef157ULL;
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __u64 dts_sector_step = (__u64) 0x100000001ULL;
61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __u64 dts_length_base = (__u64) 0xbadc0dedda7a1057ULL;
62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __u64 dts_length_step = (__u64) 0x700000007ULL;
63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __s32 dts_status_base = (__s32) 3141592653U;
64d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const __s32 dts_status_step = 0x1234;
65d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
66d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic const size_t min_sizeof_dm_ioctl =
67d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	offsetof(struct dm_ioctl, data);
68d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic struct s {
70d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_ioctl ioc;
71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	union {
72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct {
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			struct dm_target_spec target_spec;
74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			char target_params[256];
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} ts;
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		struct {
77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			struct dm_target_msg target_msg;
78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			char target_string[256];
79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} tm;
80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		char string[256];
81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	} u;
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} s;
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct dm_table_open_test {
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_ioctl ioc;
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target0;
87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param0[1];
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target1;
89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param1[2];
90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target2;
91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param2[3];
92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target3;
93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param3[4];
94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target4;
95d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param4[5];
96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target5;
97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param5[6];
98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target6;
99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param6[7];
100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target7;
101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param7[8];
102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target8;
103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param8[9];
104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_spec target9;
105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char param9[10];
106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct dm_target_msg_test {
109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_ioctl ioc;
110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_msg msg;
111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
112d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstruct args {
114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int arg;
115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *str;
116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bool has_params;
117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	bool has_event_nr;
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes};
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesinit_s(struct dm_ioctl *s, size_t size, size_t offs)
123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memset(s, 0, size);
125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->version[0] = DM_VERSION_MAJOR;
126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->version[1] = 1;
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->version[2] = 2;
128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->data_size = size;
129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->data_start = offs;
130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s->dev = 0x1234;
131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s->name, "nnn");
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s->uuid, "uuu");
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesinit_dm_target_spec(struct dm_target_spec *ptr, uint32_t id)
137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ptr->sector_start = dts_sector_base + dts_sector_step * id;
139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ptr->length       = dts_length_base + dts_length_step * id;
140d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ptr->status       = dts_status_base + dts_status_step * id;
141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
142d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strncpy(ptr->target_type, str129 +
143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		id % (sizeof(str129) - sizeof(ptr->target_type)),
144d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		id % (sizeof(ptr->target_type) + 1));
145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (id % (sizeof(ptr->target_type) + 1) < sizeof(ptr->target_type))
146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ptr->target_type[id % (sizeof(ptr->target_type) + 1)] = '\0';
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstatic void
151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesprint_dm_target_spec(struct dm_target_spec *ptr, uint32_t id)
152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{sector_start=%" PRI__u64 ", length=%" PRI__u64 ", "
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_type=\"%.*s\", string=",
155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       dts_sector_base + dts_sector_step * id,
156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       dts_length_base + dts_length_step * id,
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (int) (id % (sizeof(ptr->target_type) + 1)),
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       str129 + id % (sizeof(str129) - sizeof(ptr->target_type)));
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesint
163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesmain(void)
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static kernel_ulong_t dummy_dm_ioctl1 =
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		_IOC(_IOC_READ, DM_IOCTL, 0, 0x1fff);
167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static kernel_ulong_t dummy_dm_ioctl2 =
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		_IOC(_IOC_READ|_IOC_WRITE, DM_IOCTL, 0xed, 0);
169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static kernel_ulong_t dummy_dm_arg =
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		(kernel_ulong_t) 0xbadc0dedda7a1057ULL;
171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* We can't check these properly for now */
172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static struct args dummy_check_cmds_nodev[] = {
173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_REMOVE_ALL),    false },
174d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_LIST_DEVICES),  true  },
175d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_LIST_VERSIONS), true  },
176d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	static struct args dummy_check_cmds[] = {
178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_DEV_CREATE),    false },
179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_DEV_REMOVE),    false, true },
180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_DEV_STATUS),    false },
181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_DEV_WAIT),      true,  true },
182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_TABLE_CLEAR),   false },
183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_TABLE_DEPS),    true  },
184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		{ ARG_STR(DM_TABLE_STATUS),  true  },
185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	};
186d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
187d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_ioctl *unaligned_dm_arg =
188d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(offsetof(struct dm_ioctl, data));
189d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_ioctl *dm_arg =
190d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(ALIGNED_OFFSET(struct dm_ioctl, data));
191d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_table_open_test *dm_arg_open1 =
192d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, target1));
193d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_table_open_test *dm_arg_open2 =
194d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, param1));
195d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_table_open_test *dm_arg_open3 =
196d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, target9));
197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	struct dm_target_msg_test *dm_arg_msg =
198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tail_alloc(sizeof(*dm_arg_msg));
199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	long rc;
201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const char *errstr;
202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	unsigned int i;
203d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
204d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
205d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect operation */
206d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, _IOW(DM_IOCTL, 0xde, int), dm_arg);
207d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, _IOC(_IOC_WRITE, %#x, 0xde, %#zx), %p) = "
208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n",
209d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       DM_IOCTL, sizeof(int), dm_arg);
210d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
211d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, dummy_dm_ioctl1, 0);
212d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, _IOC(_IOC_READ, %#x, 0, %#x), 0) = -1 EBADF (%m)\n",
213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       DM_IOCTL, (unsigned int) _IOC_SIZE(dummy_dm_ioctl1));
214d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, dummy_dm_ioctl2, dummy_dm_arg);
216d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, %#x, %#x, 0), %#lx) = "
217d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n",
218d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       DM_IOCTL, (unsigned int) _IOC_NR(dummy_dm_ioctl2),
219d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (unsigned long) dummy_dm_arg);
220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
221d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
222d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_VERSION */
223d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect pointer */
224d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg + 1);
225d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, %p) = -1 EBADF (%m)\n", dm_arg + 1);
226d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
227d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect data_size */
228d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, 0, 0);
229d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, &s);
230d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, %p) = -1 EBADF (%m)\n", &s);
231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
232d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect version */
233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->version[0] = 0xbadc0ded;
235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->version[1] = 0xbadc0dee;
236d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->version[2] = 0xbadc0def;
237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
23839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("ioctl(-1, DM_VERSION, {version=%u.%u.%u"
23939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " /* unsupported device mapper ABI version */}) = "
240d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n", 0xbadc0ded, 0xbadc0dee, 0xbadc0def);
241d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
242d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect data_size */
243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, 14, 64);
244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
24539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=14"
24639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       " /* data_size too small */}) = -1 EBADF (%m)\n");
247d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
248d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Unterminated name/uuid */
249d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
250d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strncpy(dm_arg->name, str129, sizeof(dm_arg->name));
251d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strncpy(dm_arg->uuid, str129, sizeof(dm_arg->uuid));
252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=%zu, "
254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"%.127s\", uuid=\"%.128s\", "
255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0}) = -1 EBADF (%m)\n",
256d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       min_sizeof_dm_ioctl, str129, str129);
257d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
258d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Normal call */
259d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
260d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
261d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, "
262d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, "
263d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0}) = "
264d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n", min_sizeof_dm_ioctl);
265d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero dev, name, uuid */
267d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
268d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = 0xfacefeed;
269d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->dev = 0;
270d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->name[0] = '\0';
271d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->uuid[0] = '\0';
272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, "
274d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, flags=0}) = "
275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n", 0xfacefeed);
276d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
277d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Flag */
278d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
279d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->flags = 0xffffffff;
280d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, dm_arg);
281d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, "
282d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, "
283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags="
284d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_READONLY_FLAG|DM_SUSPEND_FLAG|DM_EXISTS_FLAG|"
285d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_PERSISTENT_DEV_FLAG|DM_STATUS_TABLE_FLAG|"
286d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_ACTIVE_PRESENT_FLAG|DM_INACTIVE_PRESENT_FLAG|"
287d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_BUFFER_FULL_FLAG|DM_SKIP_BDGET_FLAG|DM_SKIP_LOCKFS_FLAG|"
288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_NOFLUSH_FLAG|DM_QUERY_INACTIVE_TABLE_FLAG|"
289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_UEVENT_GENERATED_FLAG|DM_UUID_FLAG|DM_SECURE_DATA_FLAG|"
290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "DM_DATA_OUT_FLAG|DM_DEFERRED_REMOVE|DM_INTERNAL_SUSPEND_FLAG|"
291d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "0xfff80080}) = -1 EBADF (%m)\n",
292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       min_sizeof_dm_ioctl);
293d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Normal call */
295d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s.ioc), 0);
296d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_VERSION, &s);
297d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_VERSION, "
298d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, "
299d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0}) = "
300d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "-1 EBADF (%m)\n", sizeof(s.ioc));
301d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
303d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_REMOVE_ALL */
304d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_LIST_DEVICES */
305d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_LIST_VERSIONS */
306d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < ARRAY_SIZE(dummy_check_cmds_nodev); i++) {
307d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		init_s(dm_arg, min_sizeof_dm_ioctl, 0);
308d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(-1, dummy_check_cmds_nodev[i].arg, dm_arg);
309d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(-1, %s, {version=4.1.2, data_size=%zu%s, "
310d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "flags=0}) = -1 EBADF (%m)\n",
311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       dummy_check_cmds_nodev[i].str,
312d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       min_sizeof_dm_ioctl,
313d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       dummy_check_cmds_nodev[i].has_params ?
314d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       ", data_start=0" : "");
315d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
317d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
318d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_CREATE */
319d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_REMOVE */
320d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_STATUS */
321d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_WAIT */
322d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TABLE_CLEAR */
323d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TABLE_DEPS */
324d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TABLE_STATUS */
325d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for (i = 0; i < ARRAY_SIZE(dummy_check_cmds); i++) {
326d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		init_s(dm_arg, min_sizeof_dm_ioctl, 0);
327d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		ioctl(-1, dummy_check_cmds[i].arg, dm_arg);
328d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printf("ioctl(-1, %s, {version=4.1.2, data_size=%zu%s, "
329d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\"%s, "
330d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       "flags=0}) = -1 EBADF (%m)\n",
331d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       dummy_check_cmds[i].str, min_sizeof_dm_ioctl,
332d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       dummy_check_cmds[i].has_params ? ", data_start=0" : "",
333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		       dummy_check_cmds[i].has_event_nr ? ", event_nr=0" : "");
334d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	}
335d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_SUSPEND */
338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s.ioc), 0);
339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.flags = DM_SUSPEND_FLAG;
340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.event_nr = 0xbadc0ded;
341d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_SUSPEND, &s);
342d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_SUSPEND, "
343d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, "
344d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
345d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=DM_SUSPEND_FLAG}) = -1 EBADF (%m)\n", sizeof(s.ioc));
346d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
347d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s.ioc), 0);
348d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.event_nr = 0xbadc0ded;
349d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_SUSPEND, &s);
350d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_SUSPEND, "
351d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, dev=makedev(18, 52), "
352d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "name=\"nnn\", uuid=\"uuu\", event_nr=3134983661, "
353d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0}) = -1 EBADF (%m)\n", sizeof(s.ioc));
354d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
355d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
356d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TABLE_LOAD */
357d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
358d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.target_count = 1;
359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.u.ts.target_spec.sector_start = 0x10;
360d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.u.ts.target_spec.length = 0x20;
361d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.u.ts.target_spec.next =
362d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		sizeof(s.u.ts.target_spec) + sizeof(s.u.ts.target_params);
363d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s.u.ts.target_spec.target_type, "tgt");
364d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s.u.ts.target_params, "tparams");
365d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TABLE_LOAD, &s);
366d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
367d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%u, "
368d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
369d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=1, flags=0, "
370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
371d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{sector_start=16, length=32, target_type=\"tgt\", "
372d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "string=\"tparams\"}"
373d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
375d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
376d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", s.ioc.data_size, s.ioc.data_start);
377d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
378d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* No targets */
379d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
380d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg);
381d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->target_count = 0;
382d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TABLE_LOAD, dm_arg);
383d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
384d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
385d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
386d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=0, flags=0}) = -1 EBADF (%m)\n",
387d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg), min_sizeof_dm_ioctl);
388d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
389d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid data_start */
390d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0xfffffff8);
391d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg);
392d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->target_count = 1234;
393d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TABLE_LOAD, dm_arg);
394d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
395d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%u, "
396d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
397d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=1234, flags=0, "
398d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
39939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "??? /* misplaced struct dm_target_spec */"
40039bac055674d23770b9a724221b728e443196ea7Elliott Hughes# else
401d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
402d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
403d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", sizeof(*dm_arg), 0xfffffff8);
404d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
405d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Inaccessible pointer */
406d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_open1->ioc, offsetof(struct dm_table_open_test, target1),
407d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target1));
408d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open1->ioc.data_size = sizeof(*dm_arg_open1);
409d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open1->ioc.target_count = 0xdeaddea1;
410d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TABLE_LOAD, dm_arg_open1);
411d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
412d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
413d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
414d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=3735936673, flags=0, "
415d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
416d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "%p"
417d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
418d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
419d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
420d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n", sizeof(*dm_arg_open1),
421d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target1)
422d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
423d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       , (char *) dm_arg_open1 +
424d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target1)
425d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
426d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       );
427d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
428d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Inaccessible string */
429d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_open2->ioc, offsetof(struct dm_table_open_test, param1),
430d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target1));
431d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open2->ioc.data_size = sizeof(*dm_arg_open2);
432d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open2->ioc.target_count = 2;
433d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_dm_target_spec(&dm_arg_open2->target1, 7);
434d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open2->target1.next =
435d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target3) -
436d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target1);
437d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open2);
438d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
439d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
440d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
441d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
442d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=2, flags=0, ",
443d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg_open2),
444d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target1));
445d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
446d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_dm_target_spec(&dm_arg_open2->target1, 7);
447d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("%p}, %p",
448d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (char *) dm_arg_open2 +
449d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, param1),
450d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (char *) dm_arg_open2 +
451d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target3));
452d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
453d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("...");
454d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
455d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = %s\n", errstr);
456d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
457d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect next */
458d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_open3->ioc, offsetof(struct dm_table_open_test, target5),
459d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target0));
460d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->ioc.target_count = 4;
461d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
462d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_dm_target_spec(&dm_arg_open3->target0, 9);
463d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->target0.next =
464d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target1) -
465d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target0);
466d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param0[0] = '\0';
467d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
468d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_dm_target_spec(&dm_arg_open3->target1, 15);
469d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->target1.next =
470d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target3) -
471d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		offsetof(struct dm_table_open_test, target1);
472d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param1[0] = '\377';
473d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param1[1] = '\0';
474d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
475d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_dm_target_spec(&dm_arg_open3->target3, 42);
476d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->target3.next = 0xdeadbeef;
477d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param3[0] = '\1';
478d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param3[1] = '\2';
479d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->param3[2] = '\0';
480d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
481d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open3);
482d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
483d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
484d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
485d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
486d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=4, flags=0, ",
487d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target5),
488d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target0));
489d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
490d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_dm_target_spec(&dm_arg_open3->target0, 9);
491d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("\"\"}, ");
492d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_dm_target_spec(&dm_arg_open3->target1, 15);
493d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("\"\\377\"}, ");
494d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	print_dm_target_spec(&dm_arg_open3->target1, 42);
49539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	printf("\"\\1\\2\"}, ??? /* misplaced struct dm_target_spec */");
496d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
497d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("...");
498d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
499d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = %s\n", errstr);
500d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
501d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	#define FILL_DM_TARGET(id, id_next) \
502d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		do { \
503d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			init_dm_target_spec(&dm_arg_open3->target##id, id); \
504d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			dm_arg_open3->target##id.next = \
505d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				offsetof(struct dm_table_open_test, \
506d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					 target##id_next) - \
507d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				offsetof(struct dm_table_open_test, \
508d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					 target##id); \
509d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			strncpy(dm_arg_open3->param##id, str129 + id * 2, id); \
510d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			dm_arg_open3->param##id[id] = '\0'; \
511d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} while (0)
512d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	#define PRINT_DM_TARGET(id) \
513d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		do { \
514d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			print_dm_target_spec(&dm_arg_open3->target##id, id); \
515d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printf("\"%.*s\"}, ", id, str129 + id * 2); \
516d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} while (0)
517d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
518d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* max_strlen limit */
519d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_open3->ioc, offsetof(struct dm_table_open_test, target9),
520d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target0));
521d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->ioc.data_size = sizeof(*dm_arg_open3);
522d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_open3->ioc.target_count = 0xbadc0ded;
523d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(0, 1);
524d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(1, 2);
525d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(2, 3);
526d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(3, 4);
527d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(4, 5);
528d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(5, 6);
529d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(6, 7);
530d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(7, 8);
531d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	FILL_DM_TARGET(8, 9);
532d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open3);
533d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
534d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
535d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
536d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
537d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=3134983661, flags=0, ",
538d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg_open3),
539d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_table_open_test, target0));
540d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
541d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(0);
542d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(1);
543d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(2);
544d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(3);
545d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(4);
546d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(5);
547d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(6);
548d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(7);
549d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	PRINT_DM_TARGET(8);
550d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
551d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("...}) = %s\n", errstr);
552d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
553d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
554d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TARGET_MSG */
555d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
556d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.u.tm.target_msg.sector = 0x1234;
557d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s.u.string + offsetof(struct dm_target_msg, message),
558d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "long target msg");
559d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TARGET_MSG, &s);
560d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
561d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%u, "
562d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
563d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
564d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{sector=4660, message=\"long targ\"...}"
565d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
566d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
567d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
568d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
569d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size, s.ioc.data_start);
570d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
571d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid data_start */
572d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
573d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg);
574d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TARGET_MSG, dm_arg);
575d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
576d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
577d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
578d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
57939bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "??? /* misplaced struct dm_target_msg */"
580d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
581d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
582d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
583d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
584d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg), min_sizeof_dm_ioctl);
585d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
586d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Invalid data_start */
587d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0xffffffff);
588d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg);
589d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TARGET_MSG, dm_arg);
590d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
591d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%u, "
592d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
593d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
59439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "??? /* misplaced struct dm_target_msg */"
595d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
596d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
597d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
598d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
599d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg), 0xffffffff);
600d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
601d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Inaccessible pointer */
602d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, 0);
603d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg) + sizeof(struct dm_target_msg);
604d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_start = sizeof(*dm_arg);
605d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TARGET_MSG, dm_arg);
606d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
607d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
608d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
609d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
610d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "%p"
611d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
612d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
613d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
614d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
615d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg) + sizeof(struct dm_target_msg),
616d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg)
617d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
618d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       , (char *) dm_arg + sizeof(*dm_arg)
619d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
620d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       );
621d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
622d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Inaccessible string */
623d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_msg->ioc, sizeof(*dm_arg_msg),
624d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_target_msg_test, msg));
625d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_msg->ioc.data_size = sizeof(*dm_arg_msg) + 1;
626d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_msg->msg.sector = (__u64) 0xdeadbeeffacef157ULL;
627d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = ioctl(-1, DM_TARGET_MSG, dm_arg_msg);
628d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
629d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
630d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
631d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, ",
632d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg_msg) + 1,
633d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_target_msg_test, msg));
634d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
635d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{sector=%" PRI__u64 ", message=%p}",
636d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (__u64) 0xdeadbeeffacef157ULL,
637d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (char *) dm_arg_msg +
638d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_target_msg_test, msg.message));
639d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
640d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("...");
641d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
642d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = %s\n", errstr);
643d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
644d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Zero-sied string */
645d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&dm_arg_msg->ioc, sizeof(*dm_arg_msg),
646d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_target_msg_test, msg));
647d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg_msg->msg.sector = (__u64) 0xdeadbeeffacef157ULL;
648d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	rc = ioctl(-1, DM_TARGET_MSG, dm_arg_msg);
649d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	errstr = sprintrc(rc);
650d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TARGET_MSG, "
651d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
652d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, ",
653d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*dm_arg_msg), offsetof(struct dm_target_msg_test, msg));
654d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
655d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("{sector=%" PRI__u64 ", message=\"\"}",
656d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       (__u64) 0xdeadbeeffacef157ULL);
657d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
658d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("...");
659d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
660d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("}) = %s\n", errstr);
661d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
662d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
663d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_SET_GEOMETRY */
664d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
665d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s.u.string, "10 20 30 40");
666d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_SET_GEOMETRY, &s);
667d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_SET_GEOMETRY, "
668d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%u, "
669d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
670d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
671d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "string=\"10 20 30 \"..."
672d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
673d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
674d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
675d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
676d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size, s.ioc.data_start);
677d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
678d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
679d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_DEV_RENAME */
680d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Inaccessible data */
681d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
682d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dm_arg->data_size = sizeof(*dm_arg);
683d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	memcpy(unaligned_dm_arg, dm_arg, offsetof(struct dm_ioctl, data));
684d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_RENAME, unaligned_dm_arg);
685d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_RENAME, "
686d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%zu, data_start=%zu, "
687d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
688d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0, "
689d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
690d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "string=%p"
691d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
692d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
693d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
694d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
695d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       sizeof(*unaligned_dm_arg), min_sizeof_dm_ioctl
696d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
697d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       , (char *) unaligned_dm_arg + min_sizeof_dm_ioctl
698d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
699d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       );
700d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
701d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Incorrect data_start data */
702d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
703d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.data_start = 0xdeadbeef;
704d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_RENAME, &s);
705d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_RENAME, "
706d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=3735928559, "
707d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
708d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0, "
709d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
71039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "??? /* misplaced string */"
711d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
712d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
713d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
714d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
715d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size);
716d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
717d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Strange but still valid data_start */
718d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
719d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Curiously, this is a valid structure */
720d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.data_start = offsetof(struct dm_ioctl, name) + 1;
721d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_RENAME, &s);
722d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_RENAME, "
723d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%zu, "
724d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
725d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0, "
726d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
727d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "string=\"nn\""
728d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
729d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
730d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
731d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
732d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size,
733d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       offsetof(struct dm_ioctl, name) + 1);
734d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
735d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* Correct data */
736d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
737d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	strcpy(s.u.string, "new long name");
738d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_DEV_RENAME, &s);
739d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_DEV_RENAME, "
740d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%u, "
741d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
742d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "flags=0, "
743d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
744d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "string=\"new long \"..."
745d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# else /* !VERBOSE */
746d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "..."
747d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
748d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "}) = -1 EBADF (%m)\n",
749d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size, s.ioc.data_start);
750d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
751d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
752d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/* DM_TABLE_LOAD */
753d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
754d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	s.ioc.target_count = -1U;
755d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	ioctl(-1, DM_TABLE_LOAD, &s);
756d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	printf("ioctl(-1, DM_TABLE_LOAD, "
757d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "{version=4.1.2, data_size=%u, data_start=%u, "
758d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
759d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       "target_count=4294967295, flags=0, "
760d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# if VERBOSE
76139bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "{sector_start=0, length=0, target_type=\"\", string=\"\"}"
76239bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       ", ??? /* misplaced struct dm_target_spec */"
76339bac055674d23770b9a724221b728e443196ea7Elliott Hughes# else
76439bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "..."
765d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# endif /* VERBOSE */
76639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	       "}) = -1 EBADF (%m)\n",
767d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	       s.ioc.data_size, s.ioc.data_start);
768d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
769d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	puts("+++ exited with 0 +++");
770d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	return 0;
771d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
772d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
773d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#else /* !HAVE_LINUX_DM_IOCTL_H */
774d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
775d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesSKIP_MAIN_UNDEFINED("HAVE_LINUX_DM_IOCTL_H")
776d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
777d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif /* HAVE_LINUX_DM_IOCTL_H */
778