]> git.saurik.com Git - apple/libc.git/blob - gen/termios.c
55ec2ef84c8f3fb5b8193d7edd18356c55c50082
[apple/libc.git] / gen / termios.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25 /*
26 * Copyright (c) 1989, 1993
27 * The Regents of the University of California. All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by the University of
40 * California, Berkeley and its contributors.
41 * 4. Neither the name of the University nor the names of its contributors
42 * may be used to endorse or promote products derived from this software
43 * without specific prior written permission.
44 *
45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE.
56 */
57
58
59 #include <sys/types.h>
60 #include <sys/ioctl.h>
61 #include <sys/tty.h>
62 #include <sys/time.h>
63 #define KERNEL /* XXX - FREAD and FWRITE ifdef'd KERNEL*/
64 #include <sys/fcntl.h>
65 #undef KERNEL
66
67 #include <errno.h>
68 #include <stdio.h>
69 #include <termios.h>
70 #include <unistd.h>
71
72 int
73 tcgetattr(fd, t)
74 int fd;
75 struct termios *t;
76 {
77
78 return (ioctl(fd, TIOCGETA, t));
79 }
80
81 int
82 tcsetattr(fd, opt, t)
83 int fd, opt;
84 const struct termios *t;
85 {
86 struct termios localterm;
87
88 if (opt & TCSASOFT) {
89 localterm = *t;
90 localterm.c_cflag |= CIGNORE;
91 t = &localterm;
92 }
93 switch (opt & ~TCSASOFT) {
94 case TCSANOW:
95 return (ioctl(fd, TIOCSETA, t));
96 case TCSADRAIN:
97 return (ioctl(fd, TIOCSETAW, t));
98 case TCSAFLUSH:
99 return (ioctl(fd, TIOCSETAF, t));
100 default:
101 errno = EINVAL;
102 return (-1);
103 }
104 }
105
106 int
107 #if __STDC__
108 tcsetpgrp(int fd, pid_t pgrp)
109 #else
110 tcsetpgrp(fd, pgrp)
111 int fd;
112 pid_t pgrp;
113 #endif
114 {
115 int s;
116
117 s = pgrp;
118 return (ioctl(fd, TIOCSPGRP, &s));
119 }
120
121 pid_t
122 tcgetpgrp(fd)
123 {
124 int s;
125
126 if (ioctl(fd, TIOCGPGRP, &s) < 0)
127 return ((pid_t)-1);
128
129 return ((pid_t)s);
130 }
131
132 speed_t
133 cfgetospeed(t)
134 const struct termios *t;
135 {
136
137 return (t->c_ospeed);
138 }
139
140 speed_t
141 cfgetispeed(t)
142 const struct termios *t;
143 {
144
145 return (t->c_ispeed);
146 }
147
148 int
149 cfsetospeed(t, speed)
150 struct termios *t;
151 speed_t speed;
152 {
153
154 t->c_ospeed = speed;
155 return (0);
156 }
157
158 int
159 cfsetispeed(t, speed)
160 struct termios *t;
161 speed_t speed;
162 {
163
164 t->c_ispeed = speed;
165 return (0);
166 }
167
168 int
169 cfsetspeed(t, speed)
170 struct termios *t;
171 speed_t speed;
172 {
173
174 t->c_ispeed = t->c_ospeed = speed;
175 return (0);
176 }
177
178 /*
179 * Make a pre-existing termios structure into "raw" mode: character-at-a-time
180 * mode with no characters interpreted, 8-bit data path.
181 */
182 void
183 cfmakeraw(t)
184 struct termios *t;
185 {
186
187 t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
188 t->c_oflag &= ~OPOST;
189 t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
190 t->c_cflag &= ~(CSIZE|PARENB);
191 t->c_cflag |= CS8;
192 /* XXX set MIN/TIME */
193 }
194
195 tcsendbreak(fd, len)
196 int fd, len;
197 {
198 struct timeval sleepytime;
199
200 sleepytime.tv_sec = 0;
201 sleepytime.tv_usec = 400000;
202 if (ioctl(fd, TIOCSBRK, 0) == -1)
203 return (-1);
204 (void)select(0, 0, 0, 0, &sleepytime);
205 if (ioctl(fd, TIOCCBRK, 0) == -1)
206 return (-1);
207 return (0);
208 }
209
210 tcdrain(fd)
211 int fd;
212 {
213
214 return (ioctl(fd, TIOCDRAIN, 0));
215 }
216
217 tcflush(fd, which)
218 int fd, which;
219 {
220 int com;
221
222 switch (which) {
223 case TCIFLUSH:
224 com = FREAD;
225 break;
226 case TCOFLUSH:
227 com = FWRITE;
228 break;
229 case TCIOFLUSH:
230 com = FREAD | FWRITE;
231 break;
232 default:
233 errno = EINVAL;
234 return (-1);
235 }
236 return (ioctl(fd, TIOCFLUSH, &com));
237 }
238
239 tcflow(fd, action)
240 int fd, action;
241 {
242 struct termios term;
243 u_char c;
244
245 switch (action) {
246 case TCOOFF:
247 return (ioctl(fd, TIOCSTOP, 0));
248 case TCOON:
249 return (ioctl(fd, TIOCSTART, 0));
250 case TCION:
251 case TCIOFF:
252 if (tcgetattr(fd, &term) == -1)
253 return (-1);
254 c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
255 if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1)
256 return (-1);
257 return (0);
258 default:
259 errno = EINVAL;
260 return (-1);
261 }
262 /* NOTREACHED */
263 }