1 /* Copyright (C) 1991, 1993, 1996, 1997, 2002 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, write to the Free
16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26 const speed_t __bsd_speeds[] =
47 /* Set the state of FD to *TERMIOS_P. */
49 tcsetattr (fd, optional_actions, termios_p)
52 const struct termios *termios_p;
56 struct ltchars ltchars;
63 if (__ioctl (fd, TIOCGETP, &buf) < 0 ||
64 __ioctl (fd, TIOCGETC, &tchars) < 0 ||
65 __ioctl (fd, TIOCGLTC, <chars) < 0 ||
67 __ioctl (fd, TIOCGETX, &extra) < 0 ||
69 __ioctl (fd, TIOCLGET, &local) < 0)
72 if (termios_p == NULL)
77 switch (optional_actions)
86 if (tcflush (fd, TCIFLUSH) < 0)
94 buf.sg_ispeed = buf.sg_ospeed = -1;
95 for (i = 0; i <= sizeof (__bsd_speeds) / sizeof (__bsd_speeds[0]); ++i)
97 if (__bsd_speeds[i] == termios_p->__ispeed)
99 if (__bsd_speeds[i] == termios_p->__ospeed)
102 if (buf.sg_ispeed == -1 || buf.sg_ospeed == -1)
104 __set_errno (EINVAL);
108 buf.sg_flags &= ~(CBREAK|RAW);
109 if (!(termios_p->c_lflag & ICANON))
110 buf.sg_flags |= (termios_p->c_cflag & ISIG) ? CBREAK : RAW;
112 if (termios_p->c_oflag & CS8)
117 if (termios_p->c_lflag & _NOFLSH)
121 if (termios_p->c_oflag & OPOST)
126 if (termios_p->c_lflag & ISIG)
130 if (termios_p->c_cflag & CSTOPB)
135 if (termios_p->c_iflag & ICRNL)
136 buf.sg_flags |= CRMOD;
138 buf.sg_flags &= ~CRMOD;
139 if (termios_p->c_iflag & IXOFF)
140 buf.sg_flags |= TANDEM;
142 buf.sg_flags &= ~TANDEM;
144 buf.sg_flags &= ~(ODDP|EVENP);
145 if (!(termios_p->c_cflag & PARENB))
146 buf.sg_flags |= ODDP | EVENP;
147 else if (termios_p->c_cflag & PARODD)
148 buf.sg_flags |= ODDP;
150 buf.sg_flags |= EVENP;
152 if (termios_p->c_lflag & _ECHO)
153 buf.sg_flags |= ECHO;
155 buf.sg_flags &= ~ECHO;
156 if (termios_p->c_lflag & ECHOE)
160 if (termios_p->c_lflag & ECHOK)
164 if (termios_p->c_lflag & _TOSTOP)
169 buf.sg_erase = termios_p->c_cc[VERASE];
170 buf.sg_kill = termios_p->c_cc[VKILL];
171 tchars.t_eofc = termios_p->c_cc[VEOF];
172 tchars.t_intrc = termios_p->c_cc[VINTR];
173 tchars.t_quitc = termios_p->c_cc[VQUIT];
174 ltchars.t_suspc = termios_p->c_cc[VSUSP];
175 tchars.t_startc = termios_p->c_cc[VSTART];
176 tchars.t_stopc = termios_p->c_cc[VSTOP];
178 if (__ioctl (fd, TIOCSETP, &buf) < 0 ||
179 __ioctl (fd, TIOCSETC, &tchars) < 0 ||
180 __ioctl (fd, TIOCSLTC, <chars) < 0 ||
182 __ioctl (fd, TIOCSETX, &extra) < 0 ||
184 __ioctl (fd, TIOCLSET, &local) < 0)
188 libc_hidden_def (tcsetattr)