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