(cfsetispeed): Make a real function. Don't set speed is SPEED
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / linux / speed.c
1 /* `struct termios' speed frobnication functions.  Linux version.
2    Copyright (C) 1991, 92, 93, 95, 96, 97, 98 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public
16    License along with the GNU C Library; see the file COPYING.LIB.  If not,
17    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18    Boston, MA 02111-1307, USA.  */
19
20 #include <stddef.h>
21 #include <errno.h>
22 #include <termios.h>
23
24
25 /* Return the output baud rate stored in *TERMIOS_P.  */
26 speed_t
27 cfgetospeed (termios_p)
28      const struct termios *termios_p;
29 {
30   return termios_p->c_cflag & (CBAUD | CBAUDEX);
31 }
32
33 /* Return the input baud rate stored in *TERMIOS_P.
34    For Linux there is no difference between input and output speed.  */
35 strong_alias (cfgetospeed, cfgetispeed);
36
37 /* Set the output baud rate stored in *TERMIOS_P to SPEED.  */
38 int
39 cfsetospeed  (termios_p, speed)
40      struct termios *termios_p;
41      speed_t speed;
42 {
43   if ((speed & ~CBAUD) != 0
44       && (speed < B57600 || speed > B460800))
45     {
46       __set_errno (EINVAL);
47       return -1;
48     }
49
50   termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
51   termios_p->c_cflag |= speed;
52
53   return 0;
54 }
55
56 /* Set the input baud rate stored in *TERMIOS_P to SPEED.
57    Although for Linux there is no difference between input and output
58    speed, the numerical 0 is a special case for the input baud rate.  It
59    should set the input baud rate to the output baud rate.  */
60 int
61 cfsetispeed (termios_p, speed)
62      struct termios *termios_p;
63      speed_t speed;
64 {
65   if ((speed & ~CBAUD) != 0
66       && (speed < B57600 || speed > B460800))
67     {
68       __set_errno (EINVAL);
69       return -1;
70     }
71
72   if (speed != 0)
73     {
74       termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
75       termios_p->c_cflag |= speed;
76     }
77
78   return 0;
79 }