xref: /csrg-svn/lib/libc/gen/termios.c (revision 47731)
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*47731Sbostic static char sccsid[] = "@(#)termios.c	5.5 (Berkeley) 04/02/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>
1646597Sdonn #include <termios.h>
1735766Smarc #include <stdio.h>
1846597Sdonn #include <unistd.h>
1935766Smarc 
2046597Sdonn int
2135766Smarc tcgetattr(fd, t)
2235766Smarc 	int fd;
2335766Smarc 	struct termios *t;
2435766Smarc {
2535766Smarc 
2635766Smarc 	return(ioctl(fd, TIOCGETA, t));
2735766Smarc }
2835766Smarc 
2946597Sdonn int
3035766Smarc tcsetattr(fd, opt, t)
3135766Smarc 	int fd, opt;
3246597Sdonn 	const struct termios *t;
3335766Smarc {
3444301Smarc 	struct termios localterm;
3535766Smarc 
3644301Smarc 	if (opt & TCSASOFT) {
3744301Smarc 		localterm = *t;
3844301Smarc 		localterm.c_cflag |= CIGNORE;
3944301Smarc 		t = &localterm;
4044301Smarc 		opt &= TCSASOFT;
4135766Smarc 	}
4244301Smarc 	if (opt == TCSANOW)
4344301Smarc 		return (ioctl(fd, TIOCSETA, t));
4444301Smarc 	else if (opt == TCSADRAIN)
4544301Smarc 		return (ioctl(fd, TIOCSETAW, t));
4646597Sdonn 	return (ioctl(fd, TIOCSETAF, t));
4735766Smarc }
4835766Smarc 
4946597Sdonn int
5046597Sdonn #if __STDC__
5146597Sdonn tcsetpgrp(int fd, pid_t pgrp)
5246597Sdonn #else
5335766Smarc tcsetpgrp(fd, pgrp)
5446597Sdonn 	int fd;
5546597Sdonn 	pid_t pgrp;
5646597Sdonn #endif
5735766Smarc {
5835766Smarc 	return(ioctl(fd, TIOCSPGRP, &pgrp));
5935766Smarc }
6035766Smarc 
6146597Sdonn pid_t
6235766Smarc tcgetpgrp(fd)
6335766Smarc {
64*47731Sbostic 	int s;
6535766Smarc 
66*47731Sbostic 	if (ioctl(fd, TIOCGPGRP, &s) < 0)
67*47731Sbostic 		return((pid_t)-1);
68*47731Sbostic 	return((pid_t)s);
6935766Smarc }
7035766Smarc 
7146597Sdonn speed_t
7235766Smarc cfgetospeed(t)
7346597Sdonn 	const struct termios *t;
7435766Smarc {
7535766Smarc 	return(t->c_ospeed);
7635766Smarc }
7735766Smarc 
7846597Sdonn speed_t
7935766Smarc cfgetispeed(t)
8046597Sdonn 	const struct termios *t;
8135766Smarc {
8235766Smarc 	return(t->c_ispeed);
8335766Smarc }
8435766Smarc 
8546597Sdonn int
8635766Smarc cfsetospeed(t, speed)
8735766Smarc 	struct termios *t;
8846597Sdonn 	speed_t speed;
8935766Smarc {
9035766Smarc 	t->c_ospeed = speed;
9146597Sdonn 	return 0;
9235766Smarc }
9335766Smarc 
9446597Sdonn int
9535766Smarc cfsetispeed(t, speed)
9635766Smarc 	struct termios *t;
9746597Sdonn 	speed_t speed;
9835766Smarc {
9935766Smarc 	t->c_ispeed = speed;
10046597Sdonn 	return 0;
10135766Smarc }
10235766Smarc 
10346597Sdonn void
10435766Smarc cfsetspeed(t, speed)
10535766Smarc 	struct termios *t;
10646597Sdonn 	speed_t speed;
10735766Smarc {
10835766Smarc 	t->c_ispeed = t->c_ospeed = speed;
10935766Smarc }
11035766Smarc 
11146248Skarels /*
11246248Skarels  * Make a pre-existing termios structure into "raw" mode:
11346248Skarels  * character-at-a-time mode with no characters interpreted,
11446248Skarels  * 8-bit data path.
11546248Skarels  */
11646597Sdonn void
11735766Smarc cfmakeraw(t)
11835766Smarc 	struct termios *t;
11935766Smarc {
12046248Skarels 	t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
12146248Skarels 	t->c_oflag &= ~OPOST;
12238596Skarels 	t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
12346248Skarels 	t->c_cflag &= ~(CSIZE|PARENB);
12446248Skarels 	t->c_cflag |= CS8;
12535766Smarc 	/* set MIN/TIME */
12635766Smarc }
127