Home | History | Annotate | Line # | Download | only in lpd
ttcompat.c revision 1.11
      1  1.11      wiz /*	$NetBSD: ttcompat.c,v 1.11 2002/07/14 15:28:00 wiz Exp $	*/
      2   1.1  hpeyerl /*
      3   1.1  hpeyerl  * Copyright (c) 1995
      4   1.1  hpeyerl  *	The Regents of the University of California.  All rights reserved.
      5   1.1  hpeyerl  *
      6   1.1  hpeyerl  *
      7   1.1  hpeyerl  * Redistribution and use in source and binary forms, with or without
      8   1.1  hpeyerl  * modification, are permitted provided that the following conditions
      9   1.1  hpeyerl  * are met:
     10   1.1  hpeyerl  * 1. Redistributions of source code must retain the above copyright
     11   1.1  hpeyerl  *    notice, this list of conditions and the following disclaimer.
     12   1.1  hpeyerl  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1  hpeyerl  *    notice, this list of conditions and the following disclaimer in the
     14   1.1  hpeyerl  *    documentation and/or other materials provided with the distribution.
     15   1.1  hpeyerl  * 3. All advertising materials mentioning features or use of this software
     16   1.1  hpeyerl  *    must display the following acknowledgement:
     17   1.1  hpeyerl  *	This product includes software developed by the University of
     18   1.1  hpeyerl  *	California, Berkeley and its contributors.
     19   1.1  hpeyerl  * 4. Neither the name of the University nor the names of its contributors
     20   1.1  hpeyerl  *    may be used to endorse or promote products derived from this software
     21   1.1  hpeyerl  *    without specific prior written permission.
     22   1.1  hpeyerl  *
     23   1.1  hpeyerl  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24   1.1  hpeyerl  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25   1.1  hpeyerl  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26   1.1  hpeyerl  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27   1.1  hpeyerl  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28   1.1  hpeyerl  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29   1.1  hpeyerl  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30   1.1  hpeyerl  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31   1.1  hpeyerl  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32   1.1  hpeyerl  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33   1.1  hpeyerl  * SUCH DAMAGE.
     34   1.1  hpeyerl  */
     35   1.1  hpeyerl 
     36   1.1  hpeyerl /*
     37   1.1  hpeyerl  * ttcompat.c -- convert sgtty flags to termios
     38   1.1  hpeyerl  *	originally from /sys/kern/tty_compat.c
     39   1.1  hpeyerl  */
     40   1.1  hpeyerl 
     41   1.1  hpeyerl #include <sys/param.h>
     42   1.1  hpeyerl #include <sys/types.h>
     43   1.1  hpeyerl 
     44   1.1  hpeyerl #include <unistd.h>
     45   1.1  hpeyerl #include <sys/ioctl_compat.h>
     46   1.1  hpeyerl #include <termios.h>
     47   1.1  hpeyerl #include <syslog.h>
     48   1.1  hpeyerl #include <fcntl.h>
     49   1.1  hpeyerl #include <dirent.h>
     50   1.1  hpeyerl #include <errno.h>
     51   1.1  hpeyerl #include <stdio.h>
     52   1.1  hpeyerl #include <string.h>
     53   1.1  hpeyerl #include <stdlib.h>
     54   1.1  hpeyerl #include "extern.h"
     55   1.1  hpeyerl 
     56   1.2  mycroft /* Macros to clear/set/test flags. */
     57   1.2  mycroft #define	SET(t, f)	(t) |= (f)
     58   1.2  mycroft #define	CLR(t, f)	(t) &= ~(f)
     59   1.2  mycroft #define	ISSET(t, f)	((t) & (f))
     60   1.2  mycroft 
     61  1.11      wiz static int	sttygetoflags(struct termios *);
     62  1.11      wiz static void	sttysetoflags(struct termios *, int);
     63  1.10      mrg 
     64   1.6  mycroft static int
     65  1.11      wiz sttygetoflags(struct termios *tp)
     66   1.6  mycroft {
     67  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
     68  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
     69  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
     70  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
     71  1.10      mrg 	int flags = 0;
     72   1.6  mycroft 
     73   1.6  mycroft 	if (ISSET(cflag, PARENB)) {
     74   1.6  mycroft 		if (ISSET(iflag, INPCK)) {
     75   1.6  mycroft 			if (ISSET(cflag, PARODD))
     76   1.6  mycroft 				SET(flags, ODDP);
     77   1.6  mycroft 			else
     78   1.6  mycroft 				SET(flags, EVENP);
     79   1.6  mycroft 		} else
     80   1.6  mycroft 			SET(flags, EVENP|ODDP);
     81   1.6  mycroft 	}
     82   1.6  mycroft 	if (ISSET(cflag, CSIZE) == CS8) {
     83   1.6  mycroft 		if (!ISSET(iflag, ISTRIP))
     84   1.6  mycroft 			SET(flags, PASS8);
     85   1.6  mycroft 		if (!ISSET(oflag, OPOST))
     86   1.6  mycroft 			SET(flags, LITOUT);
     87   1.6  mycroft 	}
     88   1.6  mycroft 
     89   1.6  mycroft 	if (!ISSET(lflag, ICANON)) {
     90   1.6  mycroft 		/* fudge */
     91   1.6  mycroft 		if (ISSET(iflag, IXON) || ISSET(lflag, ISIG|IEXTEN) ||
     92   1.6  mycroft 		    ISSET(cflag, PARENB))
     93   1.6  mycroft 			SET(flags, CBREAK);
     94   1.6  mycroft 		else
     95   1.6  mycroft 			SET(flags, RAW);
     96   1.6  mycroft 	}
     97   1.6  mycroft 
     98   1.6  mycroft 	return (flags);
     99   1.6  mycroft }
    100   1.6  mycroft 
    101   1.6  mycroft static void
    102  1.11      wiz sttysetoflags(struct termios *tp, int flags)
    103   1.6  mycroft {
    104  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
    105  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
    106  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
    107  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
    108   1.6  mycroft 
    109   1.8  mycroft 	if (ISSET(flags, RAW)) {
    110   1.8  mycroft 		iflag &= IXOFF;
    111   1.8  mycroft 		CLR(lflag, ISIG|ICANON|IEXTEN);
    112   1.8  mycroft 		CLR(cflag, PARENB);
    113   1.8  mycroft 	} else {
    114   1.8  mycroft 		SET(iflag, BRKINT|IXON|IMAXBEL);
    115   1.8  mycroft 		SET(lflag, ISIG|IEXTEN);
    116   1.8  mycroft 		if (ISSET(flags, CBREAK))
    117   1.8  mycroft 			CLR(lflag, ICANON);
    118   1.8  mycroft 		else
    119   1.8  mycroft 			SET(lflag, ICANON);
    120   1.8  mycroft 		switch (ISSET(flags, ANYP)) {
    121   1.8  mycroft 		case 0:
    122   1.8  mycroft 			CLR(cflag, PARENB);
    123   1.8  mycroft 			break;
    124   1.8  mycroft 		case ANYP:
    125   1.8  mycroft 			SET(cflag, PARENB);
    126   1.8  mycroft 			CLR(iflag, INPCK);
    127   1.8  mycroft 			break;
    128   1.8  mycroft 		case EVENP:
    129   1.8  mycroft 			SET(cflag, PARENB);
    130   1.8  mycroft 			SET(iflag, INPCK);
    131   1.8  mycroft 			CLR(cflag, PARODD);
    132   1.8  mycroft 			break;
    133   1.8  mycroft 		case ODDP:
    134   1.8  mycroft 			SET(cflag, PARENB);
    135   1.8  mycroft 			SET(iflag, INPCK);
    136   1.8  mycroft 			SET(cflag, PARODD);
    137   1.8  mycroft 			break;
    138   1.8  mycroft 		}
    139   1.6  mycroft 	}
    140   1.6  mycroft 
    141   1.6  mycroft 	if (ISSET(flags, RAW|LITOUT|PASS8)) {
    142   1.8  mycroft 		CLR(cflag, CSIZE);
    143   1.6  mycroft 		SET(cflag, CS8);
    144   1.6  mycroft 		if (!ISSET(flags, RAW|PASS8))
    145   1.6  mycroft 			SET(iflag, ISTRIP);
    146   1.6  mycroft 		else
    147   1.6  mycroft 			CLR(iflag, ISTRIP);
    148   1.6  mycroft 		if (!ISSET(flags, RAW|LITOUT))
    149   1.6  mycroft 			SET(oflag, OPOST);
    150   1.6  mycroft 		else
    151   1.6  mycroft 			CLR(oflag, OPOST);
    152   1.6  mycroft 	} else {
    153   1.6  mycroft 		CLR(cflag, CSIZE);
    154   1.8  mycroft 		SET(cflag, CS7);
    155   1.6  mycroft 		SET(iflag, ISTRIP);
    156   1.6  mycroft 		SET(oflag, OPOST);
    157   1.6  mycroft 	}
    158   1.6  mycroft 
    159   1.6  mycroft 	tp->c_iflag = iflag;
    160   1.6  mycroft 	tp->c_oflag = oflag;
    161   1.6  mycroft 	tp->c_lflag = lflag;
    162   1.6  mycroft 	tp->c_cflag = cflag;
    163   1.6  mycroft }
    164   1.6  mycroft 
    165   1.1  hpeyerl void
    166  1.11      wiz sttyclearflags(struct termios *tp, int flags)
    167   1.1  hpeyerl {
    168  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
    169  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
    170  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
    171  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
    172  1.10      mrg 	int oflags = sttygetoflags(tp) & ~flags;
    173   1.1  hpeyerl 
    174   1.2  mycroft 	if (ISSET(flags, TANDEM))
    175   1.2  mycroft 		CLR(iflag, IXOFF);
    176   1.2  mycroft 	if (ISSET(flags, ECHO))
    177   1.2  mycroft 		CLR(lflag, ECHO);
    178   1.2  mycroft 	if (ISSET(flags, CRMOD)) {
    179   1.2  mycroft 		CLR(iflag, ICRNL);
    180   1.2  mycroft 		CLR(oflag, ONLCR);
    181   1.2  mycroft 	}
    182   1.2  mycroft 	if (ISSET(flags, XTABS))
    183   1.2  mycroft 		CLR(oflag, OXTABS);
    184   1.2  mycroft 
    185   1.2  mycroft 
    186   1.1  hpeyerl 	tp->c_iflag = iflag;
    187   1.1  hpeyerl 	tp->c_oflag = oflag;
    188   1.1  hpeyerl 	tp->c_lflag = lflag;
    189   1.1  hpeyerl 	tp->c_cflag = cflag;
    190   1.6  mycroft 
    191   1.6  mycroft 	sttysetoflags(tp, oflags);
    192   1.1  hpeyerl }
    193   1.1  hpeyerl 
    194   1.1  hpeyerl void
    195  1.11      wiz sttysetflags(struct termios *tp, int flags)
    196   1.1  hpeyerl {
    197  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
    198  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
    199  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
    200  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
    201  1.10      mrg 	int oflags = sttygetoflags(tp) | flags;
    202   1.1  hpeyerl 
    203   1.2  mycroft 	if (ISSET(flags, TANDEM))
    204   1.2  mycroft 		SET(iflag, IXOFF);
    205   1.2  mycroft 	if (ISSET(flags, ECHO))
    206   1.2  mycroft 		SET(lflag, ECHO);
    207   1.2  mycroft 	if (ISSET(flags, CRMOD)) {
    208   1.2  mycroft 		SET(iflag, ICRNL);
    209   1.2  mycroft 		SET(oflag, ONLCR);
    210   1.2  mycroft 	}
    211   1.2  mycroft 	if (ISSET(flags, XTABS))
    212   1.2  mycroft 		SET(oflag, OXTABS);
    213   1.1  hpeyerl 
    214   1.1  hpeyerl 	tp->c_iflag = iflag;
    215   1.1  hpeyerl 	tp->c_oflag = oflag;
    216   1.1  hpeyerl 	tp->c_lflag = lflag;
    217   1.1  hpeyerl 	tp->c_cflag = cflag;
    218   1.6  mycroft 
    219   1.6  mycroft 	sttysetoflags(tp, oflags);
    220   1.1  hpeyerl }
    221   1.1  hpeyerl 
    222   1.1  hpeyerl void
    223  1.11      wiz sttyclearlflags(struct termios *tp, int flags)
    224   1.1  hpeyerl {
    225  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
    226  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
    227  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
    228  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
    229  1.10      mrg 	int oflags = sttygetoflags(tp) & ~flags;
    230   1.1  hpeyerl 
    231   1.1  hpeyerl 	/* Nothing we can do with CRTBS. */
    232   1.2  mycroft 	if (ISSET(flags, PRTERA))
    233   1.2  mycroft 		CLR(lflag, ECHOPRT);
    234   1.2  mycroft 	if (ISSET(flags, CRTERA))
    235   1.2  mycroft 		CLR(lflag, ECHOE);
    236   1.1  hpeyerl 	/* Nothing we can do with TILDE. */
    237   1.2  mycroft 	if (ISSET(flags, MDMBUF))
    238   1.2  mycroft 		CLR(cflag, MDMBUF);
    239   1.2  mycroft 	if (ISSET(flags, NOHANG))
    240   1.2  mycroft 		SET(cflag, HUPCL);
    241   1.2  mycroft 	if (ISSET(flags, CRTKIL))
    242   1.2  mycroft 		CLR(lflag, ECHOKE);
    243   1.2  mycroft 	if (ISSET(flags, CTLECH))
    244   1.2  mycroft 		CLR(lflag, ECHOCTL);
    245   1.5  mycroft 	if (ISSET(flags, DECCTQ))
    246   1.5  mycroft 		SET(iflag, IXANY);
    247   1.2  mycroft 	CLR(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
    248   1.2  mycroft 
    249   1.1  hpeyerl 	tp->c_iflag = iflag;
    250   1.1  hpeyerl 	tp->c_oflag = oflag;
    251   1.1  hpeyerl 	tp->c_lflag = lflag;
    252   1.1  hpeyerl 	tp->c_cflag = cflag;
    253   1.6  mycroft 
    254   1.6  mycroft 	sttysetoflags(tp, oflags);
    255   1.1  hpeyerl }
    256   1.1  hpeyerl 
    257   1.1  hpeyerl void
    258  1.11      wiz sttysetlflags(struct termios *tp, int flags)
    259   1.1  hpeyerl {
    260  1.10      mrg 	tcflag_t iflag = tp->c_iflag;
    261  1.10      mrg 	tcflag_t oflag = tp->c_oflag;
    262  1.10      mrg 	tcflag_t lflag = tp->c_lflag;
    263  1.10      mrg 	tcflag_t cflag = tp->c_cflag;
    264  1.10      mrg 	int oflags = sttygetoflags(tp) | flags;
    265   1.1  hpeyerl 
    266   1.1  hpeyerl 	/* Nothing we can do with CRTBS. */
    267   1.2  mycroft 	if (ISSET(flags, PRTERA))
    268   1.2  mycroft 		SET(lflag, ECHOPRT);
    269   1.2  mycroft 	if (ISSET(flags, CRTERA))
    270   1.2  mycroft 		SET(lflag, ECHOE);
    271   1.1  hpeyerl 	/* Nothing we can do with TILDE. */
    272   1.2  mycroft 	if (ISSET(flags, MDMBUF))
    273   1.2  mycroft 		SET(cflag, MDMBUF);
    274   1.2  mycroft 	if (ISSET(flags, NOHANG))
    275   1.2  mycroft 		CLR(cflag, HUPCL);
    276   1.2  mycroft 	if (ISSET(flags, CRTKIL))
    277   1.2  mycroft 		SET(lflag, ECHOKE);
    278   1.2  mycroft 	if (ISSET(flags, CTLECH))
    279   1.2  mycroft 		SET(lflag, ECHOCTL);
    280   1.5  mycroft 	if (ISSET(flags, DECCTQ))
    281   1.5  mycroft 		CLR(iflag, IXANY);
    282   1.2  mycroft 	SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
    283   1.2  mycroft 
    284   1.1  hpeyerl 	tp->c_iflag = iflag;
    285   1.1  hpeyerl 	tp->c_oflag = oflag;
    286   1.1  hpeyerl 	tp->c_lflag = lflag;
    287   1.1  hpeyerl 	tp->c_cflag = cflag;
    288   1.6  mycroft 
    289   1.6  mycroft 	sttysetoflags(tp, oflags);
    290   1.1  hpeyerl }
    291