1745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//===-- sanitizer_common_interceptors_ioctl.inc -----------------*- C++ -*-===//
2745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//
3745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//                     The LLVM Compiler Infrastructure
4745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//
5745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// This file is distributed under the University of Illinois Open Source
6745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// License. See LICENSE.TXT for details.
7745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//
8745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//===----------------------------------------------------------------------===//
9745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//
10745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// Ioctl handling in common sanitizer interceptors.
11745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov//===----------------------------------------------------------------------===//
12745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
13745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#include "sanitizer_flags.h"
14745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
15745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstruct ioctl_desc {
16745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  unsigned req;
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // FIXME: support read+write arguments. Currently READWRITE and WRITE do the
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // same thing.
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // XXX: The declarations below may use WRITE instead of READWRITE, unless
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // explicitly noted.
21745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  enum {
22745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    NONE,
23745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    READ,
24745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    WRITE,
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    READWRITE,
26745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    CUSTOM
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  } type : 3;
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  unsigned size : 29;
292557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  const char* name;
30745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov};
31745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
32745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovconst unsigned ioctl_table_max = 500;
33745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic ioctl_desc ioctl_table[ioctl_table_max];
34745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic unsigned ioctl_table_size = 0;
35745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
36745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// This can not be declared as a global, because references to struct_*_sz
37745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// require a global initializer. And this table must be available before global
38745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov// initializers are run.
39745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic void ioctl_table_fill() {
40bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov#define _(rq, tp, sz)                                    \
41bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov  if (IOCTL_##rq != IOCTL_NOT_PRESENT) {                 \
42bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    CHECK(ioctl_table_size < ioctl_table_max);           \
43bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    ioctl_table[ioctl_table_size].req = IOCTL_##rq;      \
44bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    ioctl_table[ioctl_table_size].type = ioctl_desc::tp; \
45bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    ioctl_table[ioctl_table_size].size = sz;             \
46bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    ioctl_table[ioctl_table_size].name = #rq;            \
47bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov    ++ioctl_table_size;                                  \
48bb273d554d61c1a851158b0c79c2d3f51a845bbdEvgeniy Stepanov  }
49745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
502557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIOASYNC, READ, sizeof(int));
512557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIOCLEX, NONE, 0);
522557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIOGETOWN, WRITE, sizeof(int));
532557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIONBIO, READ, sizeof(int));
542557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIONCLEX, NONE, 0);
552557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FIOSETOWN, READ, sizeof(int));
562557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCADDMULTI, READ, struct_ifreq_sz);
572557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCATMARK, WRITE, sizeof(int));
582557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCDELMULTI, READ, struct_ifreq_sz);
592557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFADDR, WRITE, struct_ifreq_sz);
602557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFBRDADDR, WRITE, struct_ifreq_sz);
612557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFCONF, CUSTOM, 0);
622557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFDSTADDR, WRITE, struct_ifreq_sz);
632557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFFLAGS, WRITE, struct_ifreq_sz);
642557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFMETRIC, WRITE, struct_ifreq_sz);
652557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFMTU, WRITE, struct_ifreq_sz);
662557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFNETMASK, WRITE, struct_ifreq_sz);
672557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGPGRP, WRITE, sizeof(int));
682557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFADDR, READ, struct_ifreq_sz);
692557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFBRDADDR, READ, struct_ifreq_sz);
702557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFDSTADDR, READ, struct_ifreq_sz);
712557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFFLAGS, READ, struct_ifreq_sz);
722557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFMETRIC, READ, struct_ifreq_sz);
732557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFMTU, READ, struct_ifreq_sz);
742557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFNETMASK, READ, struct_ifreq_sz);
752557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSPGRP, READ, sizeof(int));
762557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCCONS, NONE, 0);
772557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCEXCL, NONE, 0);
782557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGETD, WRITE, sizeof(int));
792557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGPGRP, WRITE, pid_t_sz);
802557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGWINSZ, WRITE, struct_winsize_sz);
812557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCMBIC, READ, sizeof(int));
822557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCMBIS, READ, sizeof(int));
832557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCMGET, WRITE, sizeof(int));
842557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCMSET, READ, sizeof(int));
852557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCNOTTY, NONE, 0);
862557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCNXCL, NONE, 0);
872557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCOUTQ, WRITE, sizeof(int));
882557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCPKT, READ, sizeof(int));
892557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSCTTY, NONE, 0);
902557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSETD, READ, sizeof(int));
912557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSPGRP, READ, pid_t_sz);
922557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSTI, READ, sizeof(char));
932557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSWINSZ, READ, struct_winsize_sz);
944ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov
95efb0226d4bc5a61e26851271e1aec2dd0e1f6781Bob Wilson#if (SANITIZER_LINUX && !SANITIZER_ANDROID)
962557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGETSGCNT, WRITE, struct_sioc_sg_req_sz);
972557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGETVIFCNT, WRITE, struct_sioc_vif_req_sz);
984ce6f79a13d9e22003324dca842d03108b333a58Evgeniy Stepanov#endif
99745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
100745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#if SANITIZER_LINUX
1012557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // Conflicting request ids.
1022557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(CDROMAUDIOBUFSIZ, NONE, 0);
1032557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SNDCTL_TMR_CONTINUE, NONE, 0);
1042557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SNDCTL_TMR_START, NONE, 0);
1052557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SNDCTL_TMR_STOP, NONE, 0);
1062557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SOUND_MIXER_READ_LOUD, WRITE, sizeof(int)); // same as ...READ_ENHANCE
1072557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SOUND_MIXER_READ_MUTE, WRITE, sizeof(int)); // same as ...READ_ENHANCE
1082557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SOUND_MIXER_WRITE_LOUD, WRITE, sizeof(int)); // same as ...WRITE_ENHANCE
1092557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SOUND_MIXER_WRITE_MUTE, WRITE, sizeof(int)); // same as ...WRITE_ENHANCE
1102557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKFLSBUF, NONE, 0);
1112557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKGETSIZE, WRITE, sizeof(uptr));
1122557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKRAGET, WRITE, sizeof(int));
1132557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKRASET, NONE, 0);
1142557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKROGET, WRITE, sizeof(int));
1152557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKROSET, READ, sizeof(int));
1162557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(BLKRRPART, NONE, 0);
1172557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMEJECT, NONE, 0);
1182557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMEJECT_SW, NONE, 0);
1192557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMMULTISESSION, WRITE, struct_cdrom_multisession_sz);
1202557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMPAUSE, NONE, 0);
1212557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMPLAYMSF, READ, struct_cdrom_msf_sz);
1222557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMPLAYTRKIND, READ, struct_cdrom_ti_sz);
1232557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADAUDIO, READ, struct_cdrom_read_audio_sz);
1242557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADCOOKED, READ, struct_cdrom_msf_sz);
1252557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADMODE1, READ, struct_cdrom_msf_sz);
1262557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADMODE2, READ, struct_cdrom_msf_sz);
1272557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADRAW, READ, struct_cdrom_msf_sz);
1282557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADTOCENTRY, WRITE, struct_cdrom_tocentry_sz);
1292557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMREADTOCHDR, WRITE, struct_cdrom_tochdr_sz);
1302557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMRESET, NONE, 0);
1312557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMRESUME, NONE, 0);
1322557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMSEEK, READ, struct_cdrom_msf_sz);
1332557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMSTART, NONE, 0);
1342557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMSTOP, NONE, 0);
1352557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMSUBCHNL, WRITE, struct_cdrom_subchnl_sz);
1362557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMVOLCTRL, READ, struct_cdrom_volctrl_sz);
1372557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROMVOLREAD, WRITE, struct_cdrom_volctrl_sz);
1382557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CDROM_GET_UPC, WRITE, 8);
1394612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGABS, WRITE, struct_input_absinfo_sz); // fixup
1404612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGBIT, WRITE, struct_input_id_sz); // fixup
1414612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGEFFECTS, WRITE, sizeof(int));
1424612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGID, WRITE, struct_input_id_sz);
1434612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGKEY, WRITE, 0);
1444612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGKEYCODE, WRITE, sizeof(int) * 2);
1454612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGLED, WRITE, 0);
1464612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGNAME, WRITE, 0);
1474612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGPHYS, WRITE, 0);
1484612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGRAB, READ, sizeof(int));
1494612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGREP, WRITE, sizeof(int) * 2);
1504612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGSND, WRITE, 0);
1514612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGSW, WRITE, 0);
1524612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGUNIQ, WRITE, 0);
1534612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGVERSION, WRITE, sizeof(int));
1544612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCRMFF, READ, sizeof(int));
1554612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCSABS, READ, struct_input_absinfo_sz); // fixup
1564612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCSFF, READ, struct_ff_effect_sz);
1574612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCSKEYCODE, READ, sizeof(int) * 2);
1584612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCSREP, READ, sizeof(int) * 2);
1592557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDCLRPRM, NONE, 0);
1602557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDDEFPRM, READ, struct_floppy_struct_sz);
1612557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDFLUSH, NONE, 0);
1622557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDFMTBEG, NONE, 0);
1632557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDFMTEND, NONE, 0);
1642557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDFMTTRK, READ, struct_format_descr_sz);
1652557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETDRVPRM, WRITE, struct_floppy_drive_params_sz);
1662557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETDRVSTAT, WRITE, struct_floppy_drive_struct_sz);
1672557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETDRVTYP, WRITE, 16);
1682557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETFDCSTAT, WRITE, struct_floppy_fdc_state_sz);
1692557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETMAXERRS, WRITE, struct_floppy_max_errors_sz);
1702557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDGETPRM, WRITE, struct_floppy_struct_sz);
1712557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDMSGOFF, NONE, 0);
1722557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDMSGON, NONE, 0);
1732557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDPOLLDRVSTAT, WRITE, struct_floppy_drive_struct_sz);
1742557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDRAWCMD, WRITE, struct_floppy_raw_cmd_sz);
1752557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDRESET, NONE, 0);
1762557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDSETDRVPRM, READ, struct_floppy_drive_params_sz);
1772557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDSETEMSGTRESH, NONE, 0);
1782557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDSETMAXERRS, READ, struct_floppy_max_errors_sz);
1792557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDSETPRM, READ, struct_floppy_struct_sz);
1802557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDTWADDLE, NONE, 0);
1812557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDWERRORCLR, NONE, 0);
1822557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(FDWERRORGET, WRITE, struct_floppy_write_errors_sz);
1832557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_DRIVE_CMD, WRITE, sizeof(int));
1842557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GETGEO, WRITE, struct_hd_geometry_sz);
1852557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_32BIT, WRITE, sizeof(int));
1862557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_DMA, WRITE, sizeof(int));
1872557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_IDENTITY, WRITE, struct_hd_driveid_sz);
1882557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_KEEPSETTINGS, WRITE, sizeof(int));
1892557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_MULTCOUNT, WRITE, sizeof(int));
1902557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_NOWERR, WRITE, sizeof(int));
1912557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_GET_UNMASKINTR, WRITE, sizeof(int));
1922557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_32BIT, NONE, 0);
1932557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_DMA, NONE, 0);
1942557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_KEEPSETTINGS, NONE, 0);
1952557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_MULTCOUNT, NONE, 0);
1962557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_NOWERR, NONE, 0);
1972557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(HDIO_SET_UNMASKINTR, NONE, 0);
1982557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(MTIOCGET, WRITE, struct_mtget_sz);
1992557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(MTIOCPOS, WRITE, struct_mtpos_sz);
2002557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(MTIOCTOP, READ, struct_mtop_sz);
2012557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCGASYNCMAP, WRITE, sizeof(int));
2022557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCGDEBUG, WRITE, sizeof(int));
2032557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCGFLAGS, WRITE, sizeof(int));
2042557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCGUNIT, WRITE, sizeof(int));
2052557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCGXASYNCMAP, WRITE, sizeof(int) * 8);
2062557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSASYNCMAP, READ, sizeof(int));
2072557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSDEBUG, READ, sizeof(int));
2082557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSFLAGS, READ, sizeof(int));
2092557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSMAXCID, READ, sizeof(int));
2102557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSMRU, READ, sizeof(int));
2112557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PPPIOCSXASYNCMAP, READ, sizeof(int) * 8);
2122557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCADDRT, READ, struct_rtentry_sz);
2132557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCDARP, READ, struct_arpreq_sz);
2142557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCDELRT, READ, struct_rtentry_sz);
2152557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCDRARP, READ, struct_arpreq_sz);
2162557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGARP, WRITE, struct_arpreq_sz);
2172557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFENCAP, WRITE, sizeof(int));
2182557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFHWADDR, WRITE, struct_ifreq_sz);
2192557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFMAP, WRITE, struct_ifreq_sz);
2202557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFMEM, WRITE, struct_ifreq_sz);
2212557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFNAME, NONE, 0);
2222557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGIFSLAVE, NONE, 0);
2232557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGRARP, WRITE, struct_arpreq_sz);
2242557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCGSTAMP, WRITE, timeval_sz);
2252557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSARP, READ, struct_arpreq_sz);
2262557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFENCAP, READ, sizeof(int));
2272557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFHWADDR, READ, struct_ifreq_sz);
2282557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFLINK, NONE, 0);
2292557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFMAP, READ, struct_ifreq_sz);
2302557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFMEM, READ, struct_ifreq_sz);
2312557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSIFSLAVE, NONE, 0);
2322557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SIOCSRARP, READ, struct_arpreq_sz);
2332557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_HALT, WRITE, struct_copr_debug_buf_sz);
2342557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_LOAD, READ, struct_copr_buffer_sz);
2352557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_RCODE, WRITE, struct_copr_debug_buf_sz);
2362557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_RCVMSG, WRITE, struct_copr_msg_sz);
2372557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_RDATA, WRITE, struct_copr_debug_buf_sz);
2382557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_RESET, NONE, 0);
2392557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_RUN, WRITE, struct_copr_debug_buf_sz);
2402557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_SENDMSG, READ, struct_copr_msg_sz);
2412557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_WCODE, READ, struct_copr_debug_buf_sz);
2422557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_COPR_WDATA, READ, struct_copr_debug_buf_sz);
2432557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_GETBLKSIZE, WRITE, sizeof(int));
2442557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_GETFMTS, WRITE, sizeof(int));
2452557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_NONBLOCK, NONE, 0);
2462557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_POST, NONE, 0);
2472557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_RESET, NONE, 0);
2482557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_SETFMT, WRITE, sizeof(int));
2492557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_SETFRAGMENT, WRITE, sizeof(int));
2502557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_SPEED, WRITE, sizeof(int));
2512557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_STEREO, WRITE, sizeof(int));
2522557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_SUBDIVIDE, WRITE, sizeof(int));
2532557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_SYNC, NONE, 0);
2542557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_FM_4OP_ENABLE, READ, sizeof(int));
2552557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_FM_LOAD_INSTR, READ, struct_sbi_instrument_sz);
2562557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_MIDI_INFO, WRITE, struct_midi_info_sz);
2572557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_MIDI_PRETIME, WRITE, sizeof(int));
2582557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_CTRLRATE, WRITE, sizeof(int));
2592557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_GETINCOUNT, WRITE, sizeof(int));
2602557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_GETOUTCOUNT, WRITE, sizeof(int));
2612557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_NRMIDIS, WRITE, sizeof(int));
2622557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_NRSYNTHS, WRITE, sizeof(int));
2632557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_OUTOFBAND, READ, struct_seq_event_rec_sz);
2642557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_PANIC, NONE, 0);
2652557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_PERCMODE, NONE, 0);
2662557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_RESET, NONE, 0);
2672557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_RESETSAMPLES, READ, sizeof(int));
2682557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_SYNC, NONE, 0);
2692557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_TESTMIDI, READ, sizeof(int));
2702557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SEQ_THRESHOLD, READ, sizeof(int));
2712557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SYNTH_INFO, WRITE, struct_synth_info_sz);
2722557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_SYNTH_MEMAVL, WRITE, sizeof(int));
2732557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_TMR_METRONOME, READ, sizeof(int));
2742557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_TMR_SELECT, WRITE, sizeof(int));
2752557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_TMR_SOURCE, WRITE, sizeof(int));
2762557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_TMR_TEMPO, WRITE, sizeof(int));
2772557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_TMR_TIMEBASE, WRITE, sizeof(int));
2782557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_ALTPCM, WRITE, sizeof(int));
2792557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_BASS, WRITE, sizeof(int));
2802557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_CAPS, WRITE, sizeof(int));
2812557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_CD, WRITE, sizeof(int));
2822557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_DEVMASK, WRITE, sizeof(int));
2832557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_ENHANCE, WRITE, sizeof(int));
2842557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_IGAIN, WRITE, sizeof(int));
2852557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_IMIX, WRITE, sizeof(int));
2862557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_LINE, WRITE, sizeof(int));
2872557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_LINE1, WRITE, sizeof(int));
2882557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_LINE2, WRITE, sizeof(int));
2892557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_LINE3, WRITE, sizeof(int));
2902557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_MIC, WRITE, sizeof(int));
2912557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_OGAIN, WRITE, sizeof(int));
2922557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_PCM, WRITE, sizeof(int));
2932557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_RECLEV, WRITE, sizeof(int));
2942557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_RECMASK, WRITE, sizeof(int));
2952557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_RECSRC, WRITE, sizeof(int));
2962557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_SPEAKER, WRITE, sizeof(int));
2972557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_STEREODEVS, WRITE, sizeof(int));
2982557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_SYNTH, WRITE, sizeof(int));
2992557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_TREBLE, WRITE, sizeof(int));
3002557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_READ_VOLUME, WRITE, sizeof(int));
3012557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_ALTPCM, WRITE, sizeof(int));
3022557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_BASS, WRITE, sizeof(int));
3032557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_CD, WRITE, sizeof(int));
3042557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_ENHANCE, WRITE, sizeof(int));
3052557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_IGAIN, WRITE, sizeof(int));
3062557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_IMIX, WRITE, sizeof(int));
3072557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_LINE, WRITE, sizeof(int));
3082557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_LINE1, WRITE, sizeof(int));
3092557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_LINE2, WRITE, sizeof(int));
3102557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_LINE3, WRITE, sizeof(int));
3112557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_MIC, WRITE, sizeof(int));
3122557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_OGAIN, WRITE, sizeof(int));
3132557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_PCM, WRITE, sizeof(int));
3142557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_RECLEV, WRITE, sizeof(int));
3152557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_RECSRC, WRITE, sizeof(int));
3162557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_SPEAKER, WRITE, sizeof(int));
3172557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_SYNTH, WRITE, sizeof(int));
3182557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_TREBLE, WRITE, sizeof(int));
3192557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_MIXER_WRITE_VOLUME, WRITE, sizeof(int));
3202557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_READ_BITS, WRITE, sizeof(int));
3212557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_READ_CHANNELS, WRITE, sizeof(int));
3222557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_READ_FILTER, WRITE, sizeof(int));
3232557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_READ_RATE, WRITE, sizeof(int));
3242557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_WRITE_CHANNELS, WRITE, sizeof(int));
3252557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SOUND_PCM_WRITE_FILTER, WRITE, sizeof(int));
3262557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCFLSH, NONE, 0);
3272557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCGETA, WRITE, struct_termio_sz);
3282557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCGETS, WRITE, struct_termios_sz);
3292557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSBRK, NONE, 0);
3302557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSBRKP, NONE, 0);
3312557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETA, READ, struct_termio_sz);
3322557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETAF, READ, struct_termio_sz);
3332557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETAW, READ, struct_termio_sz);
3342557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETS, READ, struct_termios_sz);
3352557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETSF, READ, struct_termios_sz);
3362557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCSETSW, READ, struct_termios_sz);
3372557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TCXONC, NONE, 0);
3382557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGLCKTRMIOS, WRITE, struct_termios_sz);
3392557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGSOFTCAR, WRITE, sizeof(int));
3402557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCINQ, WRITE, sizeof(int));
3412557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCLINUX, READ, sizeof(char));
3422557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERCONFIG, NONE, 0);
3432557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERGETLSR, WRITE, sizeof(int));
3442557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERGWILD, WRITE, sizeof(int));
3452557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERSWILD, READ, sizeof(int));
3462557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSLCKTRMIOS, READ, struct_termios_sz);
3472557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSSOFTCAR, READ, sizeof(int));
3482557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_ACTIVATE, NONE, 0);
3492557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_DISALLOCATE, NONE, 0);
3502557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_GETMODE, WRITE, struct_vt_mode_sz);
3512557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_GETSTATE, WRITE, struct_vt_stat_sz);
3522557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_OPENQRY, WRITE, sizeof(int));
3532557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_RELDISP, NONE, 0);
3542557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_RESIZE, READ, struct_vt_sizes_sz);
3552557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_RESIZEX, READ, struct_vt_consize_sz);
3562557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_SENDSIG, NONE, 0);
3572557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_SETMODE, READ, struct_vt_mode_sz);
3582557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(VT_WAITACTIVE, NONE, 0);
359745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#endif
360745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
361745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#if SANITIZER_LINUX && !SANITIZER_ANDROID
3622557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE
3632557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYGETDEFTHRESH, WRITE, sizeof(int));
3642557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYGETDEFTIMEOUT, WRITE, sizeof(int));
3652557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYGETMON, WRITE, struct_cyclades_monitor_sz);
3662557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYGETTHRESH, WRITE, sizeof(int));
3672557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYGETTIMEOUT, WRITE, sizeof(int));
3682557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYSETDEFTHRESH, NONE, 0);
3692557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYSETDEFTIMEOUT, NONE, 0);
3702557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYSETTHRESH, NONE, 0);
3712557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(CYSETTIMEOUT, NONE, 0);
3722557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz);
3732557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_ENSLAVE, WRITE, struct_ifreq_sz);
3742557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz);
3752557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_GETSLAVECFG, WRITE, struct_ifreq_sz);
3762557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_SETMASTRCFG, WRITE, struct_ifreq_sz);
3772557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(EQL_SETSLAVECFG, WRITE, struct_ifreq_sz);
3784612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGKEYCODE_V2, WRITE, struct_input_keymap_entry_sz);
3794612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCGPROP, WRITE, 0);
3804612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  _(EVIOCSKEYCODE_V2, READ, struct_input_keymap_entry_sz);
3817028c1ee187302ace4fa3530769458c0b3caf946Evgeniy Stepanov  _(FS_IOC_GETFLAGS, WRITE, sizeof(int));
3827028c1ee187302ace4fa3530769458c0b3caf946Evgeniy Stepanov  _(FS_IOC_GETVERSION, WRITE, sizeof(int));
3837028c1ee187302ace4fa3530769458c0b3caf946Evgeniy Stepanov  _(FS_IOC_SETFLAGS, READ, sizeof(int));
3847028c1ee187302ace4fa3530769458c0b3caf946Evgeniy Stepanov  _(FS_IOC_SETVERSION, READ, sizeof(int));
3852557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(GIO_CMAP, WRITE, 48);
3862557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(GIO_FONT, WRITE, 8192);
3872557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(GIO_SCRNMAP, WRITE, e_tabsz);
3882557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(GIO_UNIMAP, WRITE, struct_unimapdesc_sz);
3892557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(GIO_UNISCRNMAP, WRITE, sizeof(short) * e_tabsz);
3902557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDADDIO, NONE, 0);
3912557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDDELIO, NONE, 0);
3922557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDDISABIO, NONE, 0);
3932557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDENABIO, NONE, 0);
3942557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGETKEYCODE, WRITE, struct_kbkeycode_sz);
3952557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGETLED, WRITE, 1);
3962557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGETMODE, WRITE, sizeof(int));
3972557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBDIACR, WRITE, struct_kbdiacrs_sz);
3982557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBENT, WRITE, struct_kbentry_sz);
3992557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBLED, WRITE, sizeof(int));
4002557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBMETA, WRITE, sizeof(int));
4012557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBMODE, WRITE, sizeof(int));
4022557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBSENT, WRITE, struct_kbsentry_sz);
4032557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDGKBTYPE, WRITE, 1);
4042557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDMAPDISP, NONE, 0);
4052557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDMKTONE, NONE, 0);
4062557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSETKEYCODE, READ, struct_kbkeycode_sz);
4072557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSETLED, NONE, 0);
4082557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSETMODE, NONE, 0);
4092557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSIGACCEPT, NONE, 0);
4102557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBDIACR, READ, struct_kbdiacrs_sz);
4112557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBENT, READ, struct_kbentry_sz);
4122557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBLED, NONE, 0);
4132557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBMETA, NONE, 0);
4142557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBMODE, NONE, 0);
4152557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDSKBSENT, READ, struct_kbsentry_sz);
4162557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KDUNMAPDISP, NONE, 0);
4172557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(KIOCSOUND, NONE, 0);
4182557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPABORT, NONE, 0);
4192557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPABORTOPEN, NONE, 0);
4202557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPCAREFUL, NONE, 0);
4212557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPCHAR, NONE, 0);
4222557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPGETIRQ, WRITE, sizeof(int));
4232557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPGETSTATUS, WRITE, sizeof(int));
4242557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPRESET, NONE, 0);
4252557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPSETIRQ, NONE, 0);
4262557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPTIME, NONE, 0);
4272557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(LPWAIT, NONE, 0);
4288766b8162c8e0e2f57baf7aa47736f89aaaac9dcChandler Carruth  _(MTIOCGETCONFIG, WRITE, struct_mtconfiginfo_sz);
4298766b8162c8e0e2f57baf7aa47736f89aaaac9dcChandler Carruth  _(MTIOCSETCONFIG, READ, struct_mtconfiginfo_sz);
4302557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_CMAP, NONE, 0);
4312557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_FONT, READ, 8192);
4322557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_SCRNMAP, READ, e_tabsz);
4332557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_UNIMAP, READ, struct_unimapdesc_sz);
4342557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_UNIMAPCLR, READ, struct_unimapinit_sz);
4352557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(PIO_UNISCRNMAP, READ, sizeof(short) * e_tabsz);
4362557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SCSI_IOCTL_PROBE_HOST, READ, sizeof(int));
4372557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SCSI_IOCTL_TAGGED_DISABLE, NONE, 0);
4382557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SCSI_IOCTL_TAGGED_ENABLE, NONE, 0);
4392557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_GETISPACE, WRITE, struct_audio_buf_info_sz);
4402557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(SNDCTL_DSP_GETOSPACE, WRITE, struct_audio_buf_info_sz);
4412557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCGSERIAL, WRITE, struct_serial_struct_sz);
4422557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERGETMULTI, WRITE, struct_serial_multiport_struct_sz);
4432557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSERSETMULTI, READ, struct_serial_multiport_struct_sz);
4442557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  _(TIOCSSERIAL, READ, struct_serial_struct_sz);
445745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
446745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  // The following ioctl requests are shared between AX25, IPX, netrom and
447745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  // mrouted.
4482557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAIPXITFCRT, READ, sizeof(char));
4492557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25GETUID, READ, struct_sockaddr_ax25_sz);
4502557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCNRGETPARMS, WRITE, struct_nr_parms_struct_sz);
4512557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAIPXPRISLT, READ, sizeof(char));
4522557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCNRSETPARMS, READ, struct_nr_parms_struct_sz);
4532557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25ADDUID, READ, struct_sockaddr_ax25_sz);
4542557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCNRDECOBS, NONE, 0);
4552557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25DELUID, READ, struct_sockaddr_ax25_sz);
4562557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCIPXCFGDATA, WRITE, struct_ipx_config_data_sz);
4572557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25NOUID, READ, sizeof(int));
4582557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCNRRTCTL, READ, sizeof(int));
4592557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25DIGCTL, READ, sizeof(int));
4602557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25GETPARMS, WRITE, struct_ax25_parms_struct_sz);
4612557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  // _(SIOCAX25SETPARMS, READ, struct_ax25_parms_struct_sz);
462745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#endif
463745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov#undef _
464745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov}
465745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
466745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic bool ioctl_initialized = false;
467745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
468745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstruct ioctl_desc_compare {
469745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  bool operator()(const ioctl_desc& left, const ioctl_desc& right) const {
470745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    return left.req < right.req;
471745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  }
472745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov};
473745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
474745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic void ioctl_init() {
475745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  ioctl_table_fill();
476745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  InternalSort(&ioctl_table, ioctl_table_size, ioctl_desc_compare());
477745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
4782557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  bool bad = false;
479745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  for (unsigned i = 0; i < ioctl_table_size - 1; ++i) {
480745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    if (ioctl_table[i].req >= ioctl_table[i + 1].req) {
4812557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov      Printf("Duplicate or unsorted ioctl request id %x >= %x (%s vs %s)\n",
4822557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov             ioctl_table[i].req, ioctl_table[i + 1].req, ioctl_table[i].name,
4832557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov             ioctl_table[i + 1].name);
4842557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov      bad = true;
485745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    }
486745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  }
487745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
4882557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  if (bad) Die();
4892557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov
490745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  ioctl_initialized = true;
491745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov}
492745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
4934612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov// Handle the most evil ioctls that encode argument value as part of request id.
4944612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanovstatic unsigned ioctl_request_fixup(unsigned req) {
495132d51c45af60185e61724fe16d5694eecd0d5e0Evgeniy Stepanov#if SANITIZER_LINUX
4962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Strip size and event number.
4972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  const unsigned kEviocgbitMask =
4982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      (IOC_SIZEMASK << IOC_SIZESHIFT) | EVIOC_EV_MAX;
4992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if ((req & ~kEviocgbitMask) == IOCTL_EVIOCGBIT)
5004612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    return IOCTL_EVIOCGBIT;
5012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Strip absolute axis number.
5022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if ((req & ~EVIOC_ABS_MAX) == IOCTL_EVIOCGABS)
5034612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    return IOCTL_EVIOCGABS;
5042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if ((req & ~EVIOC_ABS_MAX) == IOCTL_EVIOCSABS)
5054612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    return IOCTL_EVIOCSABS;
506132d51c45af60185e61724fe16d5694eecd0d5e0Evgeniy Stepanov#endif
5074612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  return req;
5084612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov}
5094612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
5104612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanovstatic const ioctl_desc *ioctl_table_lookup(unsigned req) {
511745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  int left = 0;
5122557a1b4517971c9cf1aff62425fc48561db9949Evgeniy Stepanov  int right = ioctl_table_size;
513745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  while (left < right) {
514745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    int mid = (left + right) / 2;
515745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    if (ioctl_table[mid].req < req)
516745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov      left = mid + 1;
517745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    else
518745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov      right = mid;
519745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  }
520745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  if (left == right && ioctl_table[left].req == req)
521745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    return ioctl_table + left;
522745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  else
523745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    return 0;
524745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov}
525745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
5262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic bool ioctl_decode(unsigned req, ioctl_desc *desc) {
5272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  CHECK(desc);
5282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  desc->req = req;
5292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  desc->name = "<DECODED_IOCTL>";
5302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  desc->size = IOC_SIZE(req);
5312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Sanity check.
5325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  if (desc->size > 0xFFFF) return false;
5332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  unsigned dir = IOC_DIR(req);
5342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  switch (dir) {
5352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case IOC_NONE:
5362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      desc->type = ioctl_desc::NONE;
5372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
5382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case IOC_READ | IOC_WRITE:
5392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      desc->type = ioctl_desc::READWRITE;
5402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
5412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case IOC_READ:
5422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      desc->type = ioctl_desc::WRITE;
5432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
5442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    case IOC_WRITE:
5452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      desc->type = ioctl_desc::READ;
5462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      break;
5472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    default:
5482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      return false;
5492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  }
5505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // Size can be 0 iff type is NONE.
5515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  if ((desc->type == IOC_NONE) != (desc->size == 0)) return false;
5522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // Sanity check.
5535d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  if (IOC_TYPE(req) == 0) return false;
5542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return true;
5552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
5562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
5574612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanovstatic const ioctl_desc *ioctl_lookup(unsigned req) {
5584612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  req = ioctl_request_fixup(req);
5594612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  const ioctl_desc *desc = ioctl_table_lookup(req);
5604612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  if (desc) return desc;
5614612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
5624612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  // Try stripping access size from the request id.
5632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  desc = ioctl_table_lookup(req & ~(IOC_SIZEMASK << IOC_SIZESHIFT));
5644612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  // Sanity check: requests that encode access size are either read or write and
5654612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  // have size of 0 in the table.
5664612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  if (desc && desc->size == 0 &&
5672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      (desc->type == ioctl_desc::READWRITE || desc->type == ioctl_desc::WRITE ||
5682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines       desc->type == ioctl_desc::READ))
5694612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    return desc;
5704612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  return 0;
5714612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov}
5724612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov
573745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic void ioctl_common_pre(void *ctx, const ioctl_desc *desc, int d,
574745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov                             unsigned request, void *arg) {
5752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (desc->type == ioctl_desc::READ || desc->type == ioctl_desc::READWRITE) {
5764612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    unsigned size = desc->size ? desc->size : IOC_SIZE(request);
5774612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    COMMON_INTERCEPTOR_READ_RANGE(ctx, arg, size);
5784612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov  }
579745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  if (desc->type != ioctl_desc::CUSTOM)
580745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    return;
5814757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov  switch (request) {
5824757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov    case 0x00008912: {  // SIOCGIFCONF
5834757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;
5844757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      COMMON_INTERCEPTOR_READ_RANGE(ctx, &ifc->ifc_len, sizeof(ifc->ifc_len));
5854757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      break;
5864757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov    }
5874757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov  }
588745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  return;
589745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov}
590745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov
591745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanovstatic void ioctl_common_post(void *ctx, const ioctl_desc *desc, int res, int d,
592745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov                              unsigned request, void *arg) {
5932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  if (desc->type == ioctl_desc::WRITE || desc->type == ioctl_desc::READWRITE) {
594745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    // FIXME: add verbose output
5954612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    unsigned size = desc->size ? desc->size : IOC_SIZE(request);
5964612abac2e172e077246cec0fcbed291f55a1d02Evgeniy Stepanov    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, arg, size);
597745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  }
598745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov  if (desc->type != ioctl_desc::CUSTOM)
599745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov    return;
6004757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov  switch (request) {
6014757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov    case 0x00008912: {  // SIOCGIFCONF
6024757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      struct __sanitizer_ifconf *ifc = (__sanitizer_ifconf *)arg;
6034757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      COMMON_INTERCEPTOR_WRITE_RANGE(ctx, ifc->ifc_ifcu.ifcu_req, ifc->ifc_len);
6044757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov      break;
6054757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov    }
6064757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov  }
6074757c47ba7356aec3a7d49e5e929c19159d75a01Evgeniy Stepanov  return;
608745dd0d296e7bef712df4b5c7f86c72534953738Evgeniy Stepanov}
609