]> git.saurik.com Git - apple/libc.git/blame - gen/termios.c
Libc-262.3.2.tar.gz
[apple/libc.git] / gen / termios.c
CommitLineData
e9ce8d39
A
1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
734aad71 6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
e9ce8d39 7 *
734aad71
A
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
e9ce8d39
A
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
734aad71
A
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.
e9ce8d39
A
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
72int
73tcgetattr(fd, t)
74 int fd;
75 struct termios *t;
76{
77
78 return (ioctl(fd, TIOCGETA, t));
79}
80
81int
82tcsetattr(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
106int
107#if __STDC__
108tcsetpgrp(int fd, pid_t pgrp)
109#else
110tcsetpgrp(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
121pid_t
122tcgetpgrp(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
132speed_t
133cfgetospeed(t)
134 const struct termios *t;
135{
136
137 return (t->c_ospeed);
138}
139
140speed_t
141cfgetispeed(t)
142 const struct termios *t;
143{
144
145 return (t->c_ispeed);
146}
147
148int
149cfsetospeed(t, speed)
150 struct termios *t;
151 speed_t speed;
152{
153
154 t->c_ospeed = speed;
155 return (0);
156}
157
158int
159cfsetispeed(t, speed)
160 struct termios *t;
161 speed_t speed;
162{
163
164 t->c_ispeed = speed;
165 return (0);
166}
167
168int
169cfsetspeed(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 */
182void
183cfmakeraw(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
195tcsendbreak(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
210tcdrain(fd)
211 int fd;
212{
213
214 return (ioctl(fd, TIOCDRAIN, 0));
215}
216
217tcflush(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
239tcflow(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}