1/*
2 * Copyright (c) 1988, 1990, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *	@(#)externs.h	8.3 (Berkeley) 5/30/95
30 *	$FreeBSD$
31 */
32
33#ifndef	BSD
34# define BSD 43
35#endif
36
37/*
38 * ucb stdio.h defines BSD as something weird
39 */
40#if defined(sun) && defined(__svr4__)
41#define BSD 43
42#endif
43
44#ifndef	USE_TERMIO
45# if BSD > 43 || defined(SYSV_TERMIO)
46#  define USE_TERMIO
47# endif
48#endif
49
50#include <stdio.h>
51#include <setjmp.h>
52#include <sys/ioctl.h>
53#include <errno.h>
54#ifdef	USE_TERMIO
55# ifndef	VINTR
56#  include <termios.h>
57# endif
58# define termio termios
59#endif
60#if defined(NO_CC_T) || !defined(USE_TERMIO)
61# if !defined(USE_TERMIO)
62typedef char cc_t;
63# else
64typedef unsigned char cc_t;
65# endif
66#endif
67
68#include <string.h>
69
70#if defined(IPSEC)
71#include <netipsec/ipsec.h>
72#if defined(IPSEC_POLICY_IPSEC)
73extern char *ipsec_policy_in;
74extern char *ipsec_policy_out;
75#endif
76#endif
77
78#ifndef	_POSIX_VDISABLE
79# ifdef sun
80#  include <sys/param.h>	/* pick up VDISABLE definition, mayby */
81# endif
82# ifdef VDISABLE
83#  define _POSIX_VDISABLE VDISABLE
84# else
85#  define _POSIX_VDISABLE ((cc_t)'\377')
86# endif
87#endif
88
89#define	SUBBUFSIZE	256
90
91#if	!defined(P)
92# ifdef	__STDC__
93#  define	P(x)	x
94# else
95#  define	P(x)	()
96# endif
97#endif
98
99extern int
100    autologin,		/* Autologin enabled */
101    skiprc,		/* Don't process the ~/.telnetrc file */
102    eight,		/* use eight bit mode (binary in and/or out */
103    family,		/* address family of peer */
104    flushout,		/* flush output */
105    connected,		/* Are we connected to the other side? */
106    globalmode,		/* Mode tty should be in */
107    telnetport,		/* Are we connected to the telnet port? */
108    localflow,		/* Flow control handled locally */
109    restartany,		/* If flow control, restart output on any character */
110    localchars,		/* we recognize interrupt/quit */
111    donelclchars,	/* the user has set "localchars" */
112    showoptions,
113    net,		/* Network file descriptor */
114    tin,		/* Terminal input file descriptor */
115    tout,		/* Terminal output file descriptor */
116    crlf,		/* Should '\r' be mapped to <CR><LF> (or <CR><NUL>)? */
117    autoflush,		/* flush output when interrupting? */
118    autosynch,		/* send interrupt characters with SYNCH? */
119    SYNCHing,		/* Is the stream in telnet SYNCH mode? */
120    donebinarytoggle,	/* the user has put us in binary */
121    dontlecho,		/* do we suppress local echoing right now? */
122    crmod,
123    netdata,		/* Print out network data flow */
124    prettydump,		/* Print "netdata" output in user readable format */
125    termdata,		/* Print out terminal data flow */
126    telnet_debug,	/* Debug level */
127    doaddrlookup,	/* do a reverse lookup? */
128    clienteof;		/* Client received EOF */
129
130extern cc_t escape;	/* Escape to command mode */
131extern cc_t rlogin;	/* Rlogin mode escape character */
132#ifdef	KLUDGELINEMODE
133extern cc_t echoc;	/* Toggle local echoing */
134#endif
135
136extern char
137    *prompt;		/* Prompt for command. */
138
139extern char
140    doopt[],
141    dont[],
142    will[],
143    wont[],
144    options[],		/* All the little options */
145    *hostname;		/* Who are we connected to? */
146#ifdef	ENCRYPTION
147extern void (*encrypt_output)(unsigned char *, int);
148extern int (*decrypt_input)(int);
149#endif	/* ENCRYPTION */
150
151/*
152 * We keep track of each side of the option negotiation.
153 */
154
155#define	MY_STATE_WILL		0x01
156#define	MY_WANT_STATE_WILL	0x02
157#define	MY_STATE_DO		0x04
158#define	MY_WANT_STATE_DO	0x08
159
160/*
161 * Macros to check the current state of things
162 */
163
164#define	my_state_is_do(opt)		(options[opt]&MY_STATE_DO)
165#define	my_state_is_will(opt)		(options[opt]&MY_STATE_WILL)
166#define my_want_state_is_do(opt)	(options[opt]&MY_WANT_STATE_DO)
167#define my_want_state_is_will(opt)	(options[opt]&MY_WANT_STATE_WILL)
168
169#define	my_state_is_dont(opt)		(!my_state_is_do(opt))
170#define	my_state_is_wont(opt)		(!my_state_is_will(opt))
171#define my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))
172#define my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))
173
174#define	set_my_state_do(opt)		{options[opt] |= MY_STATE_DO;}
175#define	set_my_state_will(opt)		{options[opt] |= MY_STATE_WILL;}
176#define	set_my_want_state_do(opt)	{options[opt] |= MY_WANT_STATE_DO;}
177#define	set_my_want_state_will(opt)	{options[opt] |= MY_WANT_STATE_WILL;}
178
179#define	set_my_state_dont(opt)		{options[opt] &= ~MY_STATE_DO;}
180#define	set_my_state_wont(opt)		{options[opt] &= ~MY_STATE_WILL;}
181#define	set_my_want_state_dont(opt)	{options[opt] &= ~MY_WANT_STATE_DO;}
182#define	set_my_want_state_wont(opt)	{options[opt] &= ~MY_WANT_STATE_WILL;}
183
184/*
185 * Make everything symetrical
186 */
187
188#define	HIS_STATE_WILL			MY_STATE_DO
189#define	HIS_WANT_STATE_WILL		MY_WANT_STATE_DO
190#define HIS_STATE_DO			MY_STATE_WILL
191#define HIS_WANT_STATE_DO		MY_WANT_STATE_WILL
192
193#define	his_state_is_do			my_state_is_will
194#define	his_state_is_will		my_state_is_do
195#define his_want_state_is_do		my_want_state_is_will
196#define his_want_state_is_will		my_want_state_is_do
197
198#define	his_state_is_dont		my_state_is_wont
199#define	his_state_is_wont		my_state_is_dont
200#define his_want_state_is_dont		my_want_state_is_wont
201#define his_want_state_is_wont		my_want_state_is_dont
202
203#define	set_his_state_do		set_my_state_will
204#define	set_his_state_will		set_my_state_do
205#define	set_his_want_state_do		set_my_want_state_will
206#define	set_his_want_state_will		set_my_want_state_do
207
208#define	set_his_state_dont		set_my_state_wont
209#define	set_his_state_wont		set_my_state_dont
210#define	set_his_want_state_dont		set_my_want_state_wont
211#define	set_his_want_state_wont		set_my_want_state_dont
212
213#if	defined(USE_TERMIO)
214#define	SIG_FUNC_RET	void
215#else
216#define	SIG_FUNC_RET	int
217#endif
218
219#ifdef	SIGINFO
220extern SIG_FUNC_RET
221    ayt_status(void);
222#endif
223
224extern FILE
225    *NetTrace;		/* Where debugging output goes */
226extern unsigned char
227    NetTraceFile[];	/* Name of file where debugging output goes */
228extern void
229    SetNetTrace(char *);	/* Function to change where debugging goes */
230extern unsigned char
231    ComPortBaudRate[];	/* Baud rate of the remote end */
232extern void
233    DoBaudRate(char *);	/* Function to set the baud rate of the remote end */
234
235extern jmp_buf
236    toplevel;		/* For error conditions. */
237
238extern void
239    command(int, const char *, int),
240    Dump(char, unsigned char *, int),
241    env_init(void),
242    Exit(int),
243    ExitString(const char *, int),
244    init_network(void),
245    init_sys(void),
246    init_telnet(void),
247    init_terminal(void),
248    intp(void),
249    optionstatus(void),
250    printoption(const char *, int, int),
251    printsub(char, unsigned char *, int),
252    quit(void),
253    sendabort(void),
254    sendbrk(void),
255    sendeof(void),
256    sendsusp(void),
257    sendnaws(void),
258    sendayt(void),
259    setconnmode(int),
260    setcommandmode(void),
261    set_escape_char(char *s),
262    setneturg(void),
263    sys_telnet_init(void),
264    telnet(char *),
265    tel_enter_binary(int),
266    tel_leave_binary(int),
267    TerminalFlushOutput(void),
268    TerminalNewMode(int),
269    TerminalRestoreState(void),
270    TerminalSaveState(void),
271    TerminalDefaultChars(void),
272    TerminalSpeeds(long *, long *),
273    tninit(void),
274    upcase(char *),
275    willoption(int),
276    wontoption(int);
277
278extern void
279    send_do(int, int),
280    send_dont(int, int),
281    send_will(int, int),
282    send_wont(int, int);
283
284extern void
285    lm_will(unsigned char *, int),
286    lm_wont(unsigned char *, int),
287    lm_do(unsigned char *, int),
288    lm_dont(unsigned char *, int),
289    lm_mode(unsigned char *, int, int);
290
291extern void
292    slc_init(void),
293    slcstate(void),
294    slc_mode_export(void),
295    slc_mode_import(int),
296    slc_import(int),
297    slc_export(void),
298    slc(unsigned char *, int),
299    slc_check(void),
300    slc_start_reply(void),
301    slc_add_reply(unsigned char, unsigned char, cc_t),
302    slc_end_reply(void);
303extern int
304    getconnmode(void),
305    opt_welldefined(const char *),
306    NetClose(int),
307    netflush(void),
308    process_rings(int, int, int, int, int, int),
309    rlogin_susp(void),
310    SetSockOpt(int, int, int, int),
311    slc_update(void),
312    stilloob(void),
313    telrcv(void),
314    TerminalRead(char *, int),
315    TerminalWrite(char *, int),
316    TerminalAutoFlush(void),
317    TerminalWindowSize(long *, long *),
318    TerminalSpecialChars(int),
319    tn(int, char **),
320    ttyflush(int);
321
322extern void
323    env_opt(unsigned char *, int),
324    env_opt_start(void),
325    env_opt_start_info(void),
326    env_opt_add(unsigned char *),
327    env_opt_end(int);
328
329extern unsigned char
330    *env_default(int, int),
331    *env_getvalue(const unsigned char *);
332
333extern int
334    get_status(char *),
335    dosynch(char *);
336
337extern cc_t
338    *tcval(int);
339
340#ifndef	USE_TERMIO
341
342extern struct	tchars ntc;
343extern struct	ltchars nltc;
344extern struct	sgttyb nttyb;
345
346# define termEofChar		ntc.t_eofc
347# define termEraseChar		nttyb.sg_erase
348# define termFlushChar		nltc.t_flushc
349# define termIntChar		ntc.t_intrc
350# define termKillChar		nttyb.sg_kill
351# define termLiteralNextChar	nltc.t_lnextc
352# define termQuitChar		ntc.t_quitc
353# define termSuspChar		nltc.t_suspc
354# define termRprntChar		nltc.t_rprntc
355# define termWerasChar		nltc.t_werasc
356# define termStartChar		ntc.t_startc
357# define termStopChar		ntc.t_stopc
358# define termForw1Char		ntc.t_brkc
359extern cc_t termForw2Char;
360extern cc_t termAytChar;
361
362# define termEofCharp		(cc_t *)&ntc.t_eofc
363# define termEraseCharp		(cc_t *)&nttyb.sg_erase
364# define termFlushCharp		(cc_t *)&nltc.t_flushc
365# define termIntCharp		(cc_t *)&ntc.t_intrc
366# define termKillCharp		(cc_t *)&nttyb.sg_kill
367# define termLiteralNextCharp	(cc_t *)&nltc.t_lnextc
368# define termQuitCharp		(cc_t *)&ntc.t_quitc
369# define termSuspCharp		(cc_t *)&nltc.t_suspc
370# define termRprntCharp		(cc_t *)&nltc.t_rprntc
371# define termWerasCharp		(cc_t *)&nltc.t_werasc
372# define termStartCharp		(cc_t *)&ntc.t_startc
373# define termStopCharp		(cc_t *)&ntc.t_stopc
374# define termForw1Charp		(cc_t *)&ntc.t_brkc
375# define termForw2Charp		(cc_t *)&termForw2Char
376# define termAytCharp		(cc_t *)&termAytChar
377
378# else
379
380extern struct	termio new_tc;
381
382# define termEofChar		new_tc.c_cc[VEOF]
383# define termEraseChar		new_tc.c_cc[VERASE]
384# define termIntChar		new_tc.c_cc[VINTR]
385# define termKillChar		new_tc.c_cc[VKILL]
386# define termQuitChar		new_tc.c_cc[VQUIT]
387
388# ifndef	VSUSP
389extern cc_t termSuspChar;
390# else
391#  define termSuspChar		new_tc.c_cc[VSUSP]
392# endif
393# if	defined(VFLUSHO) && !defined(VDISCARD)
394#  define VDISCARD VFLUSHO
395# endif
396# ifndef	VDISCARD
397extern cc_t termFlushChar;
398# else
399#  define termFlushChar		new_tc.c_cc[VDISCARD]
400# endif
401# ifndef VWERASE
402extern cc_t termWerasChar;
403# else
404#  define termWerasChar		new_tc.c_cc[VWERASE]
405# endif
406# ifndef	VREPRINT
407extern cc_t termRprntChar;
408# else
409#  define termRprntChar		new_tc.c_cc[VREPRINT]
410# endif
411# ifndef	VLNEXT
412extern cc_t termLiteralNextChar;
413# else
414#  define termLiteralNextChar	new_tc.c_cc[VLNEXT]
415# endif
416# ifndef	VSTART
417extern cc_t termStartChar;
418# else
419#  define termStartChar		new_tc.c_cc[VSTART]
420# endif
421# ifndef	VSTOP
422extern cc_t termStopChar;
423# else
424#  define termStopChar		new_tc.c_cc[VSTOP]
425# endif
426# ifndef	VEOL
427extern cc_t termForw1Char;
428# else
429#  define termForw1Char		new_tc.c_cc[VEOL]
430# endif
431# ifndef	VEOL2
432extern cc_t termForw2Char;
433# else
434#  define termForw2Char		new_tc.c_cc[VEOL]
435# endif
436# ifndef	VSTATUS
437extern cc_t termAytChar;
438#else
439#  define termAytChar		new_tc.c_cc[VSTATUS]
440#endif
441
442# if defined(__STDC__)
443#  define termEofCharp		&termEofChar
444#  define termEraseCharp	&termEraseChar
445#  define termIntCharp		&termIntChar
446#  define termKillCharp		&termKillChar
447#  define termQuitCharp		&termQuitChar
448#  define termSuspCharp		&termSuspChar
449#  define termFlushCharp	&termFlushChar
450#  define termWerasCharp	&termWerasChar
451#  define termRprntCharp	&termRprntChar
452#  define termLiteralNextCharp	&termLiteralNextChar
453#  define termStartCharp	&termStartChar
454#  define termStopCharp		&termStopChar
455#  define termForw1Charp	&termForw1Char
456#  define termForw2Charp	&termForw2Char
457#  define termAytCharp		&termAytChar
458# else
459	/* Work around a compiler bug */
460#  define termEofCharp		0
461#  define termEraseCharp	0
462#  define termIntCharp		0
463#  define termKillCharp		0
464#  define termQuitCharp		0
465#  define termSuspCharp		0
466#  define termFlushCharp	0
467#  define termWerasCharp	0
468#  define termRprntCharp	0
469#  define termLiteralNextCharp	0
470#  define termStartCharp	0
471#  define termStopCharp		0
472#  define termForw1Charp	0
473#  define termForw2Charp	0
474#  define termAytCharp		0
475# endif
476#endif
477
478typedef struct {
479    int
480	system,			/* what the current time is */
481	echotoggle,		/* last time user entered echo character */
482	modenegotiated,		/* last time operating mode negotiated */
483	didnetreceive,		/* last time we read data from network */
484	gotDM;			/* when did we last see a data mark */
485} Clocks;
486
487extern Clocks clocks;
488
489/* Ring buffer structures which are shared */
490
491extern Ring
492    netoring,
493    netiring,
494    ttyoring,
495    ttyiring;
496
497extern void
498    xmitAO(void),
499    xmitEC(void),
500    xmitEL(void);
501