xref: /csrg-svn/usr.bin/telnet/sys_bsd.c (revision 32147)
1*32147Sminshall /*
2*32147Sminshall  * The following routines try to encapsulate what is system dependent
3*32147Sminshall  * (at least between 4.x and dos) which is used in telnet.c.
4*32147Sminshall  */
5*32147Sminshall 
6*32147Sminshall #if	defined(unix)
7*32147Sminshall 
8*32147Sminshall #include <sys/ioctl.h>
9*32147Sminshall #include <sys/time.h>
10*32147Sminshall #include <signal.h>
11*32147Sminshall 
12*32147Sminshall #include "defines.h"
13*32147Sminshall #include "externs.h"
14*32147Sminshall #include "types.h"
15*32147Sminshall 
16*32147Sminshall int
17*32147Sminshall 	HaveInput;		/* There is input available to scan */
18*32147Sminshall 
19*32147Sminshall #if	defined(TN3270)
20*32147Sminshall static char	tline[200];
21*32147Sminshall char	*transcom = 0;	/* transparent mode command (default: none) */
22*32147Sminshall #endif	/* defined(TN3270) */
23*32147Sminshall 
24*32147Sminshall static struct	tchars otc = { 0 }, ntc = { 0 };
25*32147Sminshall static struct	ltchars oltc = { 0 }, nltc = { 0 };
26*32147Sminshall static struct	sgttyb ottyb = { 0 }, nttyb = { 0 };
27*32147Sminshall 
28*32147Sminshall 
29*32147Sminshall TerminalWrite(fd, buf, n)
30*32147Sminshall int	fd;
31*32147Sminshall char	*buf;
32*32147Sminshall int	n;
33*32147Sminshall {
34*32147Sminshall     return write(fd, buf, n);
35*32147Sminshall }
36*32147Sminshall 
37*32147Sminshall TerminalRead(fd, buf, n)
38*32147Sminshall int	fd;
39*32147Sminshall char	*buf;
40*32147Sminshall int	n;
41*32147Sminshall {
42*32147Sminshall     return read(fd, buf, n);
43*32147Sminshall }
44*32147Sminshall 
45*32147Sminshall /*
46*32147Sminshall  *
47*32147Sminshall  */
48*32147Sminshall 
49*32147Sminshall int
50*32147Sminshall TerminalAutoFlush()					/* unix */
51*32147Sminshall {
52*32147Sminshall #if	defined(LNOFLSH)
53*32147Sminshall     int flush;
54*32147Sminshall 
55*32147Sminshall     ioctl(0, TIOCLGET, (char *)&flush);
56*32147Sminshall     return !(flush&LNOFLSH);	/* if LNOFLSH, no autoflush */
57*32147Sminshall #else	/* LNOFLSH */
58*32147Sminshall     return 1;
59*32147Sminshall #endif	/* LNOFLSH */
60*32147Sminshall }
61*32147Sminshall 
62*32147Sminshall /*
63*32147Sminshall  * TerminalSpecialChars()
64*32147Sminshall  *
65*32147Sminshall  * Look at an input character to see if it is a special character
66*32147Sminshall  * and decide what to do.
67*32147Sminshall  *
68*32147Sminshall  * Output:
69*32147Sminshall  *
70*32147Sminshall  *	0	Don't add this character.
71*32147Sminshall  *	1	Do add this character
72*32147Sminshall  */
73*32147Sminshall 
74*32147Sminshall int
75*32147Sminshall TerminalSpecialChars(c)			/* unix */
76*32147Sminshall int	c;
77*32147Sminshall {
78*32147Sminshall     void doflush(), intp(), sendbrk();
79*32147Sminshall 
80*32147Sminshall     if (c == ntc.t_intrc) {
81*32147Sminshall 	intp();
82*32147Sminshall 	return 0;
83*32147Sminshall     } else if (c == ntc.t_quitc) {
84*32147Sminshall 	sendbrk();
85*32147Sminshall 	return 0;
86*32147Sminshall     } else if (c == nltc.t_flushc) {
87*32147Sminshall 	xmitAO();		/* Transmit Abort Output */
88*32147Sminshall 	return 0;
89*32147Sminshall     } else if (!MODE_LOCAL_CHARS(globalmode)) {
90*32147Sminshall 	if (c == nttyb.sg_kill) {
91*32147Sminshall 	    xmitEL();
92*32147Sminshall 	    return 0;
93*32147Sminshall 	} else if (c == nttyb.sg_erase) {
94*32147Sminshall 	    xmitEC();		/* Transmit Erase Character */
95*32147Sminshall 	    return 0;
96*32147Sminshall 	}
97*32147Sminshall     }
98*32147Sminshall     return 1;
99*32147Sminshall }
100*32147Sminshall 
101*32147Sminshall 
102*32147Sminshall /*
103*32147Sminshall  * Flush output to the terminal
104*32147Sminshall  */
105*32147Sminshall 
106*32147Sminshall void
107*32147Sminshall TerminalFlushOutput()				/* unix */
108*32147Sminshall {
109*32147Sminshall     (void) ioctl(fileno(stdout), TIOCFLUSH, (char *) 0);
110*32147Sminshall }
111*32147Sminshall 
112*32147Sminshall void
113*32147Sminshall TerminalSaveState()				/* unix */
114*32147Sminshall {
115*32147Sminshall     ioctl(0, TIOCGETP, (char *)&ottyb);
116*32147Sminshall     ioctl(0, TIOCGETC, (char *)&otc);
117*32147Sminshall     ioctl(0, TIOCGLTC, (char *)&oltc);
118*32147Sminshall 
119*32147Sminshall     ntc = otc;
120*32147Sminshall     nltc = oltc;
121*32147Sminshall     nttyb = ottyb;
122*32147Sminshall }
123*32147Sminshall 
124*32147Sminshall void
125*32147Sminshall TerminalRestoreState()				/* unix */
126*32147Sminshall {
127*32147Sminshall }
128*32147Sminshall 
129*32147Sminshall /*
130*32147Sminshall  * TerminalNewMode - set up terminal to a specific mode.
131*32147Sminshall  */
132*32147Sminshall 
133*32147Sminshall 
134*32147Sminshall void
135*32147Sminshall TerminalNewMode(fd_in, fd_out, f)			/* unix */
136*32147Sminshall int	fd_in, fd_out;		/* File descriptor */
137*32147Sminshall register int f;
138*32147Sminshall {
139*32147Sminshall     static int prevmode = 0;
140*32147Sminshall     struct tchars *tc;
141*32147Sminshall     struct tchars tc3;
142*32147Sminshall     struct ltchars *ltc;
143*32147Sminshall     struct sgttyb sb;
144*32147Sminshall     int onoff;
145*32147Sminshall     int old;
146*32147Sminshall     struct	tchars notc2;
147*32147Sminshall     struct	ltchars noltc2;
148*32147Sminshall     static struct	tchars notc =	{ -1, -1, -1, -1, -1, -1 };
149*32147Sminshall     static struct	ltchars noltc =	{ -1, -1, -1, -1, -1, -1 };
150*32147Sminshall 
151*32147Sminshall     globalmode = f;
152*32147Sminshall     if (prevmode == f)
153*32147Sminshall 	return;
154*32147Sminshall     old = prevmode;
155*32147Sminshall     prevmode = f;
156*32147Sminshall     sb = nttyb;
157*32147Sminshall 
158*32147Sminshall     switch (f) {
159*32147Sminshall 
160*32147Sminshall     case 0:
161*32147Sminshall 	onoff = 0;
162*32147Sminshall 	tc = &otc;
163*32147Sminshall 	ltc = &oltc;
164*32147Sminshall 	break;
165*32147Sminshall 
166*32147Sminshall     case 1:		/* remote character processing, remote echo */
167*32147Sminshall     case 2:		/* remote character processing, local echo */
168*32147Sminshall     case 6:		/* 3270 mode - like 1, but with xon/xoff local */
169*32147Sminshall 		    /* (might be nice to have "6" in telnet also...) */
170*32147Sminshall 	    sb.sg_flags |= CBREAK;
171*32147Sminshall 	    if ((f == 1) || (f == 6)) {
172*32147Sminshall 		sb.sg_flags &= ~(ECHO|CRMOD);
173*32147Sminshall 	    } else {
174*32147Sminshall 		sb.sg_flags |= ECHO|CRMOD;
175*32147Sminshall 	    }
176*32147Sminshall 	    sb.sg_erase = sb.sg_kill = -1;
177*32147Sminshall 	    if (f == 6) {
178*32147Sminshall 		tc = &tc3;
179*32147Sminshall 		tc3 = notc;
180*32147Sminshall 		    /* get XON, XOFF characters */
181*32147Sminshall 		tc3.t_startc = otc.t_startc;
182*32147Sminshall 		tc3.t_stopc = otc.t_stopc;
183*32147Sminshall 	    } else {
184*32147Sminshall 		/*
185*32147Sminshall 		 * If user hasn't specified one way or the other,
186*32147Sminshall 		 * then default to not trapping signals.
187*32147Sminshall 		 */
188*32147Sminshall 		if (!donelclchars) {
189*32147Sminshall 		    localchars = 0;
190*32147Sminshall 		}
191*32147Sminshall 		if (localchars) {
192*32147Sminshall 		    notc2 = notc;
193*32147Sminshall 		    notc2.t_intrc = ntc.t_intrc;
194*32147Sminshall 		    notc2.t_quitc = ntc.t_quitc;
195*32147Sminshall 		    tc = &notc2;
196*32147Sminshall 		} else {
197*32147Sminshall 		    tc = &notc;
198*32147Sminshall 		}
199*32147Sminshall 	    }
200*32147Sminshall 	    ltc = &noltc;
201*32147Sminshall 	    onoff = 1;
202*32147Sminshall 	    break;
203*32147Sminshall     case 3:		/* local character processing, remote echo */
204*32147Sminshall     case 4:		/* local character processing, local echo */
205*32147Sminshall     case 5:		/* local character processing, no echo */
206*32147Sminshall 	    sb.sg_flags &= ~CBREAK;
207*32147Sminshall 	    sb.sg_flags |= CRMOD;
208*32147Sminshall 	    if (f == 4)
209*32147Sminshall 		sb.sg_flags |= ECHO;
210*32147Sminshall 	    else
211*32147Sminshall 		sb.sg_flags &= ~ECHO;
212*32147Sminshall 	    notc2 = ntc;
213*32147Sminshall 	    tc = &notc2;
214*32147Sminshall 	    noltc2 = oltc;
215*32147Sminshall 	    ltc = &noltc2;
216*32147Sminshall 	    /*
217*32147Sminshall 	     * If user hasn't specified one way or the other,
218*32147Sminshall 	     * then default to trapping signals.
219*32147Sminshall 	     */
220*32147Sminshall 	    if (!donelclchars) {
221*32147Sminshall 		localchars = 1;
222*32147Sminshall 	    }
223*32147Sminshall 	    if (localchars) {
224*32147Sminshall 		notc2.t_brkc = nltc.t_flushc;
225*32147Sminshall 		noltc2.t_flushc = -1;
226*32147Sminshall 	    } else {
227*32147Sminshall 		notc2.t_intrc = notc2.t_quitc = -1;
228*32147Sminshall 	    }
229*32147Sminshall 	    noltc2.t_suspc = escape;
230*32147Sminshall 	    noltc2.t_dsuspc = -1;
231*32147Sminshall 	    onoff = 1;
232*32147Sminshall 	    break;
233*32147Sminshall 
234*32147Sminshall     default:
235*32147Sminshall 	    return;
236*32147Sminshall     }
237*32147Sminshall     ioctl(fd_in, TIOCSLTC, (char *)ltc);
238*32147Sminshall     ioctl(fd_in, TIOCSETC, (char *)tc);
239*32147Sminshall     ioctl(fd_in, TIOCSETP, (char *)&sb);
240*32147Sminshall #if	(!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR))
241*32147Sminshall     ioctl(fd_in, FIONBIO, (char *)&onoff);
242*32147Sminshall     ioctl(fd_out, FIONBIO, (char *)&onoff);
243*32147Sminshall #endif	/* (!defined(TN3270)) || ((!defined(NOT43)) || defined(PUTCHAR)) */
244*32147Sminshall #if	defined(TN3270)
245*32147Sminshall     if (noasynch == 0) {
246*32147Sminshall 	ioctl(fd_in, FIOASYNC, (char *)&onoff);
247*32147Sminshall     }
248*32147Sminshall #endif	/* defined(TN3270) */
249*32147Sminshall 
250*32147Sminshall     if (MODE_LINE(f)) {
251*32147Sminshall 	void doescape();
252*32147Sminshall 
253*32147Sminshall 	signal(SIGTSTP, doescape);
254*32147Sminshall     } else if (MODE_LINE(old)) {
255*32147Sminshall 	signal(SIGTSTP, SIG_DFL);
256*32147Sminshall 	sigsetmask(sigblock(0) & ~(1<<(SIGTSTP-1)));
257*32147Sminshall     }
258*32147Sminshall }
259*32147Sminshall 
260*32147Sminshall 
261*32147Sminshall int
262*32147Sminshall NetClose(net)
263*32147Sminshall int	net;
264*32147Sminshall {
265*32147Sminshall     return close(net);
266*32147Sminshall }
267*32147Sminshall 
268*32147Sminshall 
269*32147Sminshall void
270*32147Sminshall NetNonblockingIO(fd, onoff)				/* unix */
271*32147Sminshall int
272*32147Sminshall 	fd,
273*32147Sminshall 	onoff;
274*32147Sminshall {
275*32147Sminshall     ioctl(fd, FIONBIO, (char *)&onoff);
276*32147Sminshall }
277*32147Sminshall 
278*32147Sminshall void
279*32147Sminshall NetSigIO(fd, onoff)				/* unix */
280*32147Sminshall int
281*32147Sminshall 	fd,
282*32147Sminshall 	onoff;
283*32147Sminshall {
284*32147Sminshall     ioctl(fd, FIOASYNC, (char *)&onoff);	/* hear about input */
285*32147Sminshall }
286*32147Sminshall 
287*32147Sminshall void
288*32147Sminshall NetSetPgrp(fd)				/* unix */
289*32147Sminshall int fd;
290*32147Sminshall {
291*32147Sminshall     int myPid;
292*32147Sminshall 
293*32147Sminshall     myPid = getpid();
294*32147Sminshall #if	defined(NOT43)
295*32147Sminshall     myPid = -myPid;
296*32147Sminshall #endif	/* defined(NOT43) */
297*32147Sminshall     ioctl(fd, SIOCSPGRP, (char *)&myPid);	/* set my pid */
298*32147Sminshall }
299*32147Sminshall 
300*32147Sminshall 
301*32147Sminshall #endif	/* defined(unix) */
302