/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Edward Wang at The University of California, Berkeley. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char sccsid[] = "@(#)wwtty.c 3.16 (Berkeley) 6/6/90"; #endif /* not lint */ #include "ww.h" #include <fcntl.h> wwgettty(d, t) register struct ww_tty *t; { #ifndef POSIX_TTY if (ioctl(d, TIOCGETP, (char *)&t->ww_sgttyb) < 0) goto bad; if (ioctl(d, TIOCGETC, (char *)&t->ww_tchars) < 0) goto bad; if (ioctl(d, TIOCGLTC, (char *)&t->ww_ltchars) < 0) goto bad; if (ioctl(d, TIOCLGET, (char *)&t->ww_lmode) < 0) goto bad; if (ioctl(d, TIOCGETD, (char *)&t->ww_ldisc) < 0) goto bad; #else if (tcgetattr(d, &t->ww_termios) < 0) goto bad; #endif if ((t->ww_fflags = fcntl(d, F_GETFL, 0)) < 0) goto bad; return 0; bad: wwerrno = WWE_SYS; return -1; } /* * Set the modes of tty 'd' to 't' * 'o' is the current modes. We set the line discipline only if * it changes, to avoid unnecessary flushing of typeahead. */ wwsettty(d, t, o) register struct ww_tty *t, *o; { #ifndef POSIX_TTY /* for buggy tty driver that doesn't wait for output to drain */ int i; while (ioctl(d, TIOCOUTQ, &i) >= 0 && i > 0) usleep(100000); if (ioctl(d, TIOCSETN, (char *)&t->ww_sgttyb) < 0) goto bad; if (ioctl(d, TIOCSETC, (char *)&t->ww_tchars) < 0) goto bad; if (ioctl(d, TIOCSLTC, (char *)&t->ww_ltchars) < 0) goto bad; if (ioctl(d, TIOCLSET, (char *)&t->ww_lmode) < 0) goto bad; if ((o == 0 || t->ww_ldisc != o->ww_ldisc) && ioctl(d, TIOCSETD, (char *)&t->ww_ldisc) < 0) goto bad; #else if (tcsetattr(d, TCSADRAIN, &t->ww_termios) < 0) goto bad; #endif if (fcntl(d, F_SETFL, t->ww_fflags) < 0) goto bad; return 0; bad: wwerrno = WWE_SYS; return -1; }