(root)/
strace-6.5/
tests/
ioctl_scsi.c
       1  /*
       2   * Check decoding of SCSI ioctl commands.
       3   *
       4   * Copyright (c) 2017 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2017-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  
      13  #ifdef HAVE_SCSI_SG_H
      14  
      15  # include <stdio.h>
      16  # include <sys/ioctl.h>
      17  # include <scsi/sg.h>
      18  # define XLAT_MACROS_ONLY
      19  #  include "xlat/scsi_sg_commands.h"
      20  # undef XLAT_MACROS_ONLY
      21  
      22  # define TEST_NO_ARG(cmd)							\
      23  	do {									\
      24  		ioctl(-1, cmd, 0xdeadbeef);					\
      25  		printf("ioctl(-1, %s) = -1 EBADF (%m)\n", #cmd);		\
      26  	} while (0)
      27  
      28  # define TEST_NULL_ARG(cmd)							\
      29  	do {									\
      30  		ioctl(-1, cmd, 0);						\
      31  		printf("ioctl(-1, %s, NULL) = -1 EBADF (%m)\n", #cmd);		\
      32  	} while (0)
      33  
      34  # define TEST_TAKES_INT_BY_VAL(cmd, val)					\
      35  	do {									\
      36  		ioctl(-1, cmd, val);						\
      37  		printf("ioctl(-1, %s, %#x) = -1 EBADF (%m)\n", #cmd, val);	\
      38  	} while (0)
      39  
      40  # define TEST_TAKES_INT_BY_PTR(cmd, pint)					\
      41  	do {									\
      42  		ioctl(-1, cmd, pint);						\
      43  		printf("ioctl(-1, %s, [%d]) = -1 EBADF (%m)\n", #cmd, *(pint));	\
      44  	} while (0)
      45  
      46  # define TEST_RETURNS_INT_BY_PTR(cmd, pint)					\
      47  	do {									\
      48  		ioctl(-1, cmd, pint);						\
      49  		printf("ioctl(-1, %s, %p) = -1 EBADF (%m)\n", #cmd, pint);	\
      50  	} while (0)
      51  
      52  int
      53  main(void)
      54  {
      55  	TAIL_ALLOC_OBJECT_CONST_PTR(int, pint);
      56  	*pint = (int) 0xfacefeed;
      57  
      58  	TEST_NO_ARG(SG_GET_TIMEOUT);
      59  
      60  	TEST_NULL_ARG(SG_SET_TIMEOUT);
      61  	TEST_NULL_ARG(SG_EMULATED_HOST);
      62  	TEST_NULL_ARG(SG_GET_TRANSFORM);
      63  	TEST_NULL_ARG(SG_GET_COMMAND_Q);
      64  	TEST_NULL_ARG(SG_SET_COMMAND_Q);
      65  	TEST_NULL_ARG(SG_GET_RESERVED_SIZE);
      66  	TEST_NULL_ARG(SG_SET_RESERVED_SIZE);
      67  	TEST_NULL_ARG(SG_GET_SCSI_ID);
      68  	TEST_NULL_ARG(SG_SET_FORCE_LOW_DMA);
      69  	TEST_NULL_ARG(SG_GET_LOW_DMA);
      70  	TEST_NULL_ARG(SG_SET_FORCE_PACK_ID);
      71  	TEST_NULL_ARG(SG_GET_PACK_ID);
      72  	TEST_NULL_ARG(SG_GET_NUM_WAITING);
      73  	TEST_NULL_ARG(SG_SET_DEBUG);
      74  	TEST_NULL_ARG(SG_GET_SG_TABLESIZE);
      75  	TEST_NULL_ARG(SG_GET_VERSION_NUM);
      76  	TEST_NULL_ARG(SG_NEXT_CMD_LEN);
      77  	TEST_NULL_ARG(SG_SCSI_RESET);
      78  	TEST_NULL_ARG(SG_IO);
      79  	TEST_NULL_ARG(SG_GET_REQUEST_TABLE);
      80  	TEST_NULL_ARG(SG_SET_KEEP_ORPHAN);
      81  	TEST_NULL_ARG(SG_GET_KEEP_ORPHAN);
      82  	TEST_NULL_ARG(SG_GET_ACCESS_COUNT);
      83  
      84  	TEST_TAKES_INT_BY_VAL(SG_SET_TRANSFORM, 0);
      85  	TEST_TAKES_INT_BY_VAL(SG_SET_TRANSFORM, *pint);
      86  
      87  	TEST_TAKES_INT_BY_PTR(SG_NEXT_CMD_LEN, pint);
      88  	TEST_TAKES_INT_BY_PTR(SG_SET_COMMAND_Q, pint);
      89  	TEST_TAKES_INT_BY_PTR(SG_SET_DEBUG, pint);
      90  	TEST_TAKES_INT_BY_PTR(SG_SET_FORCE_LOW_DMA, pint);
      91  	TEST_TAKES_INT_BY_PTR(SG_SET_FORCE_PACK_ID, pint);
      92  	TEST_TAKES_INT_BY_PTR(SG_SET_KEEP_ORPHAN, pint);
      93  	TEST_TAKES_INT_BY_PTR(SG_SET_RESERVED_SIZE, pint);
      94  	TEST_TAKES_INT_BY_PTR(SG_SET_TIMEOUT, pint);
      95  
      96  	TEST_RETURNS_INT_BY_PTR(SG_EMULATED_HOST, pint);
      97  	TEST_RETURNS_INT_BY_PTR(SG_GET_ACCESS_COUNT, pint);
      98  	TEST_RETURNS_INT_BY_PTR(SG_GET_COMMAND_Q, pint);
      99  	TEST_RETURNS_INT_BY_PTR(SG_GET_KEEP_ORPHAN, pint);
     100  	TEST_RETURNS_INT_BY_PTR(SG_GET_LOW_DMA, pint);
     101  	TEST_RETURNS_INT_BY_PTR(SG_GET_NUM_WAITING, pint);
     102  	TEST_RETURNS_INT_BY_PTR(SG_GET_PACK_ID, pint);
     103  	TEST_RETURNS_INT_BY_PTR(SG_GET_RESERVED_SIZE, pint);
     104  	TEST_RETURNS_INT_BY_PTR(SG_GET_SG_TABLESIZE, pint);
     105  	TEST_RETURNS_INT_BY_PTR(SG_GET_TRANSFORM, pint);
     106  	TEST_RETURNS_INT_BY_PTR(SG_GET_VERSION_NUM, pint);
     107  
     108  	ioctl(-1, SG_SCSI_RESET, pint);
     109  	printf("ioctl(-1, %s, [%#x /* %s_??? */]) = -1 EBADF (%m)\n",
     110  	       "SG_SCSI_RESET", *pint, "SG_SCSI_RESET");
     111  
     112  	*pint = 0x100;
     113  	ioctl(-1, SG_SCSI_RESET, pint);
     114  	printf("ioctl(-1, %s, [SG_SCSI_RESET_NO_ESCALATE|SG_SCSI_RESET_NOTHING])"
     115  	       " = -1 EBADF (%m)\n", "SG_SCSI_RESET");
     116  
     117  	*pint = 1;
     118  	ioctl(-1, SG_SCSI_RESET, pint);
     119  	printf("ioctl(-1, %s, [SG_SCSI_RESET_DEVICE]) = -1 EBADF (%m)\n",
     120  	       "SG_SCSI_RESET");
     121  
     122  	ioctl(-1, 0x22ff, 0);
     123  	printf("ioctl(-1, _IOC(%s, 0x22, 0xff, 0), 0) = -1 EBADF (%m)\n",
     124  	       _IOC_NONE ? "0" : "_IOC_NONE");
     125  
     126  	static const unsigned long magic =
     127  		(unsigned long) 0xdeadbeeffacefeedULL;
     128  	ioctl(-1, 0x22ff, magic);
     129  	printf("ioctl(-1, _IOC(%s, 0x22, 0xff, 0), %#lx) = -1 EBADF (%m)\n",
     130  	       _IOC_NONE ? "0" : "_IOC_NONE", magic);
     131  
     132  	puts("+++ exited with 0 +++");
     133  	return 0;
     134  }
     135  
     136  #else
     137  
     138  SKIP_MAIN_UNDEFINED("HAVE_SCSI_SG_H")
     139  
     140  #endif