xref: /csrg-svn/lib/libc/gen/termios.c (revision 47868)
144301Smarc /*-
238597Skarels  * Copyright (c) 1989 The Regents of the University of California.
338597Skarels  * All rights reserved.
438597Skarels  *
544301Smarc  * %sccs.include.redist.c%
638597Skarels  */
738597Skarels 
838597Skarels #if defined(LIBC_SCCS) && !defined(lint)
9*47868Smarc static char sccsid[] = "@(#)termios.c	5.6 (Berkeley) 04/09/91";
1038597Skarels #endif /* LIBC_SCCS and not lint */
1138597Skarels 
1235766Smarc #include <sys/types.h>
1335766Smarc #include <sys/errno.h>
1444301Smarc #include <sys/ioctl.h>
1544301Smarc #include <sys/tty.h>
16*47868Smarc #define KERNEL	/* XXX - FREAD and FWRITE was ifdef'd KERNEL*/
17*47868Smarc #include <sys/fcntl.h>
18*47868Smarc #undef KERNEL
1946597Sdonn #include <termios.h>
2035766Smarc #include <stdio.h>
2146597Sdonn #include <unistd.h>
2235766Smarc 
2346597Sdonn int
2435766Smarc tcgetattr(fd, t)
2535766Smarc 	int fd;
2635766Smarc 	struct termios *t;
2735766Smarc {
2835766Smarc 
2935766Smarc 	return(ioctl(fd, TIOCGETA, t));
3035766Smarc }
3135766Smarc 
3246597Sdonn int
3335766Smarc tcsetattr(fd, opt, t)
3435766Smarc 	int fd, opt;
3546597Sdonn 	const struct termios *t;
3635766Smarc {
3744301Smarc 	struct termios localterm;
3835766Smarc 
3944301Smarc 	if (opt & TCSASOFT) {
4044301Smarc 		localterm = *t;
4144301Smarc 		localterm.c_cflag |= CIGNORE;
4244301Smarc 		t = &localterm;
4344301Smarc 		opt &= TCSASOFT;
4435766Smarc 	}
4544301Smarc 	if (opt == TCSANOW)
4644301Smarc 		return (ioctl(fd, TIOCSETA, t));
4744301Smarc 	else if (opt == TCSADRAIN)
4844301Smarc 		return (ioctl(fd, TIOCSETAW, t));
4946597Sdonn 	return (ioctl(fd, TIOCSETAF, t));
5035766Smarc }
5135766Smarc 
5246597Sdonn int
5346597Sdonn #if __STDC__
5446597Sdonn tcsetpgrp(int fd, pid_t pgrp)
5546597Sdonn #else
5635766Smarc tcsetpgrp(fd, pgrp)
5746597Sdonn 	int fd;
5846597Sdonn 	pid_t pgrp;
5946597Sdonn #endif
6035766Smarc {
61*47868Smarc 
6235766Smarc 	return(ioctl(fd, TIOCSPGRP, &pgrp));
6335766Smarc }
6435766Smarc 
6546597Sdonn pid_t
6635766Smarc tcgetpgrp(fd)
6735766Smarc {
6847731Sbostic 	int s;
6935766Smarc 
7047731Sbostic 	if (ioctl(fd, TIOCGPGRP, &s) < 0)
7147731Sbostic 		return((pid_t)-1);
72*47868Smarc 
7347731Sbostic 	return((pid_t)s);
7435766Smarc }
7535766Smarc 
7646597Sdonn speed_t
7735766Smarc cfgetospeed(t)
7846597Sdonn 	const struct termios *t;
7935766Smarc {
80*47868Smarc 
8135766Smarc 	return(t->c_ospeed);
8235766Smarc }
8335766Smarc 
8446597Sdonn speed_t
8535766Smarc cfgetispeed(t)
8646597Sdonn 	const struct termios *t;
8735766Smarc {
88*47868Smarc 
8935766Smarc 	return(t->c_ispeed);
9035766Smarc }
9135766Smarc 
9246597Sdonn int
9335766Smarc cfsetospeed(t, speed)
9435766Smarc 	struct termios *t;
9546597Sdonn 	speed_t speed;
9635766Smarc {
9735766Smarc 	t->c_ospeed = speed;
98*47868Smarc 
99*47868Smarc 	return (0);
10035766Smarc }
10135766Smarc 
10246597Sdonn int
10335766Smarc cfsetispeed(t, speed)
10435766Smarc 	struct termios *t;
10546597Sdonn 	speed_t speed;
10635766Smarc {
10735766Smarc 	t->c_ispeed = speed;
108*47868Smarc 
109*47868Smarc 	return (0);
11035766Smarc }
11135766Smarc 
11246597Sdonn void
11335766Smarc cfsetspeed(t, speed)
11435766Smarc 	struct termios *t;
11546597Sdonn 	speed_t speed;
11635766Smarc {
11735766Smarc 	t->c_ispeed = t->c_ospeed = speed;
118*47868Smarc 
119*47868Smarc 	return (0)
12035766Smarc }
12135766Smarc 
12246248Skarels /*
12346248Skarels  * Make a pre-existing termios structure into "raw" mode:
12446248Skarels  * character-at-a-time mode with no characters interpreted,
12546248Skarels  * 8-bit data path.
12646248Skarels  */
12746597Sdonn void
12835766Smarc cfmakeraw(t)
12935766Smarc 	struct termios *t;
13035766Smarc {
13146248Skarels 	t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
13246248Skarels 	t->c_oflag &= ~OPOST;
13338596Skarels 	t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
13446248Skarels 	t->c_cflag &= ~(CSIZE|PARENB);
13546248Skarels 	t->c_cflag |= CS8;
13635766Smarc 	/* set MIN/TIME */
13735766Smarc }
138*47868Smarc 
139*47868Smarc tcsendbreak(fd, len)
140*47868Smarc 	int fd, len;
141*47868Smarc {
142*47868Smarc 	struct timeval sleepytime;
143*47868Smarc 
144*47868Smarc 	sleepytime.tv_sec = 0;
145*47868Smarc 	sleepytime.tv_usec = 400000;
146*47868Smarc 	if (ioctl(fd, TIOCSBRK, 0) == -1)
147*47868Smarc 		return (-1);
148*47868Smarc 	select(0, 0, 0, 0, &sleepytime);
149*47868Smarc 	if (ioctl(fd, TIOCCBRK, 0) == -1)
150*47868Smarc 		return (-1);
151*47868Smarc 
152*47868Smarc 	return (0);
153*47868Smarc }
154*47868Smarc 
155*47868Smarc tcdrain(fd)
156*47868Smarc 	int fd;
157*47868Smarc {
158*47868Smarc 	if (ioctl(fd, TIOCDRAIN, 0) == -1)
159*47868Smarc 		return (-1);
160*47868Smarc 
161*47868Smarc 	return (0);
162*47868Smarc }
163*47868Smarc 
164*47868Smarc tcflush(fd, which)
165*47868Smarc 	int fd, which;
166*47868Smarc {
167*47868Smarc 	int com;
168*47868Smarc 
169*47868Smarc 	switch (which) {
170*47868Smarc 	case TCIFLUSH:
171*47868Smarc 		com = FREAD;
172*47868Smarc 		break;
173*47868Smarc 	case TCOFLUSH:
174*47868Smarc 		com = FWRITE;
175*47868Smarc 		break;
176*47868Smarc 	case TCIOFLUSH:
177*47868Smarc 		com = FREAD | FWRITE;
178*47868Smarc 		break;
179*47868Smarc 	default:
180*47868Smarc 		errno = EINVAL;
181*47868Smarc 		return (-1);
182*47868Smarc 	}
183*47868Smarc 	if (ioctl(fd, TIOCFLUSH, &com) == -1)
184*47868Smarc 		return (-1);
185*47868Smarc 
186*47868Smarc 	return (0);
187*47868Smarc }
188*47868Smarc 
189*47868Smarc tcflow(fd, action)
190*47868Smarc 	int fd, action;
191*47868Smarc {
192*47868Smarc 	switch (action) {
193*47868Smarc 	case TCOOFF:
194*47868Smarc 		return (ioctl(fd, TIOCSTOP, 0));
195*47868Smarc 		break;
196*47868Smarc 	case TCOON:
197*47868Smarc 		return (ioctl(fd, TIOCSTART, 0));
198*47868Smarc 		break;
199*47868Smarc 	case TCIOFF:
200*47868Smarc 	case TCION: {		/* these posix functions are STUPID */
201*47868Smarc 		struct termios term;
202*47868Smarc 		char c;
203*47868Smarc 
204*47868Smarc 		if (tcgetattr(fd, &term) == -1);
205*47868Smarc 			return (-1);
206*47868Smarc 		c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
207*47868Smarc 		if (c != _POSIX_VDISABLE && write(fd, &c, 1) == -1)
208*47868Smarc 			return (-1);
209*47868Smarc 		break;
210*47868Smarc 	}
211*47868Smarc 	default:
212*47868Smarc 		errno = EINVAL;
213*47868Smarc 		return (-1);
214*47868Smarc 	}
215*47868Smarc 
216*47868Smarc 	return (0);
217*47868Smarc }
218