4.4BSD snapshot (revision 8.1)
[unix-history] / usr / src / lib / libc / gen / termios.c
CommitLineData
7c1f1e23 1/*-
74155b62
KB
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
f1fd7d4e 4 *
7c1f1e23 5 * %sccs.include.redist.c%
f1fd7d4e
MK
6 */
7
8#if defined(LIBC_SCCS) && !defined(lint)
74155b62 9static char sccsid[] = "@(#)termios.c 8.1 (Berkeley) %G%";
f1fd7d4e
MK
10#endif /* LIBC_SCCS and not lint */
11
816ee792 12#include <sys/types.h>
7c1f1e23 13#include <sys/ioctl.h>
816ee792 14#include <sys/tty.h>
d365c391 15#define KERNEL /* XXX - FREAD and FWRITE ifdef'd KERNEL*/
f18741dc
MT
16#include <sys/fcntl.h>
17#undef KERNEL
f2f3c44b
KB
18
19#include <errno.h>
816ee792 20#include <stdio.h>
f2f3c44b 21#include <termios.h>
c5980113 22#include <unistd.h>
816ee792 23
c5980113 24int
816ee792
MT
25tcgetattr(fd, t)
26 int fd;
27 struct termios *t;
28{
816ee792 29
d365c391 30 return (ioctl(fd, TIOCGETA, t));
816ee792
MT
31}
32
c5980113 33int
816ee792
MT
34tcsetattr(fd, opt, t)
35 int fd, opt;
c5980113 36 const struct termios *t;
816ee792 37{
7c1f1e23 38 struct termios localterm;
816ee792 39
7c1f1e23
MT
40 if (opt & TCSASOFT) {
41 localterm = *t;
42 localterm.c_cflag |= CIGNORE;
43 t = &localterm;
816ee792 44 }
1909d51b 45 switch (opt & ~TCSASOFT) {
d365c391 46 case TCSANOW:
7c1f1e23 47 return (ioctl(fd, TIOCSETA, t));
d365c391 48 case TCSADRAIN:
7c1f1e23 49 return (ioctl(fd, TIOCSETAW, t));
1909d51b 50 case TCSAFLUSH:
d365c391
KB
51 return (ioctl(fd, TIOCSETAF, t));
52 default:
53 errno = EINVAL;
54 return (-1);
55 }
816ee792
MT
56}
57
c5980113
DS
58int
59#if __STDC__
60tcsetpgrp(int fd, pid_t pgrp)
61#else
816ee792 62tcsetpgrp(fd, pgrp)
c5980113
DS
63 int fd;
64 pid_t pgrp;
65#endif
816ee792 66{
023abf7f 67 int s;
f18741dc 68
023abf7f 69 s = pgrp;
d365c391 70 return (ioctl(fd, TIOCSPGRP, &s));
816ee792
MT
71}
72
c5980113 73pid_t
816ee792
MT
74tcgetpgrp(fd)
75{
7dbb5ba6 76 int s;
816ee792 77
7dbb5ba6 78 if (ioctl(fd, TIOCGPGRP, &s) < 0)
d365c391 79 return ((pid_t)-1);
f18741dc 80
d365c391 81 return ((pid_t)s);
816ee792
MT
82}
83
c5980113 84speed_t
816ee792 85cfgetospeed(t)
c5980113 86 const struct termios *t;
816ee792 87{
f18741dc 88
d365c391 89 return (t->c_ospeed);
816ee792
MT
90}
91
c5980113 92speed_t
816ee792 93cfgetispeed(t)
c5980113 94 const struct termios *t;
816ee792 95{
f18741dc 96
d365c391 97 return (t->c_ispeed);
816ee792
MT
98}
99
c5980113 100int
816ee792
MT
101cfsetospeed(t, speed)
102 struct termios *t;
c5980113 103 speed_t speed;
816ee792 104{
5b193b6f 105
816ee792 106 t->c_ospeed = speed;
f18741dc 107 return (0);
816ee792
MT
108}
109
c5980113 110int
816ee792
MT
111cfsetispeed(t, speed)
112 struct termios *t;
c5980113 113 speed_t speed;
816ee792 114{
5b193b6f 115
816ee792 116 t->c_ispeed = speed;
f18741dc 117 return (0);
816ee792
MT
118}
119
d365c391 120int
816ee792
MT
121cfsetspeed(t, speed)
122 struct termios *t;
c5980113 123 speed_t speed;
816ee792 124{
5b193b6f 125
816ee792 126 t->c_ispeed = t->c_ospeed = speed;
d365c391 127 return (0);
816ee792
MT
128}
129
5f7a2531 130/*
d365c391
KB
131 * Make a pre-existing termios structure into "raw" mode: character-at-a-time
132 * mode with no characters interpreted, 8-bit data path.
5f7a2531 133 */
c5980113 134void
816ee792
MT
135cfmakeraw(t)
136 struct termios *t;
137{
5b193b6f 138
5f7a2531
MK
139 t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
140 t->c_oflag &= ~OPOST;
9de4492f 141 t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
5f7a2531
MK
142 t->c_cflag &= ~(CSIZE|PARENB);
143 t->c_cflag |= CS8;
d365c391 144 /* XXX set MIN/TIME */
816ee792 145}
f18741dc
MT
146
147tcsendbreak(fd, len)
148 int fd, len;
149{
150 struct timeval sleepytime;
151
152 sleepytime.tv_sec = 0;
153 sleepytime.tv_usec = 400000;
154 if (ioctl(fd, TIOCSBRK, 0) == -1)
155 return (-1);
d365c391 156 (void)select(0, 0, 0, 0, &sleepytime);
f18741dc
MT
157 if (ioctl(fd, TIOCCBRK, 0) == -1)
158 return (-1);
f18741dc
MT
159 return (0);
160}
161
162tcdrain(fd)
163 int fd;
164{
5b193b6f
MK
165
166 return (ioctl(fd, TIOCDRAIN, 0));
f18741dc
MT
167}
168
169tcflush(fd, which)
170 int fd, which;
171{
172 int com;
173
174 switch (which) {
175 case TCIFLUSH:
176 com = FREAD;
177 break;
178 case TCOFLUSH:
179 com = FWRITE;
180 break;
181 case TCIOFLUSH:
182 com = FREAD | FWRITE;
183 break;
184 default:
185 errno = EINVAL;
186 return (-1);
187 }
5b193b6f 188 return (ioctl(fd, TIOCFLUSH, &com));
f18741dc
MT
189}
190
191tcflow(fd, action)
192 int fd, action;
193{
d365c391
KB
194 struct termios term;
195 u_char c;
196
f18741dc
MT
197 switch (action) {
198 case TCOOFF:
5b193b6f 199 return (ioctl(fd, TIOCSTOP, 0));
f18741dc 200 case TCOON:
5b193b6f 201 return (ioctl(fd, TIOCSTART, 0));
d365c391 202 case TCION:
f18741dc 203 case TCIOFF:
e800a1f5 204 if (tcgetattr(fd, &term) == -1)
f18741dc
MT
205 return (-1);
206 c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
d365c391 207 if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1)
f18741dc 208 return (-1);
d365c391 209 return (0);
f18741dc
MT
210 default:
211 errno = EINVAL;
212 return (-1);
213 }
d365c391 214 /* NOTREACHED */
f18741dc 215}