1 /*- 2 * Copyright (c) 2005-2006,2016 John H. Baldwin <jhb@FreeBSD.org> 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26 #include <sys/cdefs.h> 27 __FBSDID("$FreeBSD$"); 28 29 #include <sys/ioccom.h> 30 #include <ctype.h> 31 #include <errno.h> 32 #include <limits.h> 33 #include <stdio.h> 34 #include <stdlib.h> 35 #include <sysdecode.h> 36 37 static void 38 usage(char **av) 39 { 40 fprintf(stderr, "%s: <ioctl> [ ... ]\n", av[0]); 41 exit(1); 42 } 43 44 int 45 main(int ac, char **av) 46 { 47 unsigned long cmd; 48 const char *name; 49 char *cp; 50 int group, i; 51 52 if (ac < 2) 53 usage(av); 54 printf(" command : dir group num len name\n"); 55 for (i = 1; i < ac; i++) { 56 errno = 0; 57 cmd = strtoul(av[i], &cp, 0); 58 if (*cp != '\0' || errno != 0) { 59 fprintf(stderr, "Invalid integer: %s\n", av[i]); 60 usage(av); 61 } 62 printf("0x%08lx: ", cmd); 63 switch (cmd & IOC_DIRMASK) { 64 case IOC_VOID: 65 printf("VOID "); 66 break; 67 case IOC_OUT: 68 printf("OUT "); 69 break; 70 case IOC_IN: 71 printf("IN "); 72 break; 73 case IOC_INOUT: 74 printf("INOUT"); 75 break; 76 default: 77 printf("%01lx ???", (cmd & IOC_DIRMASK) >> 29); 78 break; 79 } 80 printf(" "); 81 group = IOCGROUP(cmd); 82 if (isprint(group)) 83 printf(" '%c' ", group); 84 else 85 printf(" 0x%02x", group); 86 printf(" %3lu %4lu", cmd & 0xff, IOCPARM_LEN(cmd)); 87 name = sysdecode_ioctlname(cmd); 88 if (name != NULL) 89 printf(" %s", name); 90 printf("\n"); 91 } 92 return (0); 93 } 94