From: Dmitry V. Levin Date: Thu, 26 May 2016 00:07:17 +0000 (+0000) Subject: Move parser of HDIO_* ioctls to a separate file X-Git-Tag: v4.12~50 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3f00403c30e2c268d4a7b8d8b37e26f32f41d78;p=strace Move parser of HDIO_* ioctls to a separate file * hdio.c: New file. * Makefile.am (strace_SOURCES): Add it. * block.c: Do not include . (block_ioctl): Move parser of HDIO_GETGEO to hdio.c. * defs.h (hdio_ioctl): New prototype. * ioctl.c (ioctl_decode): Call hdio_ioctl for ioctl type 0x03. --- diff --git a/Makefile.am b/Makefile.am index c165b81c..5783ab1f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -120,6 +120,7 @@ strace_SOURCES = \ getcpu.c \ getcwd.c \ getrandom.c \ + hdio.c \ hostname.c \ inotify.c \ io.c \ diff --git a/block.c b/block.c index af7f6d4f..70c2cc98 100644 --- a/block.c +++ b/block.c @@ -28,7 +28,6 @@ #include "defs.h" #include #include -#include /* ioctls <= 114 are present in Linux 2.4. The following ones have been * added since then and headers containing them may not be available on @@ -199,23 +198,6 @@ block_ioctl(struct tcb *tcp, const unsigned int code, const long arg) break; /* More complex types */ - case HDIO_GETGEO: - if (entering(tcp)) - return 0; - else { - struct hd_geometry geo; - - tprints(", "); - if (!umove_or_printaddr(tcp, arg, &geo)) - tprintf("{heads=%u, sectors=%u, " - "cylinders=%u, start=%lu}", - (unsigned)geo.heads, - (unsigned)geo.sectors, - (unsigned)geo.cylinders, - geo.start); - } - break; - case BLKPG: { struct blkpg_ioctl_arg blkpg; diff --git a/defs.h b/defs.h index d72f5c25..4cc31bd3 100644 --- a/defs.h +++ b/defs.h @@ -662,6 +662,7 @@ extern void print_struct_statfs64(struct tcb *tcp, long, unsigned long); extern int block_ioctl(struct tcb *, const unsigned int, long); extern int evdev_ioctl(struct tcb *, const unsigned int, long); extern int file_ioctl(struct tcb *, const unsigned int, long); +extern int hdio_ioctl(struct tcb *, const unsigned int, long); extern int loop_ioctl(struct tcb *, const unsigned int, long); extern int mtd_ioctl(struct tcb *, const unsigned int, long); extern int ptp_ioctl(struct tcb *, const unsigned int, long); diff --git a/hdio.c b/hdio.c new file mode 100644 index 00000000..1553825a --- /dev/null +++ b/hdio.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2009, 2010 Jeff Mahoney + * Copyright (c) 2011-2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" +#include + +int +hdio_ioctl(struct tcb *tcp, const unsigned int code, const long arg) +{ + switch (code) { + case HDIO_GETGEO: + if (entering(tcp)) + return 0; + else { + struct hd_geometry geo; + + tprints(", "); + if (!umove_or_printaddr(tcp, arg, &geo)) + tprintf("{heads=%u, sectors=%u, " + "cylinders=%u, start=%lu}", + (unsigned)geo.heads, + (unsigned)geo.sectors, + (unsigned)geo.cylinders, + geo.start); + } + break; + default: + return RVAL_DECODED; + } + + return RVAL_DECODED | 1; +} diff --git a/ioctl.c b/ioctl.c index 1ff7ec56..c5183332 100644 --- a/ioctl.c +++ b/ioctl.c @@ -250,6 +250,7 @@ ioctl_decode(struct tcb *tcp) case 'p': return rtc_ioctl(tcp, code, arg); case 0x03: + return hdio_ioctl(tcp, code, arg); case 0x12: case 'X': return block_ioctl(tcp, code, arg);