157416Smarkm/*
257416Smarkm * Copyright (c) 1988, 1990, 1993
357416Smarkm *	The Regents of the University of California.  All rights reserved.
457416Smarkm *
557416Smarkm * Redistribution and use in source and binary forms, with or without
657416Smarkm * modification, are permitted provided that the following conditions
757416Smarkm * are met:
857416Smarkm * 1. Redistributions of source code must retain the above copyright
957416Smarkm *    notice, this list of conditions and the following disclaimer.
1057416Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1157416Smarkm *    notice, this list of conditions and the following disclaimer in the
1257416Smarkm *    documentation and/or other materials provided with the distribution.
1357416Smarkm * 3. All advertising materials mentioning features or use of this software
1457416Smarkm *    must display the following acknowledgement:
1557416Smarkm *	This product includes software developed by the University of
1657416Smarkm *	California, Berkeley and its contributors.
1757416Smarkm * 4. Neither the name of the University nor the names of its contributors
1857416Smarkm *    may be used to endorse or promote products derived from this software
1957416Smarkm *    without specific prior written permission.
2057416Smarkm *
2157416Smarkm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2257416Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2357416Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2457416Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2557416Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2657416Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2757416Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2857416Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2957416Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3057416Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3157416Smarkm * SUCH DAMAGE.
3257416Smarkm *
3357416Smarkm *	@(#)externs.h	8.3 (Berkeley) 5/30/95
3457416Smarkm */
3557416Smarkm
36233294Sstas/* $Id$ */
3757416Smarkm
3857416Smarkm#ifndef	BSD
3957416Smarkm# define BSD 43
4057416Smarkm#endif
4157416Smarkm
4257416Smarkm#ifndef	_POSIX_VDISABLE
4357416Smarkm# ifdef sun
4457416Smarkm#  include <sys/param.h>	/* pick up VDISABLE definition, mayby */
4557416Smarkm# endif
4657416Smarkm# ifdef VDISABLE
4757416Smarkm#  define _POSIX_VDISABLE VDISABLE
4857416Smarkm# else
4957416Smarkm#  define _POSIX_VDISABLE ((cc_t)'\377')
5057416Smarkm# endif
5157416Smarkm#endif
5257416Smarkm
5357416Smarkm#define	SUBBUFSIZE	256
5457416Smarkm
5557416Smarkmextern int
5657416Smarkm    autologin,		/* Autologin enabled */
5757416Smarkm    skiprc,		/* Don't process the ~/.telnetrc file */
5857416Smarkm    eight,		/* use eight bit mode (binary in and/or out */
5957416Smarkm    binary,
6057416Smarkm    flushout,		/* flush output */
6157416Smarkm    connected,		/* Are we connected to the other side? */
6257416Smarkm    globalmode,		/* Mode tty should be in */
6357416Smarkm    telnetport,		/* Are we connected to the telnet port? */
6457416Smarkm    localflow,		/* Flow control handled locally */
6557416Smarkm    restartany,		/* If flow control, restart output on any character */
6657416Smarkm    localchars,		/* we recognize interrupt/quit */
6757416Smarkm    donelclchars,	/* the user has set "localchars" */
6857416Smarkm    showoptions,
6990926Snectar    wantencryption,	/* User has requested encryption */
7057416Smarkm    net,		/* Network file descriptor */
7157416Smarkm    tin,		/* Terminal input file descriptor */
7257416Smarkm    tout,		/* Terminal output file descriptor */
7357416Smarkm    crlf,		/* Should '\r' be mapped to <CR><LF> (or <CR><NUL>)? */
7457416Smarkm    autoflush,		/* flush output when interrupting? */
7557416Smarkm    autosynch,		/* send interrupt characters with SYNCH? */
7657416Smarkm    SYNCHing,		/* Is the stream in telnet SYNCH mode? */
7757416Smarkm    donebinarytoggle,	/* the user has put us in binary */
7857416Smarkm    dontlecho,		/* do we suppress local echoing right now? */
7957416Smarkm    crmod,
8057416Smarkm    netdata,		/* Print out network data flow */
8157416Smarkm    prettydump,		/* Print "netdata" output in user readable format */
8257416Smarkm    termdata,		/* Print out terminal data flow */
8357416Smarkm    debug;		/* Debug level */
8457416Smarkm
8590926Snectarextern int intr_happened, intr_waiting;	/* for interrupt handling */
8690926Snectar
8757416Smarkmextern cc_t escape;	/* Escape to command mode */
8857416Smarkmextern cc_t rlogin;	/* Rlogin mode escape character */
8957416Smarkm#ifdef	KLUDGELINEMODE
9057416Smarkmextern cc_t echoc;	/* Toggle local echoing */
9157416Smarkm#endif
9257416Smarkm
9357416Smarkmextern char
9457416Smarkm    *prompt;		/* Prompt for command. */
9557416Smarkm
9657416Smarkmextern char
9757416Smarkm    doopt[],
9857416Smarkm    dont[],
9957416Smarkm    will[],
10057416Smarkm    wont[],
10190926Snectar    do_dont_resp[],
10290926Snectar    will_wont_resp[],
10357416Smarkm    options[],		/* All the little options */
10457416Smarkm    *hostname;		/* Who are we connected to? */
10557416Smarkm#if	defined(ENCRYPTION)
10657416Smarkmextern void (*encrypt_output) (unsigned char *, int);
10757416Smarkmextern int (*decrypt_input) (int);
10857416Smarkm#endif
10957416Smarkm
11057416Smarkm/*
11157416Smarkm * We keep track of each side of the option negotiation.
11257416Smarkm */
11357416Smarkm
11457416Smarkm#define	MY_STATE_WILL		0x01
11557416Smarkm#define	MY_WANT_STATE_WILL	0x02
11657416Smarkm#define	MY_STATE_DO		0x04
11757416Smarkm#define	MY_WANT_STATE_DO	0x08
11857416Smarkm
11957416Smarkm/*
12057416Smarkm * Macros to check the current state of things
12157416Smarkm */
12257416Smarkm
12357416Smarkm#define	my_state_is_do(opt)		(options[opt]&MY_STATE_DO)
12457416Smarkm#define	my_state_is_will(opt)		(options[opt]&MY_STATE_WILL)
12557416Smarkm#define my_want_state_is_do(opt)	(options[opt]&MY_WANT_STATE_DO)
12657416Smarkm#define my_want_state_is_will(opt)	(options[opt]&MY_WANT_STATE_WILL)
12757416Smarkm
12857416Smarkm#define	my_state_is_dont(opt)		(!my_state_is_do(opt))
12957416Smarkm#define	my_state_is_wont(opt)		(!my_state_is_will(opt))
13057416Smarkm#define my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))
13157416Smarkm#define my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))
13257416Smarkm
13357416Smarkm#define	set_my_state_do(opt)		{options[opt] |= MY_STATE_DO;}
13457416Smarkm#define	set_my_state_will(opt)		{options[opt] |= MY_STATE_WILL;}
13557416Smarkm#define	set_my_want_state_do(opt)	{options[opt] |= MY_WANT_STATE_DO;}
13657416Smarkm#define	set_my_want_state_will(opt)	{options[opt] |= MY_WANT_STATE_WILL;}
13757416Smarkm
13857416Smarkm#define	set_my_state_dont(opt)		{options[opt] &= ~MY_STATE_DO;}
13957416Smarkm#define	set_my_state_wont(opt)		{options[opt] &= ~MY_STATE_WILL;}
14057416Smarkm#define	set_my_want_state_dont(opt)	{options[opt] &= ~MY_WANT_STATE_DO;}
14157416Smarkm#define	set_my_want_state_wont(opt)	{options[opt] &= ~MY_WANT_STATE_WILL;}
14257416Smarkm
14357416Smarkm/*
14490926Snectar * Make everything symmetrical
14557416Smarkm */
14657416Smarkm
14757416Smarkm#define	HIS_STATE_WILL			MY_STATE_DO
14857416Smarkm#define	HIS_WANT_STATE_WILL		MY_WANT_STATE_DO
14957416Smarkm#define HIS_STATE_DO			MY_STATE_WILL
15057416Smarkm#define HIS_WANT_STATE_DO		MY_WANT_STATE_WILL
15157416Smarkm
15257416Smarkm#define	his_state_is_do			my_state_is_will
15357416Smarkm#define	his_state_is_will		my_state_is_do
15457416Smarkm#define his_want_state_is_do		my_want_state_is_will
15557416Smarkm#define his_want_state_is_will		my_want_state_is_do
15657416Smarkm
15757416Smarkm#define	his_state_is_dont		my_state_is_wont
15857416Smarkm#define	his_state_is_wont		my_state_is_dont
15957416Smarkm#define his_want_state_is_dont		my_want_state_is_wont
16057416Smarkm#define his_want_state_is_wont		my_want_state_is_dont
16157416Smarkm
16257416Smarkm#define	set_his_state_do		set_my_state_will
16357416Smarkm#define	set_his_state_will		set_my_state_do
16457416Smarkm#define	set_his_want_state_do		set_my_want_state_will
16557416Smarkm#define	set_his_want_state_will		set_my_want_state_do
16657416Smarkm
16757416Smarkm#define	set_his_state_dont		set_my_state_wont
16857416Smarkm#define	set_his_state_wont		set_my_state_dont
16957416Smarkm#define	set_his_want_state_dont		set_my_want_state_wont
17057416Smarkm#define	set_his_want_state_wont		set_my_want_state_dont
17157416Smarkm
17257416Smarkm
17357416Smarkmextern FILE
17457416Smarkm    *NetTrace;		/* Where debugging output goes */
17557416Smarkmextern char
17657416Smarkm    NetTraceFile[];	/* Name of file where debugging output goes */
17757416Smarkmextern void
17857416Smarkm    SetNetTrace (char *);	/* Function to change where debugging goes */
17957416Smarkm
18057416Smarkmextern jmp_buf
18157416Smarkm    peerdied,
18257416Smarkm    toplevel;		/* For error conditions. */
18357416Smarkm
184178825Sdfrint Scheduler(int);
185178825Sdfrextern int scheduler_lockout_tty;
186178825Sdfr
187178825Sdfr
18857416Smarkm/* authenc.c */
18957416Smarkm
19057416Smarkm#if	defined(AUTHENTICATION) || defined(ENCRYPTION)
19157416Smarkmint telnet_net_write(unsigned char *str, int len);
19257416Smarkmvoid net_encrypt(void);
19357416Smarkmint telnet_spin(void);
19472445Sassarchar *telnet_getenv(const char *val);
19557416Smarkmchar *telnet_gets(char *prompt, char *result, int length, int echo);
19657416Smarkm#endif
19757416Smarkm
19857416Smarkm/* commands.c */
19957416Smarkm
20057416Smarkmstruct env_lst *env_define (unsigned char *, unsigned char *);
20157416Smarkmstruct env_lst *env_find(unsigned char *var);
20257416Smarkmvoid env_init (void);
20357416Smarkmvoid env_undefine (unsigned char *);
20457416Smarkmvoid env_export (unsigned char *);
20557416Smarkmvoid env_unexport (unsigned char *);
20657416Smarkmvoid env_send (unsigned char *);
20757416Smarkmvoid env_list (void);
20857416Smarkmunsigned char * env_default(int init, int welldefined);
20957416Smarkmunsigned char * env_getvalue(unsigned char *var);
21057416Smarkm
21157416Smarkmvoid set_escape_char(char *s);
21272445Sassarint sourceroute(struct addrinfo *ai, char *arg, char **cpp,
21372445Sassar		int *prototp, int *optp);
21457416Smarkm
21557416Smarkm#if	defined(AUTHENTICATION)
21657416Smarkmint auth_enable (char *);
21757416Smarkmint auth_disable (char *);
21857416Smarkmint auth_status (void);
21957416Smarkm#endif
22057416Smarkm
22157416Smarkm#if defined(ENCRYPTION)
22257416Smarkmint 	EncryptEnable (char *, char *);
22357416Smarkmint 	EncryptDisable (char *, char *);
22457416Smarkmint 	EncryptType (char *, char *);
22557416Smarkmint 	EncryptStart (char *);
22657416Smarkmint 	EncryptStartInput (void);
22757416Smarkmint 	EncryptStartOutput (void);
22857416Smarkmint 	EncryptStop (char *);
22957416Smarkmint 	EncryptStopInput (void);
23057416Smarkmint 	EncryptStopOutput (void);
23157416Smarkmint 	EncryptStatus (void);
23257416Smarkm#endif
23357416Smarkm
23457416Smarkm#ifdef SIGINFO
23578527SassarRETSIGTYPE ayt_status(int);
23657416Smarkm#endif
23757416Smarkmint tn(int argc, char **argv);
23857416Smarkmvoid command(int top, char *tbuf, int cnt);
23957416Smarkm
24057416Smarkm/* main.c */
24157416Smarkm
24257416Smarkmvoid tninit(void);
243102644Snectarvoid set_forward_options(void);
24457416Smarkm
24557416Smarkm/* network.c */
24657416Smarkm
24757416Smarkmvoid init_network(void);
24857416Smarkmint stilloob(void);
24957416Smarkmvoid setneturg(void);
25057416Smarkmint netflush(void);
25157416Smarkm
25257416Smarkm/* sys_bsd.c */
25357416Smarkm
25457416Smarkmvoid init_sys(void);
25557416Smarkmint TerminalWrite(char *buf, int n);
25657416Smarkmint TerminalRead(unsigned char *buf, int n);
25757416Smarkmint TerminalAutoFlush(void);
25857416Smarkmint TerminalSpecialChars(int c);
25957416Smarkmvoid TerminalFlushOutput(void);
26057416Smarkmvoid TerminalSaveState(void);
26157416Smarkmvoid TerminalDefaultChars(void);
26257416Smarkmvoid TerminalNewMode(int f);
26357416Smarkmcc_t *tcval(int func);
26457416Smarkmvoid TerminalSpeeds(long *input_speed, long *output_speed);
26557416Smarkmint TerminalWindowSize(long *rows, long *cols);
26657416Smarkmint NetClose(int fd);
26757416Smarkmvoid NetNonblockingIO(int fd, int onoff);
26857416Smarkmint process_rings(int netin, int netout, int netex, int ttyin, int ttyout,
26957416Smarkm		  int poll);
27057416Smarkm
27157416Smarkm/* telnet.c */
27257416Smarkm
27357416Smarkmvoid init_telnet(void);
27457416Smarkm
27557416Smarkmvoid tel_leave_binary(int rw);
27657416Smarkmvoid tel_enter_binary(int rw);
27757416Smarkmint opt_welldefined(char *ep);
27857416Smarkmint telrcv(void);
27957416Smarkmint rlogin_susp(void);
28057416Smarkmvoid intp(void);
28157416Smarkmvoid sendbrk(void);
28257416Smarkmvoid sendabort(void);
28357416Smarkmvoid sendsusp(void);
28457416Smarkmvoid sendeof(void);
28557416Smarkmvoid sendayt(void);
28657416Smarkm
28757416Smarkmvoid xmitAO(void);
28857416Smarkmvoid xmitEL(void);
28957416Smarkmvoid xmitEC(void);
29057416Smarkm
29157416Smarkm
29257416Smarkmvoid     Dump (char, unsigned char *, int);
29357416Smarkmvoid     printoption (char *, int, int);
29457416Smarkmvoid     sendnaws (void);
29557416Smarkmvoid     setconnmode (int);
29657416Smarkmvoid     setcommandmode (void);
29757416Smarkmvoid     setneturg (void);
29857416Smarkmvoid     sys_telnet_init (void);
29957416Smarkmvoid     my_telnet (char *);
30057416Smarkmvoid     tel_enter_binary (int);
30157416Smarkmvoid     TerminalFlushOutput (void);
30257416Smarkmvoid     TerminalNewMode (int);
30357416Smarkmvoid     TerminalRestoreState (void);
30457416Smarkmvoid     TerminalSaveState (void);
30557416Smarkmvoid     willoption (int);
30657416Smarkmvoid     wontoption (int);
30757416Smarkm
30857416Smarkm
30957416Smarkmvoid     send_do (int, int);
31057416Smarkmvoid     send_dont (int, int);
31157416Smarkmvoid     send_will (int, int);
31257416Smarkmvoid     send_wont (int, int);
31357416Smarkm
31457416Smarkmvoid     lm_will (unsigned char *, int);
31557416Smarkmvoid     lm_wont (unsigned char *, int);
31657416Smarkmvoid     lm_do (unsigned char *, int);
31757416Smarkmvoid     lm_dont (unsigned char *, int);
31857416Smarkmvoid     lm_mode (unsigned char *, int, int);
31957416Smarkm
32057416Smarkmvoid     slc_init (void);
32157416Smarkmvoid     slcstate (void);
32257416Smarkmvoid     slc_mode_export (void);
32357416Smarkmvoid     slc_mode_import (int);
32457416Smarkmvoid     slc_import (int);
32557416Smarkmvoid     slc_export (void);
32657416Smarkmvoid     slc (unsigned char *, int);
32757416Smarkmvoid     slc_check (void);
32857416Smarkmvoid     slc_start_reply (void);
32957416Smarkmvoid     slc_add_reply (unsigned char, unsigned char, cc_t);
33057416Smarkmvoid     slc_end_reply (void);
33157416Smarkmint	 slc_update (void);
33257416Smarkm
33357416Smarkmvoid     env_opt (unsigned char *, int);
33457416Smarkmvoid     env_opt_start (void);
33557416Smarkmvoid     env_opt_start_info (void);
33657416Smarkmvoid     env_opt_add (unsigned char *);
33757416Smarkmvoid     env_opt_end (int);
33857416Smarkm
33957416Smarkmunsigned char     *env_default (int, int);
34057416Smarkmunsigned char     *env_getvalue (unsigned char *);
34157416Smarkm
34257416Smarkmint get_status (void);
34357416Smarkmint dosynch (void);
34457416Smarkm
34557416Smarkmcc_t *tcval (int);
34657416Smarkm
34757416Smarkmint quit (void);
34857416Smarkm
34957416Smarkm/* terminal.c */
35057416Smarkm
35157416Smarkmvoid init_terminal(void);
35257416Smarkmint ttyflush(int drop);
35357416Smarkmint getconnmode(void);
35457416Smarkm
35557416Smarkm/* utilities.c */
35657416Smarkm
35757416Smarkmint SetSockOpt(int fd, int level, int option, int yesno);
35857416Smarkmvoid SetNetTrace(char *file);
35957416Smarkmvoid Dump(char direction, unsigned char *buffer, int length);
36057416Smarkmvoid printoption(char *direction, int cmd, int option);
36157416Smarkmvoid optionstatus(void);
362233294Sstasvoid printsub(int direction, unsigned char *pointer, size_t length);
36357416Smarkmvoid EmptyTerminal(void);
36457416Smarkmvoid SetForExit(void);
36557416Smarkmvoid Exit(int returnCode);
36657416Smarkmvoid ExitString(char *string, int returnCode);
36757416Smarkm
36857416Smarkmextern struct	termios new_tc;
36957416Smarkm
37057416Smarkm# define termEofChar		new_tc.c_cc[VEOF]
37157416Smarkm# define termEraseChar		new_tc.c_cc[VERASE]
37257416Smarkm# define termIntChar		new_tc.c_cc[VINTR]
37357416Smarkm# define termKillChar		new_tc.c_cc[VKILL]
37457416Smarkm# define termQuitChar		new_tc.c_cc[VQUIT]
37557416Smarkm
37657416Smarkm# ifndef	VSUSP
37757416Smarkmextern cc_t termSuspChar;
37857416Smarkm# else
37957416Smarkm#  define termSuspChar		new_tc.c_cc[VSUSP]
38057416Smarkm# endif
38157416Smarkm# if	defined(VFLUSHO) && !defined(VDISCARD)
38257416Smarkm#  define VDISCARD VFLUSHO
38357416Smarkm# endif
38457416Smarkm# ifndef	VDISCARD
38557416Smarkmextern cc_t termFlushChar;
38657416Smarkm# else
38757416Smarkm#  define termFlushChar		new_tc.c_cc[VDISCARD]
38857416Smarkm# endif
38957416Smarkm# ifndef VWERASE
39057416Smarkmextern cc_t termWerasChar;
39157416Smarkm# else
39257416Smarkm#  define termWerasChar		new_tc.c_cc[VWERASE]
39357416Smarkm# endif
39457416Smarkm# ifndef	VREPRINT
39557416Smarkmextern cc_t termRprntChar;
39657416Smarkm# else
39757416Smarkm#  define termRprntChar		new_tc.c_cc[VREPRINT]
39857416Smarkm# endif
39957416Smarkm# ifndef	VLNEXT
40057416Smarkmextern cc_t termLiteralNextChar;
40157416Smarkm# else
40257416Smarkm#  define termLiteralNextChar	new_tc.c_cc[VLNEXT]
40357416Smarkm# endif
40457416Smarkm# ifndef	VSTART
40557416Smarkmextern cc_t termStartChar;
40657416Smarkm# else
40757416Smarkm#  define termStartChar		new_tc.c_cc[VSTART]
40857416Smarkm# endif
40957416Smarkm# ifndef	VSTOP
41057416Smarkmextern cc_t termStopChar;
41157416Smarkm# else
41257416Smarkm#  define termStopChar		new_tc.c_cc[VSTOP]
41357416Smarkm# endif
41457416Smarkm# ifndef	VEOL
41557416Smarkmextern cc_t termForw1Char;
41657416Smarkm# else
41757416Smarkm#  define termForw1Char		new_tc.c_cc[VEOL]
41857416Smarkm# endif
41957416Smarkm# ifndef	VEOL2
42057416Smarkmextern cc_t termForw2Char;
42157416Smarkm# else
42257416Smarkm#  define termForw2Char		new_tc.c_cc[VEOL]
42357416Smarkm# endif
42457416Smarkm# ifndef	VSTATUS
42557416Smarkmextern cc_t termAytChar;
42657416Smarkm#else
42757416Smarkm#  define termAytChar		new_tc.c_cc[VSTATUS]
42857416Smarkm#endif
42957416Smarkm
43057416Smarkm/* Ring buffer structures which are shared */
43157416Smarkm
43257416Smarkmextern Ring
43357416Smarkm    netoring,
43457416Smarkm    netiring,
43557416Smarkm    ttyoring,
43657416Smarkm    ttyiring;
43757416Smarkm
43878527Sassarextern int resettermname;
43978527Sassarextern int linemode;
44078527Sassar#ifdef KLUDGELINEMODE
44178527Sassarextern int kludgelinemode;
44278527Sassar#endif
44390926Snectarextern int want_status_response;
444