1 /* sgtty.c - emulate BSD sgtty stuff with termios - ross biro, rick sladkey */
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
46 return c
== _POSIX_VDISABLE
? _BSD_VDISABLE
: c
;
53 return c
== _BSD_VDISABLE
? _POSIX_VDISABLE
: c
;
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
]);
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
;
85 tiocset (fd
,sg
,method
)
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
;
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
));
129 return tiocset (fd
, sg
, TCSETSF
);
137 return tiocset (fd
, sg
, TCSETS
);
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
]);
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
));
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
]);
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
));
214 tioclget (fd
,lflagsp
)
226 tioclset (fd
,lflagsp
)
242 bsd_ioctl (fd
,option
,arg
)
249 return gtty(fd
, (struct sgttyb
*) arg
);
251 return stty(fd
, (struct sgttyb
*) arg
);
253 return tiocgetc(fd
, (struct tchars
*) arg
);
255 return tiocsetc(fd
, (struct tchars
*) arg
);
257 return tiocgltc(fd
, (struct ltchars
*) arg
);
259 return tiocsltc(fd
, (struct ltchars
*) arg
);
261 return tioclget(fd
, (int *) arg
);
263 return tioclset(fd
, (int *) arg
);
265 return tiocflush(fd
, (int *) arg
);
267 return tiocsetn(fd
, (struct sgttyb
*) arg
);
269 return ioctl(fd
, option
, arg
);