1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1988 AT&T */
28 /* All Rights Reserved */
29
30 /* Copyright 2019, Joyent, Inc. */
31
32 #pragma weak _cfsetispeed = cfsetispeed
33 #pragma weak _cfsetospeed = cfsetospeed
34 #pragma weak _cfgetospeed = cfgetospeed
35 #pragma weak _cfgetispeed = cfgetispeed
36
37 #include <sys/types.h>
38 #include <sys/termios.h>
39
40 /*
41 * returns input baud rate stored in c_cflag pointed by termios_p
42 */
43
44 speed_t
45 cfgetispeed(const struct termios *termios_p)
46 {
47 return (termios_p->c_cflag & CIBAUDEXT ?
48 ((termios_p->c_cflag & CIBAUD) >> 16) + (CIBAUD >> 16) + 1 :
49 (termios_p->c_cflag & CIBAUD) >> 16);
50 }
51
52 /*
53 * returns output baud rate stored in c_cflag pointed by termios_p
54 */
55
56 speed_t
57 cfgetospeed(const struct termios *termios_p)
58 {
59 return (termios_p->c_cflag & CBAUDEXT ?
60 (termios_p->c_cflag & CBAUD) + CBAUD + 1 :
61 termios_p->c_cflag & CBAUD);
62 }
63
64 /*
65 * sets the input baud rate stored in c_cflag to speed
66 */
67
68 int
69 cfsetispeed(struct termios *termios_p, speed_t speed)
70 {
71 /*
72 * If the input speed is zero, set it to output speed
73 */
74 if (speed == 0) {
75 speed = termios_p->c_cflag & CBAUD;
76 if (termios_p->c_cflag & CBAUDEXT)
77 speed += (CBAUD + 1);
78 }
79
80 if ((speed << 16) > CIBAUD) {
81 termios_p->c_cflag |= CIBAUDEXT;
82 speed -= ((CIBAUD >> 16) + 1);
83 } else
84 termios_p->c_cflag &= ~CIBAUDEXT;
85 termios_p->c_cflag =
86 (termios_p->c_cflag & ~CIBAUD) | ((speed << 16) & CIBAUD);
87 return (0);
88 }
89
90 /*
91 * sets the output baud rate stored in c_cflag to speed
92 */
93
94 int
95 cfsetospeed(struct termios *termios_p, speed_t speed)
96 {
97 if (speed > CBAUD) {
98 termios_p->c_cflag |= CBAUDEXT;
99 speed -= (CBAUD + 1);
100 } else
101 termios_p->c_cflag &= ~CBAUDEXT;
102
103 termios_p->c_cflag =
104 (termios_p->c_cflag & ~CBAUD) | (speed & CBAUD);
105 return (0);
106 }
107
108 int
109 cfsetspeed(struct termios *termios_p, speed_t speed)
110 {
111 (void) cfsetispeed(termios_p, speed);
112 (void) cfsetospeed(termios_p, speed);
113 }