1/*
2 * Copyright 2012, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <portability.h>
18#include <stdarg.h>
19#include <sys/ioctl.h>
20#include <ioctls_portable.h>
21#include <termios.h>
22#include <linux/sockios.h>
23
24#if FIONREAD_PORTABLE==FIONREAD
25#error Bad build environment
26#endif
27
28static inline int mips_change_request(int request)
29{
30    switch(request) {
31    case TCGETS_PORTABLE:
32        return TCGETS;
33    case TCSETS_PORTABLE:
34        return TCSETS;
35    case TCSETSW_PORTABLE:
36        return TCSETSW;
37    case TCSETSF_PORTABLE:
38        return TCSETSF;
39    case TCGETA_PORTABLE:
40        return TCGETA;
41    case TCSETA_PORTABLE:
42        return TCSETA;
43    case TCSETAW_PORTABLE:
44        return TCSETAW;
45    case TCSETAF_PORTABLE:
46        return TCSETAF;
47    case TCSBRK_PORTABLE:
48        return TCSBRK;
49    case TCXONC_PORTABLE:
50        return TCXONC;
51    case TCFLSH_PORTABLE:
52        return TCFLSH;
53    case TIOCEXCL_PORTABLE:
54        return TIOCEXCL;
55    case TIOCNXCL_PORTABLE:
56        return TIOCNXCL;
57    case TIOCSCTTY_PORTABLE:
58        return TIOCSCTTY;
59    case TIOCGPGRP_PORTABLE:
60        return TIOCGPGRP;
61    case TIOCSPGRP_PORTABLE:
62        return TIOCSPGRP;
63    case TIOCOUTQ_PORTABLE:
64        return TIOCOUTQ;
65    case TIOCSTI_PORTABLE:
66        return TIOCSTI;
67    case TIOCGWINSZ_PORTABLE:
68        return TIOCGWINSZ;
69    case TIOCSWINSZ_PORTABLE:
70        return TIOCSWINSZ;
71    case TIOCMGET_PORTABLE:
72        return TIOCMGET;
73    case TIOCMBIS_PORTABLE:
74        return TIOCMBIS;
75    case TIOCMBIC_PORTABLE:
76        return TIOCMBIC;
77    case TIOCMSET_PORTABLE:
78        return TIOCMSET;
79    case TIOCGSOFTCAR_PORTABLE:
80        return TIOCGSOFTCAR;
81    case TIOCSSOFTCAR_PORTABLE:
82        return TIOCSSOFTCAR;
83    case FIONREAD_PORTABLE:
84        return FIONREAD;
85    /* case TIOCINQ_PORTABLE: // same as FIONREAD_PORTABLE
86        return TIOCINQ; */
87    case TIOCLINUX_PORTABLE:
88        return TIOCLINUX;
89    case TIOCCONS_PORTABLE:
90        return TIOCCONS;
91    case TIOCGSERIAL_PORTABLE:
92        return TIOCGSERIAL;
93    case TIOCSSERIAL_PORTABLE:
94        return TIOCSSERIAL;
95    case TIOCPKT_PORTABLE:
96        return TIOCPKT;
97    case FIONBIO_PORTABLE:
98        return FIONBIO;
99    case TIOCNOTTY_PORTABLE:
100        return TIOCNOTTY;
101    case TIOCSETD_PORTABLE:
102        return TIOCSETD;
103    case TIOCGETD_PORTABLE:
104        return TIOCGETD;
105    case TCSBRKP_PORTABLE:
106        return TCSBRKP;
107    case TIOCSBRK_PORTABLE:
108        return TIOCSBRK;
109    case TIOCCBRK_PORTABLE:
110        return TIOCCBRK;
111    case TIOCGSID_PORTABLE:
112        return TIOCGSID;
113    case FIONCLEX_PORTABLE:
114        return FIONCLEX;
115    case FIOCLEX_PORTABLE:
116        return FIOCLEX;
117    case FIOASYNC_PORTABLE:
118        return FIOASYNC;
119    case TIOCSERCONFIG_PORTABLE:
120        return TIOCSERCONFIG;
121    case TIOCSERGWILD_PORTABLE:
122        return TIOCSERGWILD;
123    case TIOCSERSWILD_PORTABLE:
124        return TIOCSERSWILD;
125    case TIOCGLCKTRMIOS_PORTABLE:
126        return TIOCGLCKTRMIOS;
127    case TIOCSLCKTRMIOS_PORTABLE:
128        return TIOCSLCKTRMIOS;
129    case TIOCSERGSTRUCT_PORTABLE:
130        return TIOCSERGSTRUCT;
131    case TIOCSERGETLSR_PORTABLE:
132        return TIOCSERGETLSR;
133    case TIOCSERGETMULTI_PORTABLE:
134        return TIOCSERGETMULTI;
135    case TIOCSERSETMULTI_PORTABLE:
136        return TIOCSERSETMULTI;
137    case TIOCMIWAIT_PORTABLE:
138        return TIOCMIWAIT;
139    case TIOCGICOUNT_PORTABLE:
140        return TIOCGICOUNT;
141    case FIOQSIZE_PORTABLE:
142        return FIOQSIZE;
143    case TIOCPKT_DATA_PORTABLE:
144        return TIOCPKT_DATA;
145    case TIOCPKT_FLUSHREAD_PORTABLE:
146        return TIOCPKT_FLUSHREAD;
147    case TIOCPKT_FLUSHWRITE_PORTABLE:
148        return TIOCPKT_FLUSHWRITE;
149    case TIOCPKT_STOP_PORTABLE:
150        return TIOCPKT_STOP;
151    case TIOCPKT_START_PORTABLE:
152        return TIOCPKT_START;
153    case TIOCPKT_NOSTOP_PORTABLE:
154        return TIOCPKT_NOSTOP;
155    case TIOCPKT_DOSTOP_PORTABLE:
156        return TIOCPKT_DOSTOP;
157    /* case TIOCSER_TEMT_PORTABLE: // = 1 same as TIOCPKT_FLUSHREAD_PORTABLE
158        return TIOCSER_TEMT; */
159    case TIOCGPTN_PORTABLE:
160        return TIOCGPTN;
161    case TIOCSPTLCK_PORTABLE:
162        return TIOCSPTLCK;
163#ifdef USE_OLD_TTY
164    case TIOCGETD_PORTABLE:
165        return TIOCGETD;
166    case TIOCSETD_PORTABLE:
167        return TIOCSETD;
168#else
169    case OTIOCGETD_PORTABLE:
170        return OTIOCGETD;
171    case OTIOCSETD_PORTABLE:
172        return OTIOCSETD;
173#endif
174    case TIOCHPCL_PORTABLE:
175        return TIOCHPCL;
176    case TIOCGETP_PORTABLE:
177        return TIOCGETP;
178    case TIOCSETP_PORTABLE:
179        return TIOCSETP;
180    case TIOCSETN_PORTABLE:
181        return TIOCSETN;
182    case TIOCSETC_PORTABLE:
183        return TIOCSETC;
184    case TIOCGETC_PORTABLE:
185        return TIOCGETC;
186    case TIOCLBIS_PORTABLE:
187        return TIOCLBIS;
188    case TIOCLBIC_PORTABLE:
189        return TIOCLBIC;
190    case TIOCLSET_PORTABLE:
191        return TIOCLSET;
192    case TIOCLGET_PORTABLE:
193        return TIOCLGET;
194    case TIOCSLTC_PORTABLE:
195        return TIOCSLTC;
196    case TIOCGLTC_PORTABLE:
197        return TIOCGLTC;
198    case OTIOCCONS_PORTABLE:
199        return OTIOCCONS;
200    case FIOSETOWN_PORTABLE:
201        return FIOSETOWN;
202    case SIOCSPGRP_PORTABLE:
203        return SIOCSPGRP;
204    case FIOGETOWN_PORTABLE:
205        return FIOGETOWN;
206    case SIOCGPGRP_PORTABLE:
207        return SIOCGPGRP;
208    case SIOCATMARK_PORTABLE:
209        return SIOCATMARK;
210    case SIOCGSTAMP_PORTABLE:
211        return SIOCGSTAMP;
212    }
213    return request;
214}
215
216extern int __ioctl(int, int, void *);
217int WRAP(ioctl)(int fd, int request, ...)
218{
219    va_list ap;
220    void * arg;
221
222    va_start(ap, request);
223    arg = va_arg(ap, void *);
224    va_end(ap);
225
226    return __ioctl(fd, mips_change_request(request), arg);
227}
228