diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2015-01-19 18:44:21 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2015-01-20 00:28:10 +0000 |
commit | c7afb4881f14e44968f3a78ae5988f04ecc66b68 (patch) | |
tree | 7c55db50831c980b623a939a7e119096e035d89b | |
parent | 74932976ba16aee08b49e5ca0669dc4c6305405f (diff) | |
download | strace-c7afb4881f14e44968f3a78ae5988f04ecc66b68.tar.gz |
ioctl: assume that all ioctl commands have unsigned int type
In linux, ioctl command number has a 32-bit unsigned integer type:
fs/ioctl.c:SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
If the kernel completely ignores other bits on 64-bit architectures,
why should strace care?
Let's follow the kernel and treat it as unsigned int.
* defs.h (struct_ioctlent): Change "code" type to "unsigned int".
(ioctl_decode, ioctl_lookup, block_ioctl, loop_ioctl, mtd_ioctl,
ubi_ioctl, ptp_ioctl, scsi_ioctl, sock_ioctl, term_ioctl, rtc_ioctl,
v4l2_ioctl): Likewise.
* ioctl.c (ioctl_decode, ioctl_lookup, compare, ioctl_next_match):
Likewise.
* block.c (block_ioctl): Likewise.
* loop.c (loop_ioctl): Likewise.
* mtd.c (mtd_ioctl, ubi_ioctl): Likewise.
* ptp.c (ptp_ioctl): Likewise.
* scsi.c (scsi_ioctl): Likewise.
* sock.c (sock_ioctl): Likewise.
* term.c (term_ioctl): Likewise.
* time.c (rtc_ioctl): Likewise.
* v4l2.c (v4l2_ioctl): Likewise.
* ioctlsort.c (struct ioctlent, compare, main): Likewise.
-rw-r--r-- | block.c | 2 | ||||
-rw-r--r-- | defs.h | 27 | ||||
-rw-r--r-- | ioctl.c | 16 | ||||
-rw-r--r-- | ioctlsort.c | 8 | ||||
-rw-r--r-- | loop.c | 3 | ||||
-rw-r--r-- | mtd.c | 6 | ||||
-rw-r--r-- | ptp.c | 3 | ||||
-rw-r--r-- | scsi.c | 2 | ||||
-rw-r--r-- | sock.c | 2 | ||||
-rw-r--r-- | term.c | 3 | ||||
-rw-r--r-- | time.c | 2 | ||||
-rw-r--r-- | v4l2.c | 2 |
12 files changed, 39 insertions, 37 deletions
@@ -103,7 +103,7 @@ print_blkpg_req(struct tcb *tcp, struct blkpg_ioctl_arg *blkpg) } int -block_ioctl(struct tcb *tcp, long code, long arg) +block_ioctl(struct tcb *tcp, const unsigned int code, long arg) { switch (code) { /* take arg as a value, not as a pointer */ @@ -396,7 +396,7 @@ typedef struct sysent { typedef struct ioctlent { const char *symbol; - unsigned long code; + unsigned int code; } struct_ioctlent; /* Trace Control Block */ @@ -731,20 +731,19 @@ extern void tprint_open_modes(int); extern const char *sprint_open_modes(int); extern void print_loff_t(struct tcb *, long); -extern const struct_ioctlent *ioctl_lookup(unsigned long); +extern const struct_ioctlent *ioctl_lookup(const unsigned int); extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *); -extern int ioctl_decode(struct tcb *, long, long); -extern int term_ioctl(struct tcb *, long, long); -extern int sock_ioctl(struct tcb *, long, long); -extern int proc_ioctl(struct tcb *, int, int); -extern int rtc_ioctl(struct tcb *, long, long); -extern int scsi_ioctl(struct tcb *, long, long); -extern int block_ioctl(struct tcb *, long, long); -extern int v4l2_ioctl(struct tcb *, unsigned long, long); -extern int mtd_ioctl(struct tcb *, long, long); -extern int ubi_ioctl(struct tcb *, long, long); -extern int loop_ioctl(struct tcb *, long, long); -extern int ptp_ioctl(struct tcb *, long, long); +extern int ioctl_decode(struct tcb *, const unsigned int, long); +extern int block_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); +extern int rtc_ioctl(struct tcb *, const unsigned int, long); +extern int scsi_ioctl(struct tcb *, const unsigned int, long); +extern int sock_ioctl(struct tcb *, const unsigned int, long); +extern int term_ioctl(struct tcb *, const unsigned int, long); +extern int ubi_ioctl(struct tcb *, const unsigned int, long); +extern int v4l2_ioctl(struct tcb *, const unsigned int, long); extern int tv_nz(const struct timeval *); extern int tv_cmp(const struct timeval *, const struct timeval *); @@ -34,18 +34,18 @@ static int compare(const void *a, const void *b) { - unsigned long code1 = (unsigned long) a; - unsigned long code2 = ((struct_ioctlent *) b)->code; + const unsigned int code1 = (const unsigned long) a; + const unsigned int code2 = ((struct_ioctlent *) b)->code; return (code1 > code2) ? 1 : (code1 < code2) ? -1 : 0; } const struct_ioctlent * -ioctl_lookup(unsigned long code) +ioctl_lookup(unsigned int code) { struct_ioctlent *iop; code &= (_IOC_NRMASK<<_IOC_NRSHIFT) | (_IOC_TYPEMASK<<_IOC_TYPESHIFT); - iop = bsearch((void*)code, ioctlent, + iop = bsearch((const void *) (const unsigned long) code, ioctlent, nioctlents, sizeof(ioctlent[0]), compare); while (iop > ioctlent) { iop--; @@ -60,9 +60,7 @@ ioctl_lookup(unsigned long code) const struct_ioctlent * ioctl_next_match(const struct_ioctlent *iop) { - unsigned long code; - - code = iop->code; + const unsigned int code = iop->code; iop++; if (iop < ioctlent + nioctlents && iop->code == code) return iop; @@ -70,9 +68,9 @@ ioctl_next_match(const struct_ioctlent *iop) } int -ioctl_decode(struct tcb *tcp, long code, long arg) +ioctl_decode(struct tcb *tcp, unsigned int code, long arg) { - switch ((code >> 8) & 0xff) { + switch (_IOC_TYPE(code)) { #if defined(ALPHA) || defined(POWERPC) case 'f': case 't': case 'T': #else /* !ALPHA */ diff --git a/ioctlsort.c b/ioctlsort.c index 393b53495..f0f5744ed 100644 --- a/ioctlsort.c +++ b/ioctlsort.c @@ -13,7 +13,7 @@ struct ioctlent { const char* header; const char* name; - unsigned long code; + unsigned int code; }; struct ioctlent ioctls[] = { @@ -23,8 +23,8 @@ struct ioctlent ioctls[] = { int nioctls = sizeof(ioctls) / sizeof(ioctls[0]); int compare(const void* a, const void* b) { - unsigned long code1 = ((struct ioctlent *) a)->code; - unsigned long code2 = ((struct ioctlent *) b)->code; + unsigned int code1 = ((struct ioctlent *) a)->code; + unsigned int code2 = ((struct ioctlent *) b)->code; const char *name1 = ((struct ioctlent *) a)->name; const char *name2 = ((struct ioctlent *) b)->name; return (code1 > code2) ? 1 : (code1 < code2) ? -1 : strcmp(name1, name2); @@ -51,7 +51,7 @@ int main(int argc, char** argv) { for (i = 0; i < nioctls; i++) if (i == 0 || ioctls[i-1].code != ioctls[i].code || is_not_prefix(ioctls[i-1].name, ioctls[i].name)) - printf("\t{\"%s\",\t\"%s\",\t%#06lx},\n", + printf("\t{\"%s\",\t\"%s\",\t%#06x},\n", ioctls[i].header, ioctls[i].name, ioctls[i].code); return 0; @@ -34,7 +34,8 @@ #include "xlat/loop_flags_options.h" #include "xlat/loop_crypt_type_options.h" -int loop_ioctl(struct tcb *tcp, long code, long arg) +int +loop_ioctl(struct tcb *tcp, const unsigned int code, long arg) { struct loop_info info; struct loop_info64 info64; @@ -47,7 +47,8 @@ #include "xlat/mtd_otp_options.h" #include "xlat/mtd_nandecc_options.h" -int mtd_ioctl(struct tcb *tcp, long code, long arg) +int +mtd_ioctl(struct tcb *tcp, const unsigned int code, long arg) { struct mtd_info_user minfo; struct erase_info_user einfo; @@ -252,7 +253,8 @@ int mtd_ioctl(struct tcb *tcp, long code, long arg) #include "xlat/ubi_volume_types.h" #include "xlat/ubi_volume_props.h" -int ubi_ioctl(struct tcb *tcp, long code, long arg) +int +ubi_ioctl(struct tcb *tcp, const unsigned int code, long arg) { struct ubi_mkvol_req mkvol; struct ubi_rsvol_req rsvol; @@ -4,7 +4,8 @@ #include "xlat/ptp_flags_options.h" -int ptp_ioctl(struct tcb *tcp, long code, long arg) +int +ptp_ioctl(struct tcb *tcp, const unsigned int code, long arg) { if (!verbose(tcp)) return 0; @@ -103,7 +103,7 @@ print_sg_io_res(struct tcb *tcp, struct sg_io_hdr *sg_io) } int -scsi_ioctl(struct tcb *tcp, long code, long arg) +scsi_ioctl(struct tcb *tcp, const unsigned int code, long arg) { switch (code) { case SG_IO: @@ -52,7 +52,7 @@ print_addr(struct tcb *tcp, long addr, struct ifreq *ifr) } int -sock_ioctl(struct tcb *tcp, long code, long arg) +sock_ioctl(struct tcb *tcp, const unsigned int code, long arg) { struct ifreq ifr; struct ifconf ifc; @@ -44,7 +44,8 @@ #include "xlat/baud_options.h" #include "xlat/modem_flags.h" -int term_ioctl(struct tcb *tcp, long code, long arg) +int +term_ioctl(struct tcb *tcp, const unsigned int code, long arg) { struct termios tios; struct termio tio; @@ -739,7 +739,7 @@ print_rtc(struct tcb *tcp, const struct rtc_time *rt) } int -rtc_ioctl(struct tcb *tcp, long code, long arg) +rtc_ioctl(struct tcb *tcp, const unsigned int code, long arg) { switch (code) { case RTC_ALM_SET: @@ -149,7 +149,7 @@ static void print_v4l2_format_fmt(const struct v4l2_format *f) } int -v4l2_ioctl(struct tcb *tcp, unsigned long code, long arg) +v4l2_ioctl(struct tcb *tcp, const unsigned int code, long arg) { if (!verbose(tcp)) return 0; |