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

source code of glibc/termios/tcsetattr.c