2 * Copyright 2007-2010, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Hugo Santos <hugosantos@gmail.com>
10 #include <sys/sockio.h>
19 #include "TypeHandler.h"
28 #define IOCTL_INFO_ENTRY(name) \
31 #define IOCTL_INFO_ENTRY_TYPE(name, type) \
32 { name, #name, TypeHandlerFactory<type>::Create() }
34 static const ioctl_info kIOCtls
[] = {
36 IOCTL_INFO_ENTRY_TYPE(B_GET_DEVICE_SIZE
, size_t *),
37 IOCTL_INFO_ENTRY_TYPE(B_SET_DEVICE_SIZE
, size_t *),
38 IOCTL_INFO_ENTRY(B_SET_NONBLOCKING_IO
),
39 IOCTL_INFO_ENTRY(B_SET_BLOCKING_IO
),
40 IOCTL_INFO_ENTRY(B_GET_READ_STATUS
),
41 IOCTL_INFO_ENTRY(B_GET_WRITE_STATUS
),
42 IOCTL_INFO_ENTRY(B_GET_GEOMETRY
),
43 IOCTL_INFO_ENTRY(B_GET_DRIVER_FOR_DEVICE
),
44 IOCTL_INFO_ENTRY(B_GET_PARTITION_INFO
),
45 IOCTL_INFO_ENTRY(B_SET_PARTITION
),
46 IOCTL_INFO_ENTRY(B_FORMAT_DEVICE
),
47 IOCTL_INFO_ENTRY(B_EJECT_DEVICE
),
48 IOCTL_INFO_ENTRY(B_GET_ICON
),
49 IOCTL_INFO_ENTRY(B_GET_BIOS_GEOMETRY
),
50 IOCTL_INFO_ENTRY(B_GET_MEDIA_STATUS
),
51 IOCTL_INFO_ENTRY(B_LOAD_MEDIA
),
52 IOCTL_INFO_ENTRY(B_GET_BIOS_DRIVE_ID
),
53 IOCTL_INFO_ENTRY(B_SET_UNINTERRUPTABLE_IO
),
54 IOCTL_INFO_ENTRY(B_SET_INTERRUPTABLE_IO
),
55 IOCTL_INFO_ENTRY(B_FLUSH_DRIVE_CACHE
),
56 IOCTL_INFO_ENTRY(B_GET_PATH_FOR_DEVICE
),
57 IOCTL_INFO_ENTRY(B_GET_NEXT_OPEN_DEVICE
),
58 IOCTL_INFO_ENTRY(B_ADD_FIXED_DRIVER
),
59 IOCTL_INFO_ENTRY(B_REMOVE_FIXED_DRIVER
),
62 IOCTL_INFO_ENTRY(B_AUDIO_DRIVER_BASE), // conflicts
63 IOCTL_INFO_ENTRY(B_MIDI_DRIVER_BASE),
64 IOCTL_INFO_ENTRY(B_JOYSTICK_DRIVER_BASE),
65 IOCTL_INFO_ENTRY(B_GRAPHIC_DRIVER_BASE),
66 IOCTL_INFO_ENTRY(B_DEVICE_OP_CODES_END),
70 IOCTL_INFO_ENTRY(SIOCADDRT
),
71 IOCTL_INFO_ENTRY(SIOCDELRT
),
72 IOCTL_INFO_ENTRY_TYPE(SIOCSIFADDR
, struct ifreq
*),
73 IOCTL_INFO_ENTRY_TYPE(SIOCGIFADDR
, struct ifreq
*),
74 IOCTL_INFO_ENTRY_TYPE(SIOCSIFDSTADDR
, struct ifreq
*),
75 IOCTL_INFO_ENTRY_TYPE(SIOCGIFDSTADDR
, struct ifreq
*),
76 IOCTL_INFO_ENTRY_TYPE(SIOCSIFFLAGS
, struct ifreq
*),
77 IOCTL_INFO_ENTRY_TYPE(SIOCGIFFLAGS
, struct ifreq
*),
78 IOCTL_INFO_ENTRY_TYPE(SIOCGIFBRDADDR
, struct ifreq
*),
79 IOCTL_INFO_ENTRY_TYPE(SIOCSIFBRDADDR
, struct ifreq
*),
80 IOCTL_INFO_ENTRY_TYPE(SIOCGIFCOUNT
, struct ifconf
*),
81 IOCTL_INFO_ENTRY_TYPE(SIOCGIFCONF
, struct ifconf
*),
82 IOCTL_INFO_ENTRY_TYPE(SIOCGIFINDEX
, struct ifreq
*),
83 IOCTL_INFO_ENTRY(SIOCGIFNAME
),
84 IOCTL_INFO_ENTRY_TYPE(SIOCGIFNETMASK
, struct ifreq
*),
85 IOCTL_INFO_ENTRY_TYPE(SIOCSIFNETMASK
, struct ifreq
*),
86 IOCTL_INFO_ENTRY_TYPE(SIOCGIFMETRIC
, struct ifreq
*),
87 IOCTL_INFO_ENTRY_TYPE(SIOCSIFMETRIC
, struct ifreq
*),
88 IOCTL_INFO_ENTRY_TYPE(SIOCDIFADDR
, struct ifreq
*),
89 IOCTL_INFO_ENTRY_TYPE(SIOCAIFADDR
, struct ifaliasreq
*),
90 IOCTL_INFO_ENTRY(SIOCADDMULTI
),
91 IOCTL_INFO_ENTRY(SIOCDELMULTI
),
92 IOCTL_INFO_ENTRY_TYPE(SIOCGIFMTU
, struct ifreq
*),
93 IOCTL_INFO_ENTRY_TYPE(SIOCSIFMTU
, struct ifreq
*),
94 IOCTL_INFO_ENTRY(SIOCSIFMEDIA
),
95 IOCTL_INFO_ENTRY(SIOCGIFMEDIA
),
96 IOCTL_INFO_ENTRY(SIOCGRTSIZE
),
97 IOCTL_INFO_ENTRY(SIOCGRTTABLE
),
98 IOCTL_INFO_ENTRY_TYPE(SIOCGIFSTATS
, struct ifreq
*),
99 IOCTL_INFO_ENTRY_TYPE(SIOCGIFTYPE
, struct ifreq
*),
100 IOCTL_INFO_ENTRY(SIOCSPACKETCAP
),
101 IOCTL_INFO_ENTRY(SIOCCPACKETCAP
),
102 IOCTL_INFO_ENTRY(SIOCSHIWAT
),
103 IOCTL_INFO_ENTRY(SIOCGHIWAT
),
104 IOCTL_INFO_ENTRY(SIOCSLOWAT
),
105 IOCTL_INFO_ENTRY(SIOCGLOWAT
),
106 IOCTL_INFO_ENTRY(SIOCATMARK
),
107 IOCTL_INFO_ENTRY(SIOCSPGRP
),
109 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_SET_ALIAS
, struct ifaliasreq
*),
110 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_GET_ALIAS
, struct ifaliasreq
*),
111 IOCTL_INFO_ENTRY_TYPE(B_SOCKET_COUNT_ALIASES
, struct ifreq
*),
114 IOCTL_INFO_ENTRY(TCGETA
),
115 IOCTL_INFO_ENTRY(TCSETA
),
116 IOCTL_INFO_ENTRY(TCSETAF
),
117 IOCTL_INFO_ENTRY(TCSETAW
),
118 IOCTL_INFO_ENTRY(TCWAITEVENT
),
119 IOCTL_INFO_ENTRY(TCSBRK
),
120 IOCTL_INFO_ENTRY(TCFLSH
),
121 IOCTL_INFO_ENTRY(TCXONC
),
122 IOCTL_INFO_ENTRY(TCQUERYCONNECTED
),
123 IOCTL_INFO_ENTRY(TCGETBITS
),
124 IOCTL_INFO_ENTRY(TCSETDTR
),
125 IOCTL_INFO_ENTRY(TCSETRTS
),
126 IOCTL_INFO_ENTRY(TIOCGWINSZ
),
127 IOCTL_INFO_ENTRY(TIOCSWINSZ
),
128 IOCTL_INFO_ENTRY(TCVTIME
),
129 IOCTL_INFO_ENTRY(TIOCGPGRP
),
130 IOCTL_INFO_ENTRY(TIOCSPGRP
),
132 IOCTL_INFO_ENTRY(B_IOCTL_GET_TTY_INDEX
),
133 IOCTL_INFO_ENTRY(B_IOCTL_GRANT_TTY
),
136 IOCTL_INFO_ENTRY(B_SCSI_SCAN_FOR_DEVICES
),
137 IOCTL_INFO_ENTRY(B_SCSI_ENABLE_PROFILING
),
138 IOCTL_INFO_ENTRY(B_SCSI_INQUIRY
),
139 IOCTL_INFO_ENTRY(B_SCSI_EJECT
),
140 IOCTL_INFO_ENTRY(B_SCSI_PREVENT_ALLOW
),
141 IOCTL_INFO_ENTRY(B_RAW_DEVICE_COMMAND
),
142 IOCTL_INFO_ENTRY(B_SCSI_GET_TOC
),
143 IOCTL_INFO_ENTRY(B_SCSI_PLAY_TRACK
),
144 IOCTL_INFO_ENTRY(B_SCSI_PLAY_POSITION
),
145 IOCTL_INFO_ENTRY(B_SCSI_STOP_AUDIO
),
146 IOCTL_INFO_ENTRY(B_SCSI_PAUSE_AUDIO
),
147 IOCTL_INFO_ENTRY(B_SCSI_RESUME_AUDIO
),
148 IOCTL_INFO_ENTRY(B_SCSI_GET_POSITION
),
149 IOCTL_INFO_ENTRY(B_SCSI_SET_VOLUME
),
150 IOCTL_INFO_ENTRY(B_SCSI_GET_VOLUME
),
151 IOCTL_INFO_ENTRY(B_SCSI_READ_CD
),
152 IOCTL_INFO_ENTRY(B_SCSI_SCAN
),
153 IOCTL_INFO_ENTRY(B_SCSI_DATA_MODE
),
158 static EnumTypeHandler::EnumMap kIoctlNames
;
159 static TypeHandlerSelector::SelectMap kIoctlTypeHandlers
;
164 for (int i
= 0; kIOCtls
[i
].name
!= NULL
; i
++) {
165 kIoctlNames
[kIOCtls
[i
].index
] = kIOCtls
[i
].name
;
166 if (kIOCtls
[i
].handler
!= NULL
)
167 kIoctlTypeHandlers
[kIOCtls
[i
].index
] = kIOCtls
[i
].handler
;
170 Syscall
*ioctl
= get_syscall("_kern_ioctl");
172 ioctl
->GetParameter("cmd")->SetHandler(
173 new EnumTypeHandler(kIoctlNames
));
174 ioctl
->GetParameter("data")->SetHandler(
175 new TypeHandlerSelector(kIoctlTypeHandlers
,
176 1, TypeHandlerFactory
<void *>::Create()));