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