| /* Copyright (C) 1992-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <termios.h> |
| #include <errno.h> |
| #include <stddef.h> |
| |
| struct speed_struct |
| { |
| speed_t value; |
| speed_t internal; |
| }; |
| |
| static const struct speed_struct speeds[] = |
| { |
| #ifdef B0 |
| { 0, B0 }, |
| #endif |
| #ifdef B50 |
| { 50, B50 }, |
| #endif |
| #ifdef B75 |
| { 75, B75 }, |
| #endif |
| #ifdef B110 |
| { 110, B110 }, |
| #endif |
| #ifdef B134 |
| { 134, B134 }, |
| #endif |
| #ifdef B150 |
| { 150, B150 }, |
| #endif |
| #ifdef B200 |
| { 200, B200 }, |
| #endif |
| #ifdef B300 |
| { 300, B300 }, |
| #endif |
| #ifdef B600 |
| { 600, B600 }, |
| #endif |
| #ifdef B1200 |
| { 1200, B1200 }, |
| #endif |
| #ifdef B1200 |
| { 1200, B1200 }, |
| #endif |
| #ifdef B1800 |
| { 1800, B1800 }, |
| #endif |
| #ifdef B2400 |
| { 2400, B2400 }, |
| #endif |
| #ifdef B4800 |
| { 4800, B4800 }, |
| #endif |
| #ifdef B9600 |
| { 9600, B9600 }, |
| #endif |
| #ifdef B19200 |
| { 19200, B19200 }, |
| #endif |
| #ifdef B38400 |
| { 38400, B38400 }, |
| #endif |
| #ifdef B57600 |
| { 57600, B57600 }, |
| #endif |
| #ifdef B76800 |
| { 76800, B76800 }, |
| #endif |
| #ifdef B115200 |
| { 115200, B115200 }, |
| #endif |
| #ifdef B153600 |
| { 153600, B153600 }, |
| #endif |
| #ifdef B230400 |
| { 230400, B230400 }, |
| #endif |
| #ifdef B307200 |
| { 307200, B307200 }, |
| #endif |
| #ifdef B460800 |
| { 460800, B460800 }, |
| #endif |
| #ifdef B500000 |
| { 500000, B500000 }, |
| #endif |
| #ifdef B576000 |
| { 576000, B576000 }, |
| #endif |
| #ifdef B921600 |
| { 921600, B921600 }, |
| #endif |
| #ifdef B1000000 |
| { 1000000, B1000000 }, |
| #endif |
| #ifdef B1152000 |
| { 1152000, B1152000 }, |
| #endif |
| #ifdef B1500000 |
| { 1500000, B1500000 }, |
| #endif |
| #ifdef B2000000 |
| { 2000000, B2000000 }, |
| #endif |
| #ifdef B2500000 |
| { 2500000, B2500000 }, |
| #endif |
| #ifdef B3000000 |
| { 3000000, B3000000 }, |
| #endif |
| #ifdef B3500000 |
| { 3500000, B3500000 }, |
| #endif |
| #ifdef B4000000 |
| { 4000000, B4000000 }, |
| #endif |
| }; |
| |
| |
| /* Set both the input and output baud rates stored in *TERMIOS_P to SPEED. */ |
| int |
| cfsetspeed (struct termios *termios_p, speed_t speed) |
| { |
| size_t cnt; |
| |
| for (cnt = 0; cnt < sizeof (speeds) / sizeof (speeds[0]); ++cnt) |
| if (speed == speeds[cnt].internal) |
| { |
| cfsetispeed (termios_p, speed); |
| cfsetospeed (termios_p, speed); |
| return 0; |
| } |
| else if (speed == speeds[cnt].value) |
| { |
| cfsetispeed (termios_p, speeds[cnt].internal); |
| cfsetospeed (termios_p, speeds[cnt].internal); |
| return 0; |
| } |
| |
| __set_errno (EINVAL); |
| |
| return -1; |
| } |