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 22 static int bad_speed (speed_t speed); 23 24 /* Set the state of FD to *TERMIOS_P. */ 25 int tcsetattr(int fd,int optional_actions,const struct termios * termios_p)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(termios_p->__ospeed) 50 || bad_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 } libc_hidden_def(tcsetattr)60libc_hidden_def (tcsetattr) 61 62 /* Strychnine checking. */ 63 static int 64 bad_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 106 stub_warning (tcsetattr) 107