Rename *_priv.* to *P.*
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / tcgetattr.c
1 /* Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
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.
8
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.
13
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
17    02111-1307 USA.  */
18
19 #include <errno.h>
20 #include <stddef.h>
21 #include <sysv_termio.h>
22 #include <termios.h>
23 #include <sys/ioctl.h>
24
25 /* Put the state of FD into *TERMIOS_P.  */
26 int
27 __tcgetattr (fd, termios_p)
28      int fd;
29      struct termios *termios_p;
30 {
31   struct __sysv_termio buf;
32   int termio_speed;
33
34   if (termios_p == NULL)
35     {
36       __set_errno (EINVAL);
37       return -1;
38     }
39
40   if (__ioctl (fd, _TCGETA, &buf) < 0)
41     return -1;
42
43   termio_speed = buf.c_cflag & _SYSV_CBAUD;
44   termios_p->__ospeed =
45     (termio_speed == _SYSV_B0 ? 0 :
46      termio_speed == _SYSV_B50 ? 50 :
47      termio_speed == _SYSV_B75 ? 75 :
48      termio_speed == _SYSV_B110 ? 110 :
49      termio_speed == _SYSV_B134 ? 134 :
50      termio_speed == _SYSV_B150 ? 150 :
51      termio_speed == _SYSV_B200 ? 200 :
52      termio_speed == _SYSV_B300 ? 300 :
53      termio_speed == _SYSV_B600 ? 600 :
54      termio_speed == _SYSV_B1200 ? 1200 :
55      termio_speed == _SYSV_B1800 ? 1800 :
56      termio_speed == _SYSV_B2400 ? 2400 :
57      termio_speed == _SYSV_B4800 ? 4800 :
58      termio_speed == _SYSV_B9600 ? 9600 :
59      termio_speed == _SYSV_B19200 ? 19200 :
60      termio_speed == _SYSV_B38400 ? 38400 :
61      -1);
62   termios_p->__ispeed = termios_p->__ospeed;
63
64   termios_p->c_iflag = 0;
65   if (buf.c_iflag & _SYSV_IGNBRK)
66     termios_p->c_iflag |= IGNBRK;
67   if (buf.c_iflag & _SYSV_BRKINT)
68     termios_p->c_iflag |= BRKINT;
69   if (buf.c_iflag & _SYSV_IGNPAR)
70     termios_p->c_iflag |= IGNPAR;
71   if (buf.c_iflag & _SYSV_PARMRK)
72     termios_p->c_iflag |= PARMRK;
73   if (buf.c_iflag & _SYSV_INPCK)
74     termios_p->c_iflag |= INPCK;
75   if (buf.c_iflag & _SYSV_ISTRIP)
76     termios_p->c_iflag |= ISTRIP;
77   if (buf.c_iflag & _SYSV_INLCR)
78     termios_p->c_iflag |= INLCR;
79   if (buf.c_iflag & _SYSV_IGNCR)
80     termios_p->c_iflag |= IGNCR;
81   if (buf.c_iflag & _SYSV_ICRNL)
82     termios_p->c_iflag |= ICRNL;
83   if (buf.c_iflag & _SYSV_IXON)
84     termios_p->c_iflag |= IXON;
85   if (buf.c_iflag & _SYSV_IXOFF)
86     termios_p->c_iflag |= IXOFF;
87   if (buf.c_iflag & _SYSV_IXANY)
88     termios_p->c_iflag |= IXANY;
89   if (buf.c_iflag & _SYSV_IMAXBEL)
90     termios_p->c_iflag |= IMAXBEL;
91
92   termios_p->c_oflag = 0;
93   if (buf.c_oflag & OPOST)
94     termios_p->c_oflag |= OPOST;
95   if (buf.c_oflag & ONLCR)
96     termios_p->c_oflag |= ONLCR;
97   termios_p->c_cflag = 0;
98   switch (buf.c_cflag & _SYSV_CSIZE)
99     {
100     case _SYSV_CS5:
101       termios_p->c_cflag |= CS5;
102       break;
103     case _SYSV_CS6:
104       termios_p->c_cflag |= CS6;
105       break;
106     case _SYSV_CS7:
107       termios_p->c_cflag |= CS7;
108       break;
109     case _SYSV_CS8:
110       termios_p->c_cflag |= CS8;
111       break;
112     }
113   if (buf.c_cflag & _SYSV_CSTOPB)
114     termios_p->c_cflag |= CSTOPB;
115   if (buf.c_cflag & _SYSV_CREAD)
116     termios_p->c_cflag |= CREAD;
117   if (buf.c_cflag & _SYSV_PARENB)
118     termios_p->c_cflag |= PARENB;
119   if (buf.c_cflag & _SYSV_PARODD)
120     termios_p->c_cflag |= PARODD;
121   if (buf.c_cflag & _SYSV_HUPCL)
122     termios_p->c_cflag |= HUPCL;
123   if (buf.c_cflag & _SYSV_CLOCAL)
124     termios_p->c_cflag |= CLOCAL;
125   termios_p->c_lflag = 0;
126   if (buf.c_lflag & _SYSV_ISIG)
127     termios_p->c_lflag |= _ISIG;
128   if (buf.c_lflag & _SYSV_ICANON)
129     termios_p->c_lflag |= _ICANON;
130   if (buf.c_lflag & _SYSV_ECHO)
131     termios_p->c_lflag |= _ECHO;
132   if (buf.c_lflag & _SYSV_ECHOE)
133     termios_p->c_lflag |= _ECHOE;
134   if (buf.c_lflag & _SYSV_ECHOK)
135     termios_p->c_lflag |= _ECHOK;
136   if (buf.c_lflag & _SYSV_ECHONL)
137     termios_p->c_lflag |= _ECHONL;
138   if (buf.c_lflag & _SYSV_NOFLSH)
139     termios_p->c_lflag |= _NOFLSH;
140   if (buf.c_lflag & _SYSV_TOSTOP)
141     termios_p->c_lflag |= _TOSTOP;
142   if (buf.c_lflag & _SYSV_ECHOKE)
143     termios_p->c_lflag |= ECHOKE;
144   if (buf.c_lflag & _SYSV_ECHOPRT)
145     termios_p->c_lflag |= ECHOPRT;
146   if (buf.c_lflag & _SYSV_ECHOCTL)
147     termios_p->c_lflag |= ECHOCTL;
148   if (buf.c_lflag & _SYSV_FLUSHO)
149     termios_p->c_lflag |= FLUSHO;
150   if (buf.c_lflag & _SYSV_PENDIN)
151     termios_p->c_lflag |= PENDIN;
152   if (buf.c_lflag & _SYSV_IEXTEN)
153     termios_p->c_lflag |= IEXTEN;
154
155   termios_p->c_cc[VEOF] = buf.c_cc[_SYSV_VEOF];
156   termios_p->c_cc[VEOL] = buf.c_cc[_SYSV_VEOL];
157   termios_p->c_cc[VEOL2] = buf.c_cc[_SYSV_VEOL2];
158   termios_p->c_cc[VERASE] = buf.c_cc[_SYSV_VERASE];
159   termios_p->c_cc[VKILL] = buf.c_cc[_SYSV_VKILL];
160   termios_p->c_cc[VINTR] = buf.c_cc[_SYSV_VINTR];
161   termios_p->c_cc[VQUIT] = buf.c_cc[_SYSV_VQUIT];
162   termios_p->c_cc[VSTART] = '\021'; /* XON (^Q).  */
163   termios_p->c_cc[VSTOP] = '\023'; /* XOFF (^S).  */
164   termios_p->c_cc[VSUSP] = '\0'; /* System V release 3 lacks job control.  */
165   termios_p->c_cc[VMIN] = buf.c_cc[_SYSV_VMIN];
166   termios_p->c_cc[VTIME] = buf.c_cc[_SYSV_VTIME];
167
168   return 0;
169 }
170
171 weak_alias (__tcgetattr, tcgetattr)