xref: /OK3568_Linux_fs/u-boot/common/rbsb.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun   rbsb.c - terminal handling stuff for lrzsz
3*4882a593Smuzhiyun   Copyright (C) until 1988 Chuck Forsberg (Omen Technology INC)
4*4882a593Smuzhiyun   Copyright (C) 1994 Matt Porter, Michael D. Black
5*4882a593Smuzhiyun   Copyright (C) 1996, 1997 Uwe Ohse
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun   This program is free software; you can redistribute it and/or modify
8*4882a593Smuzhiyun   it under the terms of the GNU General Public License as published by
9*4882a593Smuzhiyun   the Free Software Foundation; either version 2, or (at your option)
10*4882a593Smuzhiyun   any later version.
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun   This program is distributed in the hope that it will be useful,
13*4882a593Smuzhiyun   but WITHOUT ANY WARRANTY; without even the implied warranty of
14*4882a593Smuzhiyun   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*4882a593Smuzhiyun   GNU General Public License for more details.
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun   You should have received a copy of the GNU General Public License
18*4882a593Smuzhiyun   along with this program; if not, write to the Free Software
19*4882a593Smuzhiyun   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20*4882a593Smuzhiyun   02111-1307, USA.
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun   originally written by Chuck Forsberg
23*4882a593Smuzhiyun */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /*
26*4882a593Smuzhiyun  *  Rev 05-05-1988
27*4882a593Smuzhiyun  *  ============== (not quite, but originated there :-). -- uwe
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun #include "zglobal.h"
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #include <stdio.h>
32*4882a593Smuzhiyun #include <errno.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #ifndef HAVE_ERRNO_DECLARATION
35*4882a593Smuzhiyun extern int errno;
36*4882a593Smuzhiyun #endif
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #ifdef USE_SGTTY
39*4882a593Smuzhiyun #  ifdef LLITOUT
40*4882a593Smuzhiyun long Locmode;		/* Saved "local mode" for 4.x BSD "new driver" */
41*4882a593Smuzhiyun long Locbit = LLITOUT;	/* Bit SUPPOSED to disable output translations */
42*4882a593Smuzhiyun #  endif
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #ifdef HAVE_SYS_IOCTL_H
46*4882a593Smuzhiyun #include <sys/ioctl.h>
47*4882a593Smuzhiyun #endif
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #ifdef MAJOR_IN_MKDEV
50*4882a593Smuzhiyun #include <sys/mkdev.h>
51*4882a593Smuzhiyun #else
52*4882a593Smuzhiyun # ifdef MAJOR_IN_SYSMACROS
53*4882a593Smuzhiyun # include <sys/sysmacros.h>
54*4882a593Smuzhiyun # endif
55*4882a593Smuzhiyun #endif
56*4882a593Smuzhiyun #ifndef HOWMANY
57*4882a593Smuzhiyun #ifdef NFGVMIN
58*4882a593Smuzhiyun #define HOWMANY MAX_BLOCK
59*4882a593Smuzhiyun #else
60*4882a593Smuzhiyun #define HOWMANY 255
61*4882a593Smuzhiyun #endif
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #if defined(HOWMANY) && HOWMANY  > 255
66*4882a593Smuzhiyun #ifndef NFGVMIN
67*4882a593Smuzhiyun Howmany must be 255 or less
68*4882a593Smuzhiyun #endif
69*4882a593Smuzhiyun #endif
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define B110 110
72*4882a593Smuzhiyun #define B300 300
73*4882a593Smuzhiyun #define B600 600
74*4882a593Smuzhiyun #define B1200 1200
75*4882a593Smuzhiyun #define B2400 2400
76*4882a593Smuzhiyun #define B2400 2400
77*4882a593Smuzhiyun static struct {
78*4882a593Smuzhiyun 	unsigned baudr;
79*4882a593Smuzhiyun 	int  speedcode;
80*4882a593Smuzhiyun } speeds[] = {
81*4882a593Smuzhiyun 	{110,	B110},
82*4882a593Smuzhiyun 	{300,	B300},
83*4882a593Smuzhiyun 	{600,	B600},
84*4882a593Smuzhiyun 	{1200,	B1200},
85*4882a593Smuzhiyun #ifdef B19200
86*4882a593Smuzhiyun     {19200,  B19200},
87*4882a593Smuzhiyun #endif
88*4882a593Smuzhiyun #ifdef B38400
89*4882a593Smuzhiyun     {38400,  B38400},
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun #ifdef B57600
92*4882a593Smuzhiyun     {57600,  B57600},
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun #ifdef B115200
95*4882a593Smuzhiyun     {115200,  B115200},
96*4882a593Smuzhiyun #endif
97*4882a593Smuzhiyun #ifdef B230400
98*4882a593Smuzhiyun     {230400,  B230400},
99*4882a593Smuzhiyun #endif
100*4882a593Smuzhiyun #ifdef B460800
101*4882a593Smuzhiyun     {460800,  B460800},
102*4882a593Smuzhiyun #endif
103*4882a593Smuzhiyun #ifdef EXTA
104*4882a593Smuzhiyun 	{19200,	EXTA},
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun #ifdef EXTB
107*4882a593Smuzhiyun 	{38400,	EXTB},
108*4882a593Smuzhiyun #endif
109*4882a593Smuzhiyun 	{0, 0}
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun extern int CYGACC_COMM_IF_GETC_TIMEOUT (char chan, char *c);
113*4882a593Smuzhiyun extern void CYGACC_COMM_IF_PUTC (char x, char y);
114*4882a593Smuzhiyun extern int CYGACC_COMM_IF_GETC_TIMEOUT (char chan, char *c);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun unsigned
getspeed(int code)117*4882a593Smuzhiyun getspeed(int  code)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	int n;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	for (n=0; speeds[n].baudr; ++n)
122*4882a593Smuzhiyun 		if (speeds[n].speedcode == code)
123*4882a593Smuzhiyun 			return speeds[n].baudr;
124*4882a593Smuzhiyun 	return 38400;	/* Assume fifo if ioctl failed */
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /*
128*4882a593Smuzhiyun  * return 1 if stdout and stderr are different devices
129*4882a593Smuzhiyun  *  indicating this program operating with a modem on a
130*4882a593Smuzhiyun  *  different line
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun int Fromcu;		/* Were called from cu or yam */
133*4882a593Smuzhiyun int
from_cu(void)134*4882a593Smuzhiyun from_cu(void)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun #if 0
137*4882a593Smuzhiyun #ifdef HAVE_ST_RDEV
138*4882a593Smuzhiyun 	struct stat a, b;
139*4882a593Smuzhiyun #if defined(makedev)
140*4882a593Smuzhiyun 	dev_t help=makedev(0,0);
141*4882a593Smuzhiyun #else
142*4882a593Smuzhiyun 	int help=0;
143*4882a593Smuzhiyun #endif
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	/* in case fstat fails */
146*4882a593Smuzhiyun 	a.st_rdev=b.st_rdev=a.st_dev=b.st_dev=help;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	fstat(1, &a); fstat(2, &b);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #if defined(major) && defined(minor)
151*4882a593Smuzhiyun 	if (major(a.st_rdev) != major(b.st_rdev)
152*4882a593Smuzhiyun 		|| minor(a.st_rdev) != minor(b.st_rdev))
153*4882a593Smuzhiyun 		Fromcu=1;
154*4882a593Smuzhiyun 	else if (major(a.st_dev) != major(b.st_dev)
155*4882a593Smuzhiyun 		|| minor(a.st_dev) != minor(b.st_dev))
156*4882a593Smuzhiyun 		Fromcu=1;
157*4882a593Smuzhiyun 	else
158*4882a593Smuzhiyun 		Fromcu=0;
159*4882a593Smuzhiyun #else
160*4882a593Smuzhiyun 	Fromcu = (a.st_rdev != b.st_rdev) || (a.st_dev != b.st_dev);
161*4882a593Smuzhiyun #endif
162*4882a593Smuzhiyun #else
163*4882a593Smuzhiyun 	Fromcu = 1; /* a bad guess .. */
164*4882a593Smuzhiyun #endif
165*4882a593Smuzhiyun 	return Fromcu;
166*4882a593Smuzhiyun #endif
167*4882a593Smuzhiyun 	return 0;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun int Twostop;		/* Use two stop bits */
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #ifdef READCHECK_FIONREAD
176*4882a593Smuzhiyun /*
177*4882a593Smuzhiyun  *  Return non 0 if something to read from io descriptor f
178*4882a593Smuzhiyun  */
179*4882a593Smuzhiyun int
rdchk(int fd)180*4882a593Smuzhiyun rdchk(int fd)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun 	static long lf;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	ioctl(fd, FIONREAD, &lf);
185*4882a593Smuzhiyun 	return ((int) lf);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun #endif
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #ifdef READCHECK_GETFL
190*4882a593Smuzhiyun unsigned char checked = '\0' ;
191*4882a593Smuzhiyun /*
192*4882a593Smuzhiyun  * Nonblocking I/O is a bit different in System V, Release 2
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun int
rdchk(int fd)195*4882a593Smuzhiyun rdchk(int fd)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	int lf, savestat;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	savestat = fcntl(fd, F_GETFL) ;
200*4882a593Smuzhiyun 	if (savestat == -1)
201*4882a593Smuzhiyun 		return 0;
202*4882a593Smuzhiyun #ifdef OVERLY_PARANOID
203*4882a593Smuzhiyun 	if (-1==fcntl(fd, F_SETFL, savestat | O_NDELAY))
204*4882a593Smuzhiyun 		return 0;
205*4882a593Smuzhiyun 	lf = read(fd, &checked, 1) ;
206*4882a593Smuzhiyun 	if (-1==fcntl(fd, F_SETFL, savestat)) {
207*4882a593Smuzhiyun #ifdef ENABLE_SYSLOG
208*4882a593Smuzhiyun 		if (enable_syslog)
209*4882a593Smuzhiyun 			lsyslog(LOG_CRIT,"F_SETFL failed in rdchk(): %s",
210*4882a593Smuzhiyun 				strerror(errno));
211*4882a593Smuzhiyun #endif
212*4882a593Smuzhiyun 		zpfatal("rdchk: F_SETFL failed\n"); /* lose */
213*4882a593Smuzhiyun 		/* there is really no way to recover. And we can't tell
214*4882a593Smuzhiyun 		 * the other side what's going on if we can't write to
215*4882a593Smuzhiyun 		 * fd, but we try.
216*4882a593Smuzhiyun 		 */
217*4882a593Smuzhiyun 		canit(fd);
218*4882a593Smuzhiyun 		exit(1);
219*4882a593Smuzhiyun 	}
220*4882a593Smuzhiyun #else
221*4882a593Smuzhiyun 	fcntl(fd, F_SETFL, savestat | O_NDELAY);
222*4882a593Smuzhiyun 	lf = read(fd, &checked, 1) ;
223*4882a593Smuzhiyun 	fcntl(fd, F_SETFL, savestat);
224*4882a593Smuzhiyun #endif
225*4882a593Smuzhiyun 	return(lf == -1 && errno==EWOULDBLOCK ? 0 : lf) ;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun #endif
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun #ifdef USE_TERMIOS
234*4882a593Smuzhiyun struct termios oldtty, tty;
235*4882a593Smuzhiyun #else
236*4882a593Smuzhiyun #  if defined(USE_TERMIO)
237*4882a593Smuzhiyun struct termio oldtty, tty;
238*4882a593Smuzhiyun #  else
239*4882a593Smuzhiyun //struct sgttyb oldtty, tty;
240*4882a593Smuzhiyun //struct tchars oldtch, tch;
241*4882a593Smuzhiyun #  endif
242*4882a593Smuzhiyun #endif
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /*
246*4882a593Smuzhiyun  * mode(n)
247*4882a593Smuzhiyun  *  3: save old tty stat, set raw mode with flow control
248*4882a593Smuzhiyun  *  2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g
249*4882a593Smuzhiyun  *  1: save old tty stat, set raw mode
250*4882a593Smuzhiyun  *  0: restore original tty mode
251*4882a593Smuzhiyun  */
252*4882a593Smuzhiyun int
io_mode(int fd,int n)253*4882a593Smuzhiyun io_mode(int fd, int n)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun #if 1
256*4882a593Smuzhiyun 	__maybe_unused static int did0 = FALSE;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	vfile("mode:%d", n);
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	switch(n) {
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun #ifdef USE_TERMIOS
263*4882a593Smuzhiyun 	case 2:		/* Un-raw mode used by sz, sb when -g detected */
264*4882a593Smuzhiyun 		if(!did0) {
265*4882a593Smuzhiyun 			did0 = TRUE;
266*4882a593Smuzhiyun 			tcgetattr(fd,&oldtty);
267*4882a593Smuzhiyun 		}
268*4882a593Smuzhiyun 		tty = oldtty;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 		tty.c_iflag = BRKINT|IXON;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 		tty.c_oflag = 0;	/* Transparent output */
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 		tty.c_cflag &= ~PARENB;	/* Disable parity */
275*4882a593Smuzhiyun 		tty.c_cflag |= CS8;	/* Set character size = 8 */
276*4882a593Smuzhiyun 		if (Twostop)
277*4882a593Smuzhiyun 			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #ifdef READCHECK
280*4882a593Smuzhiyun 		tty.c_lflag = protocol==ZM_ZMODEM ? 0 : ISIG;
281*4882a593Smuzhiyun 		tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? -1 : 030;	/* Interrupt char */
282*4882a593Smuzhiyun #else
283*4882a593Smuzhiyun 		tty.c_lflag = 0;
284*4882a593Smuzhiyun 		tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? 03 : 030;	/* Interrupt char */
285*4882a593Smuzhiyun #endif
286*4882a593Smuzhiyun #ifdef _POSIX_VDISABLE
287*4882a593Smuzhiyun 		if (((int) _POSIX_VDISABLE)!=(-1)) {
288*4882a593Smuzhiyun 			tty.c_cc[VQUIT] = _POSIX_VDISABLE;		/* Quit char */
289*4882a593Smuzhiyun 		} else {
290*4882a593Smuzhiyun 			tty.c_cc[VQUIT] = -1;			/* Quit char */
291*4882a593Smuzhiyun 		}
292*4882a593Smuzhiyun #else
293*4882a593Smuzhiyun 		tty.c_cc[VQUIT] = -1;			/* Quit char */
294*4882a593Smuzhiyun #endif
295*4882a593Smuzhiyun #ifdef NFGVMIN
296*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 1;
297*4882a593Smuzhiyun #else
298*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 3;	 /* This many chars satisfies reads */
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun 		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 		tcsetattr(fd,TCSADRAIN,&tty);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 		return OK;
305*4882a593Smuzhiyun 	case 1:
306*4882a593Smuzhiyun 	case 3:
307*4882a593Smuzhiyun 		if(!did0) {
308*4882a593Smuzhiyun 			did0 = TRUE;
309*4882a593Smuzhiyun 			tcgetattr(fd,&oldtty);
310*4882a593Smuzhiyun 		}
311*4882a593Smuzhiyun 		tty = oldtty;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 		tty.c_iflag = IGNBRK;
314*4882a593Smuzhiyun 		if (n==3) /* with flow control */
315*4882a593Smuzhiyun 			tty.c_iflag |= IXOFF;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 		 /* No echo, crlf mapping, INTR, QUIT, delays, no erase/kill */
318*4882a593Smuzhiyun 		tty.c_lflag &= ~(ECHO | ICANON | ISIG);
319*4882a593Smuzhiyun 		tty.c_oflag = 0;	/* Transparent output */
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 		tty.c_cflag &= ~(PARENB);	/* Same baud rate, disable parity */
322*4882a593Smuzhiyun 		/* Set character size = 8 */
323*4882a593Smuzhiyun 		tty.c_cflag &= ~(CSIZE);
324*4882a593Smuzhiyun 		tty.c_cflag |= CS8;
325*4882a593Smuzhiyun 		if (Twostop)
326*4882a593Smuzhiyun 			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
327*4882a593Smuzhiyun #ifdef NFGVMIN
328*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */
329*4882a593Smuzhiyun #else
330*4882a593Smuzhiyun 		tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */
331*4882a593Smuzhiyun #endif
332*4882a593Smuzhiyun 		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
333*4882a593Smuzhiyun 		tcsetattr(fd,TCSADRAIN,&tty);
334*4882a593Smuzhiyun 		Baudrate = getspeed(cfgetospeed(&tty));
335*4882a593Smuzhiyun 		return OK;
336*4882a593Smuzhiyun 	case 0:
337*4882a593Smuzhiyun 		if(!did0)
338*4882a593Smuzhiyun 			return ERROR;
339*4882a593Smuzhiyun 		tcdrain (fd); /* wait until everything is sent */
340*4882a593Smuzhiyun 		tcflush (fd,TCIOFLUSH); /* flush input queue */
341*4882a593Smuzhiyun 		tcsetattr (fd,TCSADRAIN,&oldtty);
342*4882a593Smuzhiyun 		tcflow (fd,TCOON); /* restart output */
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun 		return OK;
345*4882a593Smuzhiyun #endif
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun #ifdef USE_TERMIO
348*4882a593Smuzhiyun 	case 2:		/* Un-raw mode used by sz, sb when -g detected */
349*4882a593Smuzhiyun 		if(!did0)
350*4882a593Smuzhiyun 			(void) ioctl(fd, TCGETA, &oldtty);
351*4882a593Smuzhiyun 		tty = oldtty;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 		tty.c_iflag = BRKINT|IXON;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 		tty.c_oflag = 0;	/* Transparent output */
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 		tty.c_cflag &= ~PARENB;	/* Disable parity */
358*4882a593Smuzhiyun 		tty.c_cflag |= CS8;	/* Set character size = 8 */
359*4882a593Smuzhiyun 		if (Twostop)
360*4882a593Smuzhiyun 			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun #ifdef READCHECK
364*4882a593Smuzhiyun 		tty.c_lflag = protocol==ZM_ZMODEM ? 0 : ISIG;
365*4882a593Smuzhiyun 		tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? -1 : 030;	/* Interrupt char */
366*4882a593Smuzhiyun #else
367*4882a593Smuzhiyun 		tty.c_lflag = 0;
368*4882a593Smuzhiyun 		tty.c_cc[VINTR] = protocol==ZM_ZMODEM ? 03 : 030;	/* Interrupt char */
369*4882a593Smuzhiyun #endif
370*4882a593Smuzhiyun 		tty.c_cc[VQUIT] = -1;			/* Quit char */
371*4882a593Smuzhiyun #ifdef NFGVMIN
372*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 1;
373*4882a593Smuzhiyun #else
374*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 3;	 /* This many chars satisfies reads */
375*4882a593Smuzhiyun #endif
376*4882a593Smuzhiyun 		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 		(void) ioctl(fd, TCSETAW, &tty);
379*4882a593Smuzhiyun 		did0 = TRUE;
380*4882a593Smuzhiyun 		return OK;
381*4882a593Smuzhiyun 	case 1:
382*4882a593Smuzhiyun 	case 3:
383*4882a593Smuzhiyun 		if(!did0)
384*4882a593Smuzhiyun 			(void) ioctl(fd, TCGETA, &oldtty);
385*4882a593Smuzhiyun 		tty = oldtty;
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 		tty.c_iflag = n==3 ? (IGNBRK|IXOFF) : IGNBRK;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 		 /* No echo, crlf mapping, delays, no erase/kill */
390*4882a593Smuzhiyun 		tty.c_lflag &= ~(ECHO | ICANON | ISIG);
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 		tty.c_oflag = 0;	/* Transparent output */
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun 		tty.c_cflag &= ~PARENB;	/* Same baud rate, disable parity */
395*4882a593Smuzhiyun 		tty.c_cflag |= CS8;	/* Set character size = 8 */
396*4882a593Smuzhiyun 		if (Twostop)
397*4882a593Smuzhiyun 			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
398*4882a593Smuzhiyun #ifdef NFGVMIN
399*4882a593Smuzhiyun 		tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */
400*4882a593Smuzhiyun #else
401*4882a593Smuzhiyun 		tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */
402*4882a593Smuzhiyun #endif
403*4882a593Smuzhiyun 		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
404*4882a593Smuzhiyun 		(void) ioctl(fd, TCSETAW, &tty);
405*4882a593Smuzhiyun 		did0 = TRUE;
406*4882a593Smuzhiyun 		Baudrate = getspeed(tty.c_cflag & CBAUD);
407*4882a593Smuzhiyun 		return OK;
408*4882a593Smuzhiyun 	case 0:
409*4882a593Smuzhiyun 		if(!did0)
410*4882a593Smuzhiyun 			return ERROR;
411*4882a593Smuzhiyun 		(void) ioctl(fd, TCSBRK, 1);	/* Wait for output to drain */
412*4882a593Smuzhiyun 		(void) ioctl(fd, TCFLSH, 0);	/* Flush input queue */
413*4882a593Smuzhiyun 		(void) ioctl(fd, TCSETAW, &oldtty);	/* Restore modes */
414*4882a593Smuzhiyun 		(void) ioctl(fd, TCXONC,1);	/* Restart output */
415*4882a593Smuzhiyun 		return OK;
416*4882a593Smuzhiyun #endif
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun #ifdef USE_SGTTY
420*4882a593Smuzhiyun 	/*
421*4882a593Smuzhiyun 	 *  NOTE: this should transmit all 8 bits and at the same time
422*4882a593Smuzhiyun 	 *   respond to XOFF/XON flow control.  If no FIONREAD or other
423*4882a593Smuzhiyun 	 *   READCHECK alternative, also must respond to INTRRUPT char
424*4882a593Smuzhiyun 	 *   This doesn't work with V7.  It should work with LLITOUT,
425*4882a593Smuzhiyun 	 *   but LLITOUT was broken on the machine I tried it on.
426*4882a593Smuzhiyun 	 */
427*4882a593Smuzhiyun 	case 2:		/* Un-raw mode used by sz, sb when -g detected */
428*4882a593Smuzhiyun 		if(!did0) {
429*4882a593Smuzhiyun 			ioctl(fd, TIOCEXCL, 0);
430*4882a593Smuzhiyun 			ioctl(fd, TIOCGETP, &oldtty);
431*4882a593Smuzhiyun 			ioctl(fd, TIOCGETC, &oldtch);
432*4882a593Smuzhiyun #ifdef LLITOUT
433*4882a593Smuzhiyun 			ioctl(fd, TIOCLGET, &Locmode);
434*4882a593Smuzhiyun #endif
435*4882a593Smuzhiyun 		}
436*4882a593Smuzhiyun 		tty = oldtty;
437*4882a593Smuzhiyun 		tch = oldtch;
438*4882a593Smuzhiyun #ifdef READCHECK
439*4882a593Smuzhiyun 		tch.t_intrc = Zmodem ? -1:030;	/* Interrupt char */
440*4882a593Smuzhiyun #else
441*4882a593Smuzhiyun 		tch.t_intrc = Zmodem ? 03:030;	/* Interrupt char */
442*4882a593Smuzhiyun #endif
443*4882a593Smuzhiyun 		tty.sg_flags |= (ODDP|EVENP|CBREAK);
444*4882a593Smuzhiyun 		tty.sg_flags &= ~(ALLDELAY|CRMOD|ECHO|LCASE);
445*4882a593Smuzhiyun 		ioctl(fd, TIOCSETP, &tty);
446*4882a593Smuzhiyun 		ioctl(fd, TIOCSETC, &tch);
447*4882a593Smuzhiyun #ifdef LLITOUT
448*4882a593Smuzhiyun 		ioctl(fd, TIOCLBIS, &Locbit);
449*4882a593Smuzhiyun #else
450*4882a593Smuzhiyun 		bibi(99);	/* un-raw doesn't work w/o lit out */
451*4882a593Smuzhiyun #endif
452*4882a593Smuzhiyun 		did0 = TRUE;
453*4882a593Smuzhiyun 		return OK;
454*4882a593Smuzhiyun 	case 1:
455*4882a593Smuzhiyun 	case 3:
456*4882a593Smuzhiyun 		if(!did0) {
457*4882a593Smuzhiyun 			ioctl(fd, TIOCEXCL, 0);
458*4882a593Smuzhiyun 			ioctl(fd, TIOCGETP, &oldtty);
459*4882a593Smuzhiyun 			ioctl(fd, TIOCGETC, &oldtch);
460*4882a593Smuzhiyun #ifdef LLITOUT
461*4882a593Smuzhiyun 			ioctl(fd, TIOCLGET, &Locmode);
462*4882a593Smuzhiyun #endif
463*4882a593Smuzhiyun 		}
464*4882a593Smuzhiyun 		tty = oldtty;
465*4882a593Smuzhiyun 		tty.sg_flags |= RAW;
466*4882a593Smuzhiyun 		tty.sg_flags &= ~ECHO;
467*4882a593Smuzhiyun 		ioctl(fd, TIOCSETP, &tty);
468*4882a593Smuzhiyun 		did0 = TRUE;
469*4882a593Smuzhiyun 		Baudrate = getspeed(tty.sg_ospeed);
470*4882a593Smuzhiyun 		return OK;
471*4882a593Smuzhiyun 	case 0:
472*4882a593Smuzhiyun 		if(!did0)
473*4882a593Smuzhiyun 			return ERROR;
474*4882a593Smuzhiyun 		ioctl(fd, TIOCSETP, &oldtty);
475*4882a593Smuzhiyun 		ioctl(fd, TIOCSETC, &oldtch);
476*4882a593Smuzhiyun 		ioctl(fd, TIOCNXCL, 0);
477*4882a593Smuzhiyun #ifdef LLITOUT
478*4882a593Smuzhiyun 		ioctl(fd, TIOCLSET, &Locmode);
479*4882a593Smuzhiyun #endif
480*4882a593Smuzhiyun #ifdef TIOCFLUSH
481*4882a593Smuzhiyun 		{ int x=1; ioctl(fd,TIOCFLUSH,&x); }
482*4882a593Smuzhiyun #endif
483*4882a593Smuzhiyun #endif
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 		return OK;
486*4882a593Smuzhiyun 	default:
487*4882a593Smuzhiyun 		return ERROR;
488*4882a593Smuzhiyun 	}
489*4882a593Smuzhiyun #endif
490*4882a593Smuzhiyun }
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun void
sendbrk(int fd)493*4882a593Smuzhiyun sendbrk(int fd)
494*4882a593Smuzhiyun {
495*4882a593Smuzhiyun #if 0
496*4882a593Smuzhiyun #ifdef USE_TERMIOS
497*4882a593Smuzhiyun 	tcsendbreak(fd,0);
498*4882a593Smuzhiyun #endif
499*4882a593Smuzhiyun #ifdef USE_TERMIO
500*4882a593Smuzhiyun 	ioctl(fd, TCSBRK, 0);
501*4882a593Smuzhiyun #endif
502*4882a593Smuzhiyun #ifdef USE_SGTTY
503*4882a593Smuzhiyun #ifdef TIOCSBRK
504*4882a593Smuzhiyun 	sleep(1);
505*4882a593Smuzhiyun 	ioctl(fd, TIOCSBRK, 0);
506*4882a593Smuzhiyun 	sleep(1);
507*4882a593Smuzhiyun 	ioctl(fd, TIOCCBRK, 0);
508*4882a593Smuzhiyun #endif
509*4882a593Smuzhiyun #endif
510*4882a593Smuzhiyun #endif
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun void
purgeline(int fd)514*4882a593Smuzhiyun purgeline(int fd)
515*4882a593Smuzhiyun {
516*4882a593Smuzhiyun 	readline_purge();
517*4882a593Smuzhiyun #if 0
518*4882a593Smuzhiyun #ifdef TCFLSH
519*4882a593Smuzhiyun 	ioctl(fd, TCFLSH, 0);
520*4882a593Smuzhiyun #else
521*4882a593Smuzhiyun 	lseek(fd, 0L, 2);
522*4882a593Smuzhiyun #endif
523*4882a593Smuzhiyun #endif
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun /* End of rbsb.c */
527