(root)/
strace-6.5/
tests-mx32/
ioctl_block.c
       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  }