* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libbsd / sgtty.c
blobc3cecc1f060f8a236d9ffa61954e52ba9bbd5e39
1 /* sgtty.c - emulate BSD sgtty stuff with termios - ross biro, rick sladkey */
3 #define _SGTTY_SOURCE
5 #include <bsd/sgtty.h>
6 #include <sys/ioctl.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <termios.h>
12 struct mask
14 unsigned short mask;
15 unsigned short res;
18 struct sf
20 struct mask iflag;
21 struct mask oflag;
22 struct mask cflag;
23 struct mask lflag;
26 static struct sf trans[] =
28 /* order is important here. */
29 /* iflag oflag cflag lflag */
30 /* this needs to be fixed. */
31 {{0,0}, {OPOST,0}, {0,0}, {ISIG,0}}, /* O_RAW */
32 {{0,0}, {0,0}, {0,0}, {XCASE,XCASE}}, /* O_LCASE */
33 {{ICRNL,ICRNL}, {ONLCR, ONLCR}, {0,0}, {0,0}}, /* O_CRMOD */
34 {{0,0}, {0,0}, {0,0}, {ECHO,ECHO}}, /* O_ECHO */
35 {{0,0}, {0,0}, {PARENB|PARODD,PARENB|PARODD}, {0,0}},/* O_ODDP */
36 {{0,0}, {0,0}, {PARENB|PARODD,PARENB}, {0,0}}, /* O_EVENP */
37 {{0,0}, {0,0}, {0,0}, {ICANON,0}}, /* O_CBREAK */
40 #define _BSD_VDISABLE 255
42 static int
43 bchar (c)
44 unsigned char c;
46 return c == _POSIX_VDISABLE ? _BSD_VDISABLE : c;
49 static int
50 pchar (c)
51 unsigned char c;
53 return c == _BSD_VDISABLE ? _POSIX_VDISABLE : c;
56 int
57 gtty (fd,sg)
58 int fd;
59 struct sgttyb *sg;
61 struct termios t;
62 int err;
63 int i;
64 err = ioctl (fd, TCGETS, &t);
65 if (err < 0) return (err);
66 sg->sg_ispeed = cfgetispeed (&t);
67 sg->sg_ospeed = cfgetospeed (&t);
68 sg->sg_erase = bchar (t.c_cc[VERASE]);
69 sg->sg_kill = bchar (t.c_cc[VKILL]);
70 sg->sg_flags = 0;
71 for (i = 0; i < sizeof (trans) / sizeof (struct sf); i++)
73 if ((t.c_iflag & trans[i].iflag.mask) == trans[i].iflag.res &&
74 (t.c_oflag & trans[i].oflag.mask) == trans[i].oflag.res &&
75 (t.c_cflag & trans[i].cflag.mask) == trans[i].cflag.res &&
76 (t.c_lflag & trans[i].lflag.mask) == trans[i].lflag.res)
78 sg->sg_flags |= 1 << i;
81 return (0);
84 static int
85 tiocset (fd,sg,method)
86 int fd;
87 struct sgttyb *sg;
88 int method;
90 struct termios t;
91 int err;
92 int i;
93 err = ioctl (fd, TCGETS, &t);
94 if (err < 0) return (err);
96 cfsetispeed (&t, sg->sg_ispeed);
97 cfsetospeed (&t, sg->sg_ospeed);
98 t.c_cc[VERASE] = pchar (sg->sg_erase);
99 t.c_cc[VKILL] = pchar (sg->sg_kill);
100 for (i = sizeof (trans) / sizeof (struct sf) - 1; i >= 0; i--)
102 t.c_iflag &= ~trans[i].iflag.mask;
103 t.c_oflag &= ~trans[i].oflag.mask;
104 t.c_cflag &= ~trans[i].cflag.mask;
105 t.c_lflag &= ~trans[i].lflag.mask;
106 if (sg->sg_flags & (1 << i))
108 t.c_iflag |= trans[i].iflag.res;
109 t.c_oflag |= trans[i].oflag.res;
110 t.c_cflag |= trans[i].cflag.res;
111 t.c_lflag |= trans[i].lflag.res;
113 else
115 t.c_iflag |= (~trans[i].iflag.res) & trans[i].iflag.mask;
116 t.c_oflag |= (~trans[i].oflag.res) & trans[i].oflag.mask;
117 t.c_cflag |= (~trans[i].cflag.res) & trans[i].cflag.mask;
118 t.c_lflag |= (~trans[i].lflag.res) & trans[i].lflag.mask;
121 return (ioctl (fd, method, &t));
124 int
125 stty (fd,sg)
126 int fd;
127 struct sgttyb *sg;
129 return tiocset (fd, sg, TCSETSF);
132 static int
133 tiocsetn (fd,sg)
134 int fd;
135 struct sgttyb *sg;
137 return tiocset (fd, sg, TCSETS);
140 static int
141 tiocgetc (fd,tc)
142 int fd;
143 struct tchars *tc;
145 struct termios t;
146 int err;
147 err = ioctl (fd, TCGETS, &t);
148 if (err < 0) return (err);
149 tc->t_intrc = bchar (t.c_cc[VINTR]);
150 tc->t_quitc = bchar (t.c_cc[VQUIT]);
151 tc->t_eofc = bchar (t.c_cc[VEOF]);
152 tc->t_startc = bchar (t.c_cc[VSTART]);
153 tc->t_stopc = bchar (t.c_cc[VSTOP]);
154 tc->t_brkc = bchar (t.c_cc[VEOL]);
155 return (0);
158 static int
159 tiocsetc (fd,tc)
160 int fd;
161 struct tchars *tc;
163 struct termios t;
164 int err;
165 err = ioctl (fd, TCGETS, &t);
166 if (err < 0) return (err);
167 t.c_cc[VINTR] = pchar (tc->t_intrc);
168 t.c_cc[VQUIT] = pchar (tc->t_quitc);
169 t.c_cc[VEOF] = pchar (tc->t_eofc);
170 t.c_cc[VEOL] = pchar (tc->t_brkc);
171 t.c_cc[VSTART] = pchar (tc->t_startc);
172 t.c_cc[VSTOP] = pchar (tc->t_stopc);
173 return (ioctl (fd, TCSETS, &t));
176 static int
177 tiocgltc (fd,tc)
178 int fd;
179 struct ltchars *tc;
181 struct termios t;
182 int err;
183 err = ioctl (fd, TCGETS, &t);
184 if (err < 0) return (err);
185 tc->t_werasc = bchar (t.c_cc[VWERASE]);
186 tc->t_suspc = bchar (t.c_cc[VSUSP]);
187 tc->t_dsuspc = bchar (t.c_cc[VSUSP]);
188 tc->t_rprntc = bchar (t.c_cc[VREPRINT]);
189 tc->t_flushc = bchar (t.c_cc[VDISCARD]);
190 tc->t_lnextc = bchar (t.c_cc[VLNEXT]);
191 return (0);
194 static int
195 tiocsltc (fd,tc)
196 int fd;
197 struct ltchars *tc;
199 struct termios t;
200 int err;
201 err = ioctl (fd, TCGETS, &t);
202 if (err < 0) return (err);
203 t.c_cc[VWERASE] = pchar (tc->t_werasc);
204 t.c_cc[VSUSP] = pchar (tc->t_suspc);
205 if(t.c_cc[VSUSP] == _POSIX_VDISABLE)
206 t.c_cc[VSUSP] = pchar (tc->t_dsuspc);
207 t.c_cc[VREPRINT] = pchar (tc->t_rprntc);
208 t.c_cc[VDISCARD] = pchar (tc->t_flushc);
209 t.c_cc[VLNEXT] = pchar (tc->t_lnextc);
210 return (ioctl (fd, TCSETS, &t));
213 static int
214 tioclget (fd,lflagsp)
215 int fd;
216 int *lflagsp;
218 struct termios t;
219 int lflags = 0;
221 *lflagsp = lflags;
222 return 0;
225 static int
226 tioclset (fd,lflagsp)
227 int fd;
228 int *lflagsp;
230 return 0;
233 static int
234 tiocflush (fd,arg)
235 int fd;
236 int *arg;
238 return 0;
242 bsd_ioctl (fd,option,arg)
243 int fd;
244 int option;
245 void *arg;
247 switch (option) {
248 case TIOCGETP:
249 return gtty(fd, (struct sgttyb *) arg);
250 case TIOCSETP:
251 return stty(fd, (struct sgttyb *) arg);
252 case TIOCGETC:
253 return tiocgetc(fd, (struct tchars *) arg);
254 case TIOCSETC:
255 return tiocsetc(fd, (struct tchars *) arg);
256 case TIOCGLTC:
257 return tiocgltc(fd, (struct ltchars *) arg);
258 case TIOCSLTC:
259 return tiocsltc(fd, (struct ltchars *) arg);
260 case TIOCLGET:
261 return tioclget(fd, (int *) arg);
262 case TIOCLSET:
263 return tioclset(fd, (int *) arg);
264 case TIOCFLUSH:
265 return tiocflush(fd, (int *) arg);
266 case TIOCSETN:
267 return tiocsetn(fd, (struct sgttyb *) arg);
268 default:
269 return ioctl(fd, option, arg);