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