Generic tcsetattr.c.
[kopensolaris-gnu/glibc.git] / termios / tcsetattr.c
1 /* Copyright (C) 1991,95,96,2000,01,02 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 <termios.h>
22
23 static int bad_speed (speed_t speed);
24
25 /* Set the state of FD to *TERMIOS_P.  */
26 int
27 tcsetattr (int fd, int optional_actions, const struct termios *termios_p)
28 {
29   if (fd < 0)
30     {
31       __set_errno (EBADF);
32       return -1;
33     }
34   if (termios_p == NULL)
35     {
36       __set_errno (EINVAL);
37       return -1;
38     }
39   switch (optional_actions)
40     {
41     case TCSANOW:
42     case TCSADRAIN:
43     case TCSAFLUSH:
44       break;
45     default:
46       __set_errno (EINVAL);
47       return -1;
48     }
49
50   if (bad_speed(termios_p->__ospeed) ||
51       bad_speed(termios_p->__ispeed == 0 ?
52                 termios_p->__ospeed : termios_p->__ispeed))
53     {
54       __set_errno (EINVAL);
55       return -1;
56     }
57
58   __set_errno (ENOSYS);
59   return -1;
60 }
61 libc_hidden_def (tcsetattr)
62
63 /* Strychnine checking.  */
64 static int
65 bad_speed (speed_t speed)
66 {
67   switch (speed)
68     {
69     case B0:
70     case B50:
71     case B75:
72     case B110:
73     case B134:
74     case B150:
75     case B200:
76     case B300:
77     case B600:
78     case B1200:
79     case B1800:
80     case B2400:
81     case B4800:
82     case B9600:
83     case B19200:
84     case B38400:
85     case B57600:
86     case B115200:
87     case B230400:
88     case B460800:
89     case B500000:
90     case B576000:
91     case B921600:
92     case B1000000:
93     case B1152000:
94     case B1500000:
95     case B2000000:
96     case B2500000:
97     case B3000000:
98     case B3500000:
99     case B4000000:
100       return 0;
101     default:
102       return 1;
103     }
104 }
105
106
107 stub_warning (tcsetattr)
108 #include <stub-tag.h>