Commit | Line | Data |
---|---|---|
7c1f1e23 | 1 | /*- |
f1fd7d4e MK |
2 | * Copyright (c) 1989 The Regents of the University of California. |
3 | * All rights reserved. | |
4 | * | |
7c1f1e23 | 5 | * %sccs.include.redist.c% |
f1fd7d4e MK |
6 | */ |
7 | ||
8 | #if defined(LIBC_SCCS) && !defined(lint) | |
f2f3c44b | 9 | static char sccsid[] = "@(#)termios.c 5.13 (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 | 24 | int |
816ee792 MT |
25 | tcgetattr(fd, t) |
26 | int fd; | |
27 | struct termios *t; | |
28 | { | |
816ee792 | 29 | |
d365c391 | 30 | return (ioctl(fd, TIOCGETA, t)); |
816ee792 MT |
31 | } |
32 | ||
c5980113 | 33 | int |
816ee792 MT |
34 | tcsetattr(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 |
58 | int |
59 | #if __STDC__ | |
60 | tcsetpgrp(int fd, pid_t pgrp) | |
61 | #else | |
816ee792 | 62 | tcsetpgrp(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 | 73 | pid_t |
816ee792 MT |
74 | tcgetpgrp(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 | 84 | speed_t |
816ee792 | 85 | cfgetospeed(t) |
c5980113 | 86 | const struct termios *t; |
816ee792 | 87 | { |
f18741dc | 88 | |
d365c391 | 89 | return (t->c_ospeed); |
816ee792 MT |
90 | } |
91 | ||
c5980113 | 92 | speed_t |
816ee792 | 93 | cfgetispeed(t) |
c5980113 | 94 | const struct termios *t; |
816ee792 | 95 | { |
f18741dc | 96 | |
d365c391 | 97 | return (t->c_ispeed); |
816ee792 MT |
98 | } |
99 | ||
c5980113 | 100 | int |
816ee792 MT |
101 | cfsetospeed(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 | 110 | int |
816ee792 MT |
111 | cfsetispeed(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 | 120 | int |
816ee792 MT |
121 | cfsetspeed(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 | 134 | void |
816ee792 MT |
135 | cfmakeraw(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 | |
147 | tcsendbreak(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 | ||
162 | tcdrain(fd) | |
163 | int fd; | |
164 | { | |
5b193b6f MK |
165 | |
166 | return (ioctl(fd, TIOCDRAIN, 0)); | |
f18741dc MT |
167 | } |
168 | ||
169 | tcflush(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 | ||
191 | tcflow(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 | } |