1 /*
2 * This file is part of ioctl_block strace test.
3 *
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2016-2021 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "pidns.h"
13 #include <errno.h>
14 #include <unistd.h>
15 #include <inttypes.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include <sys/ioctl.h>
19 #include <linux/fs.h>
20 #include <linux/blkpg.h>
21 #include <linux/blkzoned.h>
22 #include <linux/blktrace_api.h>
23 #include "xlat.h"
24
25 static const unsigned int magic = 0xdeadbeef;
26 static const unsigned long lmagic = (unsigned long) 0xdeadbeefbadc0dedULL;
27
28 static struct xlat_data block_argless[] = {
29 XLAT(BLKRRPART),
30 XLAT(BLKFLSBUF),
31 XLAT(BLKTRACESTART),
32 XLAT(BLKTRACESTOP),
33 XLAT(BLKTRACETEARDOWN),
34 };
35
36 #define TEST_NULL_ARG(cmd) \
37 do { \
38 ioctl(-1, cmd, 0); \
39 pidns_print_leader(); \
40 printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n", #cmd); \
41 } while (0)
42
43 int
44 main(void)
45 {
46 PIDNS_TEST_INIT;
47
48 TEST_NULL_ARG(BLKBSZGET);
49 TEST_NULL_ARG(BLKBSZSET);
50 TEST_NULL_ARG(BLKFRAGET);
51 TEST_NULL_ARG(BLKGETSIZE);
52 TEST_NULL_ARG(BLKGETSIZE64);
53 TEST_NULL_ARG(BLKPG);
54 TEST_NULL_ARG(BLKRAGET);
55 TEST_NULL_ARG(BLKROGET);
56 TEST_NULL_ARG(BLKROSET);
57 TEST_NULL_ARG(BLKSECTGET);
58 TEST_NULL_ARG(BLKSECTGET);
59 TEST_NULL_ARG(BLKSSZGET);
60 TEST_NULL_ARG(BLKALIGNOFF);
61 TEST_NULL_ARG(BLKDISCARD);
62 TEST_NULL_ARG(BLKDISCARDZEROES);
63 TEST_NULL_ARG(BLKIOMIN);
64 TEST_NULL_ARG(BLKIOOPT);
65 TEST_NULL_ARG(BLKPBSZGET);
66 TEST_NULL_ARG(BLKROTATIONAL);
67 TEST_NULL_ARG(BLKSECDISCARD);
68 TEST_NULL_ARG(BLKZEROOUT);
69 TEST_NULL_ARG(BLKGETDISKSEQ);
70 TEST_NULL_ARG(BLKTRACESETUP);
71
72 ioctl(-1, BLKRASET, lmagic);
73 pidns_print_leader();
74 printf("ioctl(-1, BLKRASET, %lu) = -1 EBADF (%m)\n", lmagic);
75
76 ioctl(-1, BLKFRASET, lmagic);
77 pidns_print_leader();
78 printf("ioctl(-1, BLKFRASET, %lu) = -1 EBADF (%m)\n", lmagic);
79
80 TAIL_ALLOC_OBJECT_CONST_PTR(int, val_int);
81 *val_int = magic;
82
83 ioctl(-1, BLKROSET, val_int);
84 pidns_print_leader();
85 printf("ioctl(-1, BLKROSET, [%d]) = -1 EBADF (%m)\n", *val_int);
86
87 ioctl(-1, BLKBSZSET, val_int);
88 pidns_print_leader();
89 printf("ioctl(-1, BLKBSZSET, [%d]) = -1 EBADF (%m)\n", *val_int);
90
91 uint64_t *pair_int64 = tail_alloc(sizeof(*pair_int64) * 2);
92 pair_int64[0] = 0xdeadbeefbadc0dedULL;
93 pair_int64[1] = 0xfacefeedcafef00dULL;
94
95 ioctl(-1, BLKDISCARD, pair_int64);
96 pidns_print_leader();
97 printf("ioctl(-1, BLKDISCARD, [%" PRIu64 ", %" PRIu64 "])"
98 " = -1 EBADF (%m)\n", pair_int64[0], pair_int64[1]);
99
100 ioctl(-1, BLKSECDISCARD, pair_int64);
101 pidns_print_leader();
102 printf("ioctl(-1, BLKSECDISCARD, [%" PRIu64 ", %" PRIu64 "])"
103 " = -1 EBADF (%m)\n", pair_int64[0], pair_int64[1]);
104
105 ioctl(-1, BLKZEROOUT, pair_int64);
106 pidns_print_leader();
107 printf("ioctl(-1, BLKZEROOUT, [%" PRIu64 ", %" PRIu64 "])"
108 " = -1 EBADF (%m)\n", pair_int64[0], pair_int64[1]);
109
110 TAIL_ALLOC_OBJECT_CONST_PTR(struct blkpg_ioctl_arg, blkpg);
111 blkpg->op = 3;
112 blkpg->flags = 0xdeadbeef;
113 blkpg->datalen = 0xbadc0ded;
114 blkpg->data = (void *) (unsigned long) 0xcafef00dfffffeedULL;
115
116 ioctl(-1, BLKPG, blkpg);
117 pidns_print_leader();
118 printf("ioctl(-1, BLKPG, {op=%s, flags=%d, datalen=%d"
119 ", data=%#lx}) = -1 EBADF (%m)\n",
120 "BLKPG_RESIZE_PARTITION", blkpg->flags, blkpg->datalen,
121 (unsigned long) blkpg->data);
122
123 TAIL_ALLOC_OBJECT_CONST_PTR(struct blkpg_partition, bp);
124 bp->start = 0xfac1fed2dad3bef4ULL;
125 bp->length = 0xfac5fed6dad7bef8ULL;
126 bp->pno = magic;
127 memset(bp->devname, 'A', sizeof(bp->devname));
128 memset(bp->volname, 'B', sizeof(bp->volname));
129 blkpg->op = 1;
130 blkpg->data = bp;
131
132 ioctl(-1, BLKPG, blkpg);
133 pidns_print_leader();
134 printf("ioctl(-1, BLKPG, {op=%s, flags=%d, datalen=%d"
135 ", data={start=%lld, length=%lld, pno=%d"
136 ", devname=\"%.*s\"..., volname=\"%.*s\"...}})"
137 " = -1 EBADF (%m)\n",
138 "BLKPG_ADD_PARTITION",
139 blkpg->flags, blkpg->datalen,
140 bp->start, bp->length, bp->pno,
141 (int) sizeof(bp->devname) - 1, bp->devname,
142 (int) sizeof(bp->volname) - 1, bp->volname);
143
144 TAIL_ALLOC_OBJECT_CONST_PTR(struct blk_user_trace_setup, buts);
145 fill_memory(buts, sizeof(*buts));
146 buts->pid = getpid();
147
148 ioctl(-1, BLKTRACESETUP, buts);
149 pidns_print_leader();
150 printf("ioctl(-1, BLKTRACESETUP, {act_mask=%hu, buf_size=%u, buf_nr=%u"
151 ", start_lba=%" PRI__u64 ", end_lba=%" PRI__u64 ", pid=%d%s})"
152 " = -1 EBADF (%m)\n",
153 buts->act_mask, buts->buf_size, buts->buf_nr,
154 buts->start_lba, buts->end_lba, buts->pid,
155 pidns_pid2str(PT_TGID));
156
157 for (unsigned int i = 0; i < ARRAY_SIZE(block_argless); ++i) {
158 ioctl(-1, (unsigned long) block_argless[i].val, lmagic);
159 pidns_print_leader();
160 printf("ioctl(-1, %s) = -1 EBADF (%m)\n", block_argless[i].str);
161 }
162
163 ioctl(-1, _IOC(_IOC_READ, 0x12, 0xfe, 0xff), lmagic);
164 pidns_print_leader();
165 printf("ioctl(-1, %s, %#lx) = -1 EBADF (%m)\n",
166 "_IOC(_IOC_READ, 0x12, 0xfe, 0xff)", lmagic);
167
168 pidns_print_leader();
169 puts("+++ exited with 0 +++");
170 return 0;
171 }