xref: /csrg-svn/lib/libc/gen/termios.c (revision 66206)
144301Smarc /*-
261111Sbostic  * Copyright (c) 1989, 1993
361111Sbostic  *	The Regents of the University of California.  All rights reserved.
438597Skarels  *
544301Smarc  * %sccs.include.redist.c%
638597Skarels  */
738597Skarels 
838597Skarels #if defined(LIBC_SCCS) && !defined(lint)
9*66206Sbostic static char sccsid[] = "@(#)termios.c	8.2 (Berkeley) 02/21/94";
1038597Skarels #endif /* LIBC_SCCS and not lint */
1138597Skarels 
1235766Smarc #include <sys/types.h>
1344301Smarc #include <sys/ioctl.h>
1444301Smarc #include <sys/tty.h>
15*66206Sbostic #include <sys/time.h>
1652295Sbostic #define KERNEL			/* XXX - FREAD and FWRITE ifdef'd KERNEL*/
1747868Smarc #include <sys/fcntl.h>
1847868Smarc #undef KERNEL
1956412Sbostic 
2056412Sbostic #include <errno.h>
2156412Sbostic #include <stdio.h>
2246597Sdonn #include <termios.h>
2346597Sdonn #include <unistd.h>
2435766Smarc 
2546597Sdonn int
tcgetattr(fd,t)2635766Smarc tcgetattr(fd, t)
2735766Smarc 	int fd;
2835766Smarc 	struct termios *t;
2935766Smarc {
3035766Smarc 
3152295Sbostic 	return (ioctl(fd, TIOCGETA, t));
3235766Smarc }
3335766Smarc 
3446597Sdonn int
tcsetattr(fd,opt,t)3535766Smarc tcsetattr(fd, opt, t)
3635766Smarc 	int fd, opt;
3746597Sdonn 	const struct termios *t;
3835766Smarc {
3944301Smarc 	struct termios localterm;
4035766Smarc 
4144301Smarc 	if (opt & TCSASOFT) {
4244301Smarc 		localterm = *t;
4344301Smarc 		localterm.c_cflag |= CIGNORE;
4444301Smarc 		t = &localterm;
4535766Smarc 	}
4652489Skarels 	switch (opt & ~TCSASOFT) {
4752295Sbostic 	case TCSANOW:
4844301Smarc 		return (ioctl(fd, TIOCSETA, t));
4952295Sbostic 	case TCSADRAIN:
5044301Smarc 		return (ioctl(fd, TIOCSETAW, t));
5152489Skarels 	case TCSAFLUSH:
5252295Sbostic 		return (ioctl(fd, TIOCSETAF, t));
5352295Sbostic 	default:
5452295Sbostic 		errno = EINVAL;
5552295Sbostic 		return (-1);
5652295Sbostic 	}
5735766Smarc }
5835766Smarc 
5946597Sdonn int
6046597Sdonn #if __STDC__
tcsetpgrp(int fd,pid_t pgrp)6146597Sdonn tcsetpgrp(int fd, pid_t pgrp)
6246597Sdonn #else
6335766Smarc tcsetpgrp(fd, pgrp)
6446597Sdonn 	int fd;
6546597Sdonn 	pid_t pgrp;
6646597Sdonn #endif
6735766Smarc {
6849822Sbostic 	int s;
6947868Smarc 
7049822Sbostic 	s = pgrp;
7152295Sbostic 	return (ioctl(fd, TIOCSPGRP, &s));
7235766Smarc }
7335766Smarc 
7446597Sdonn pid_t
tcgetpgrp(fd)7535766Smarc tcgetpgrp(fd)
7635766Smarc {
7747731Sbostic 	int s;
7835766Smarc 
7947731Sbostic 	if (ioctl(fd, TIOCGPGRP, &s) < 0)
8052295Sbostic 		return ((pid_t)-1);
8147868Smarc 
8252295Sbostic 	return ((pid_t)s);
8335766Smarc }
8435766Smarc 
8546597Sdonn speed_t
cfgetospeed(t)8635766Smarc cfgetospeed(t)
8746597Sdonn 	const struct termios *t;
8835766Smarc {
8947868Smarc 
9052295Sbostic 	return (t->c_ospeed);
9135766Smarc }
9235766Smarc 
9346597Sdonn speed_t
cfgetispeed(t)9435766Smarc cfgetispeed(t)
9546597Sdonn 	const struct termios *t;
9635766Smarc {
9747868Smarc 
9852295Sbostic 	return (t->c_ispeed);
9935766Smarc }
10035766Smarc 
10146597Sdonn int
cfsetospeed(t,speed)10235766Smarc cfsetospeed(t, speed)
10335766Smarc 	struct termios *t;
10446597Sdonn 	speed_t speed;
10535766Smarc {
10652492Skarels 
10735766Smarc 	t->c_ospeed = speed;
10847868Smarc 	return (0);
10935766Smarc }
11035766Smarc 
11146597Sdonn int
cfsetispeed(t,speed)11235766Smarc cfsetispeed(t, speed)
11335766Smarc 	struct termios *t;
11446597Sdonn 	speed_t speed;
11535766Smarc {
11652492Skarels 
11735766Smarc 	t->c_ispeed = speed;
11847868Smarc 	return (0);
11935766Smarc }
12035766Smarc 
12152295Sbostic int
cfsetspeed(t,speed)12235766Smarc cfsetspeed(t, speed)
12335766Smarc 	struct termios *t;
12446597Sdonn 	speed_t speed;
12535766Smarc {
12652492Skarels 
12735766Smarc 	t->c_ispeed = t->c_ospeed = speed;
12852295Sbostic 	return (0);
12935766Smarc }
13035766Smarc 
13146248Skarels /*
13252295Sbostic  * Make a pre-existing termios structure into "raw" mode: character-at-a-time
13352295Sbostic  * mode with no characters interpreted, 8-bit data path.
13446248Skarels  */
13546597Sdonn void
cfmakeraw(t)13635766Smarc cfmakeraw(t)
13735766Smarc 	struct termios *t;
13835766Smarc {
13952492Skarels 
14046248Skarels 	t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
14146248Skarels 	t->c_oflag &= ~OPOST;
14238596Skarels 	t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
14346248Skarels 	t->c_cflag &= ~(CSIZE|PARENB);
14446248Skarels 	t->c_cflag |= CS8;
14552295Sbostic 	/* XXX set MIN/TIME */
14635766Smarc }
14747868Smarc 
tcsendbreak(fd,len)14847868Smarc tcsendbreak(fd, len)
14947868Smarc 	int fd, len;
15047868Smarc {
15147868Smarc 	struct timeval sleepytime;
15247868Smarc 
15347868Smarc 	sleepytime.tv_sec = 0;
15447868Smarc 	sleepytime.tv_usec = 400000;
15547868Smarc 	if (ioctl(fd, TIOCSBRK, 0) == -1)
15647868Smarc 		return (-1);
15752295Sbostic 	(void)select(0, 0, 0, 0, &sleepytime);
15847868Smarc 	if (ioctl(fd, TIOCCBRK, 0) == -1)
15947868Smarc 		return (-1);
16047868Smarc 	return (0);
16147868Smarc }
16247868Smarc 
tcdrain(fd)16347868Smarc tcdrain(fd)
16447868Smarc 	int fd;
16547868Smarc {
16652492Skarels 
16752492Skarels 	return (ioctl(fd, TIOCDRAIN, 0));
16847868Smarc }
16947868Smarc 
tcflush(fd,which)17047868Smarc tcflush(fd, which)
17147868Smarc 	int fd, which;
17247868Smarc {
17347868Smarc 	int com;
17447868Smarc 
17547868Smarc 	switch (which) {
17647868Smarc 	case TCIFLUSH:
17747868Smarc 		com = FREAD;
17847868Smarc 		break;
17947868Smarc 	case TCOFLUSH:
18047868Smarc 		com = FWRITE;
18147868Smarc 		break;
18247868Smarc 	case TCIOFLUSH:
18347868Smarc 		com = FREAD | FWRITE;
18447868Smarc 		break;
18547868Smarc 	default:
18647868Smarc 		errno = EINVAL;
18747868Smarc 		return (-1);
18847868Smarc 	}
18952492Skarels 	return (ioctl(fd, TIOCFLUSH, &com));
19047868Smarc }
19147868Smarc 
tcflow(fd,action)19247868Smarc tcflow(fd, action)
19347868Smarc 	int fd, action;
19447868Smarc {
19552295Sbostic 	struct termios term;
19652295Sbostic 	u_char c;
19752295Sbostic 
19847868Smarc 	switch (action) {
19947868Smarc 	case TCOOFF:
20052492Skarels 		return (ioctl(fd, TIOCSTOP, 0));
20147868Smarc 	case TCOON:
20252492Skarels 		return (ioctl(fd, TIOCSTART, 0));
20352295Sbostic 	case TCION:
20447868Smarc 	case TCIOFF:
20548860Smarc 		if (tcgetattr(fd, &term) == -1)
20647868Smarc 			return (-1);
20747868Smarc 		c = term.c_cc[action == TCIOFF ? VSTOP : VSTART];
20852295Sbostic 		if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1)
20947868Smarc 			return (-1);
21052295Sbostic 		return (0);
21147868Smarc 	default:
21247868Smarc 		errno = EINVAL;
21347868Smarc 		return (-1);
21447868Smarc 	}
21552295Sbostic 	/* NOTREACHED */
21647868Smarc }
217