Home | History | Annotate | Download | only in telnet
      1 /*
      2  * Copyright 1994-2002 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 /*
      7  * Copyright (c) 1988, 1990, 1993
      8  *	The Regents of the University of California.  All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. All advertising materials mentioning features or use of this software
     19  *    must display the following acknowledgement:
     20  *	This product includes software developed by the University of
     21  *	California, Berkeley and its contributors.
     22  * 4. Neither the name of the University nor the names of its contributors
     23  *    may be used to endorse or promote products derived from this software
     24  *    without specific prior written permission.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36  * SUCH DAMAGE.
     37  *
     38  *	@(#)externs.h	8.1 (Berkeley) 6/6/93
     39  */
     40 
     41 #ifndef _EXTERNS_H
     42 #define	_EXTERNS_H
     43 
     44 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     45 
     46 #ifdef	__cplusplus
     47 extern "C" {
     48 #endif
     49 
     50 #include <libintl.h>
     51 #include <stdio.h>
     52 #include <setjmp.h>
     53 #include <sys/filio.h>
     54 #ifdef	USE_TERMIO
     55 #include <sys/termios.h>
     56 #define	termio termios
     57 #endif
     58 #if defined(NO_CC_T) || !defined(USE_TERMIO)
     59 #if !defined(USE_TERMIO)
     60 typedef char cc_t;
     61 #else
     62 typedef unsigned char cc_t;
     63 #endif
     64 #endif
     65 
     66 #include "auth.h"
     67 #include "encrypt.h"
     68 #include <profile/prof_int.h>
     69 
     70 extern profile_options_boolean	config_file_options[];
     71 #define	forwardable_flag_set	config_file_options[0].found
     72 #define	forward_flag_set	config_file_options[1].found
     73 #define	encrypt_flag_set	config_file_options[2].found
     74 #define	autologin_set		config_file_options[3].found
     75 
     76 #include <string.h>
     77 
     78 #ifndef	_POSIX_VDISABLE
     79 #include <sys/param.h>	/* pick up VDISABLE definition, mayby */
     80 #ifdef VDISABLE
     81 #define	_POSIX_VDISABLE VDISABLE
     82 #else
     83 #define	_POSIX_VDISABLE ((cc_t)'\377')
     84 #endif
     85 #endif
     86 
     87 #include <wait.h>
     88 #include <stdlib.h>
     89 #include <unistd.h>
     90 
     91 
     92 #define	SUBBUFSIZE	256
     93 
     94 extern int autologin;	/* Autologin enabled */
     95 extern int skiprc;	/* Don't process the ~/.telnetrc file */
     96 extern int eight;	/* use eight bit mode (binary in and/or out */
     97 extern int flushout;	/* flush output */
     98 extern int connected;	/* Are we connected to the other side? */
     99 extern int globalmode;	/* Mode tty should be in */
    100 extern int telnetport;	/* Are we connected to the telnet port? */
    101 extern int localflow;	/* Flow control handled locally */
    102 extern int restartany;	/* If flow control, restart output on any character */
    103 extern int localchars;	/* we recognize interrupt/quit */
    104 extern int donelclchars; /* the user has set "localchars" */
    105 extern int showoptions;
    106 extern int net;		/* Network file descriptor */
    107 extern int tout;	/* Terminal output file descriptor */
    108 extern int crlf;	/* Should '\r' be mapped to <CR><LF> (or <CR><NUL>)? */
    109 extern int autoflush;	/* flush output when interrupting? */
    110 extern int autosynch;	/* send interrupt characters with SYNCH? */
    111 extern int SYNCHing;	/* Is the stream in telnet SYNCH mode? */
    112 extern int donebinarytoggle;	/* the user has put us in binary */
    113 extern int dontlecho;	/* do we suppress local echoing right now? */
    114 extern int crmod;
    115 extern int netdata;	/* Print out network data flow */
    116 extern int prettydump;	/* Print "netdata" output in user readable format */
    117 extern int termdata;	/* Print out terminal data flow */
    118 extern int eof_pending;	/* Received EOF in line mode, need to send IAC-xEOF */
    119 extern int debug;	/* Debug level */
    120 
    121 
    122 extern int krb5auth_flag;
    123 extern char *RemoteHostName;
    124 extern char *UserNameRequested;
    125 extern int forwardable_flag;
    126 extern int forward_flag;
    127 extern boolean_t wantencryption;	/* User has requested encryption */
    128 extern int encrypt_flag;		/* for reading config file for Krb5 */
    129 
    130 extern boolean_t Ambiguous(void *);
    131 extern boolean_t intr_happened;	/* for interrupt handling */
    132 extern boolean_t intr_waiting;
    133 
    134 extern cc_t escape;	/* Escape to command mode */
    135 extern cc_t rlogin;	/* Rlogin mode escape character */
    136 extern boolean_t escape_valid;
    137 #ifdef	KLUDGELINEMODE
    138 extern cc_t echoc;	/* Toggle local echoing */
    139 #endif
    140 
    141 extern char *prompt;	/* Prompt for command. */
    142 
    143 extern char doopt[];
    144 extern char dont[];
    145 extern char will[];
    146 extern char wont[];
    147 extern char options[];	/* All the little options */
    148 extern char *hostname;	/* Who are we connected to? */
    149 extern void (*encrypt_output) (unsigned char *, int);
    150 extern int (*decrypt_input) (int);
    151 
    152 /*
    153  * We keep track of each side of the option negotiation.
    154  */
    155 
    156 #define	MY_STATE_WILL		0x01
    157 #define	MY_WANT_STATE_WILL	0x02
    158 #define	MY_STATE_DO		0x04
    159 #define	MY_WANT_STATE_DO	0x08
    160 
    161 /*
    162  * Macros to check the current state of things
    163  */
    164 
    165 #define	my_state_is_do(opt)		(options[opt]&MY_STATE_DO)
    166 #define	my_state_is_will(opt)		(options[opt]&MY_STATE_WILL)
    167 #define	my_want_state_is_do(opt)	(options[opt]&MY_WANT_STATE_DO)
    168 #define	my_want_state_is_will(opt)	(options[opt]&MY_WANT_STATE_WILL)
    169 
    170 #define	my_state_is_dont(opt)		(!my_state_is_do(opt))
    171 #define	my_state_is_wont(opt)		(!my_state_is_will(opt))
    172 #define	my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))
    173 #define	my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))
    174 
    175 #define	set_my_state_do(opt)		{options[opt] |= MY_STATE_DO; }
    176 #define	set_my_state_will(opt)		{options[opt] |= MY_STATE_WILL; }
    177 #define	set_my_want_state_do(opt)	{options[opt] |= MY_WANT_STATE_DO; }
    178 #define	set_my_want_state_will(opt)	{options[opt] |= MY_WANT_STATE_WILL; }
    179 
    180 #define	set_my_state_dont(opt)		{options[opt] &= ~MY_STATE_DO; }
    181 #define	set_my_state_wont(opt)		{options[opt] &= ~MY_STATE_WILL; }
    182 #define	set_my_want_state_dont(opt)	{options[opt] &= ~MY_WANT_STATE_DO; }
    183 #define	set_my_want_state_wont(opt)	{options[opt] &= ~MY_WANT_STATE_WILL; }
    184 
    185 /*
    186  * Make everything symetrical
    187  */
    188 
    189 #define	HIS_STATE_WILL			MY_STATE_DO
    190 #define	HIS_WANT_STATE_WILL		MY_WANT_STATE_DO
    191 #define	HIS_STATE_DO			MY_STATE_WILL
    192 #define	HIS_WANT_STATE_DO		MY_WANT_STATE_WILL
    193 
    194 #define	his_state_is_do			my_state_is_will
    195 #define	his_state_is_will		my_state_is_do
    196 #define	his_want_state_is_do		my_want_state_is_will
    197 #define	his_want_state_is_will		my_want_state_is_do
    198 
    199 #define	his_state_is_dont		my_state_is_wont
    200 #define	his_state_is_wont		my_state_is_dont
    201 #define	his_want_state_is_dont		my_want_state_is_wont
    202 #define	his_want_state_is_wont		my_want_state_is_dont
    203 
    204 #define	set_his_state_do		set_my_state_will
    205 #define	set_his_state_will		set_my_state_do
    206 #define	set_his_want_state_do		set_my_want_state_will
    207 #define	set_his_want_state_will		set_my_want_state_do
    208 
    209 #define	set_his_state_dont		set_my_state_wont
    210 #define	set_his_state_wont		set_my_state_dont
    211 #define	set_his_want_state_dont		set_my_want_state_wont
    212 #define	set_his_want_state_wont		set_my_want_state_dont
    213 
    214 
    215 extern FILE *NetTrace;		/* Where debugging output goes */
    216 				/* Name of file where debugging output goes */
    217 extern unsigned char NetTraceFile[];
    218 extern void SetNetTrace(char *); /* Function to change where debugging goes */
    219 
    220 extern jmp_buf peerdied;
    221 extern jmp_buf toplevel;	/* For error conditions. */
    222 
    223 extern char *AllocStringBuffer(char **, unsigned int *, unsigned int);
    224 extern void ExitString(char *, int);
    225 extern void Exit(int);
    226 extern void command(int, char *, int);
    227 extern void Dump(int, unsigned char *, int);
    228 extern char *GetAndAppendString(char **, unsigned int *, char *, FILE *);
    229 extern char *GetString(char **, unsigned int *, FILE *);
    230 extern void init_network(void);
    231 extern void init_terminal(void);
    232 extern void init_sys(void);
    233 extern void optionstatus(void);
    234 extern void printoption(char *, int, int);
    235 extern void printsub(int, unsigned char *, int);
    236 extern void sendnaws(void);
    237 extern void setconnmode(int);
    238 extern void setcommandmode(void);
    239 extern void setneturg(void);
    240 extern void sys_telnet_init(void);
    241 extern void telnet(char *);
    242 extern void tel_enter_binary(int);
    243 extern void tel_leave_binary(int);
    244 extern void TerminalDefaultChars(void);
    245 extern void TerminalFlushOutput(void);
    246 extern void TerminalNewMode(int);
    247 extern void TerminalSaveState(void);
    248 extern void TerminalSpeeds(int *, int *);
    249 extern void upcase(char *);
    250 
    251 extern void xmitEL(void);
    252 extern void xmitEC(void);
    253 extern void intp(void);
    254 extern void sendabort(void);
    255 extern void sendsusp(void);
    256 extern void set_escape_char(char *);
    257 extern void fatal_tty_error(char *);
    258 
    259 extern void send_do(int, int);
    260 extern void send_dont(int, int);
    261 extern void send_will(int, int);
    262 extern void send_wont(int, int);
    263 
    264 extern void lm_mode(unsigned char *, int, int);
    265 
    266 extern void slcstate(void);
    267 extern void slc_mode_export(void);
    268 extern void slc_mode_import(int);
    269 extern void slc_check(void);
    270 
    271 extern void env_opt_start_info(void);
    272 extern void env_opt_add(unsigned char *);
    273 extern void env_opt_end(int);
    274 
    275 extern char **genget(char *, char **, int);
    276 extern unsigned char *env_default(int, int);
    277 extern unsigned char *env_getvalue(unsigned char *);
    278 
    279 extern int env_init(void);
    280 extern int get_status(void);
    281 extern int init_telnet(void);
    282 extern int isprefix(register char *, register char *);
    283 extern int netflush(void);
    284 extern int opt_welldefined(char *);
    285 extern int process_rings(int, int, int, int, int, int);
    286 extern int quit(void);
    287 extern int rlogin_susp(void);
    288 extern int Scheduler(int);
    289 extern int SetSockOpt(int, int, int, int);
    290 extern int stilloob(void);
    291 extern int telrcv(void);
    292 extern int TerminalWindowSize(unsigned short *, unsigned short *);
    293 extern int TerminalWrite(char *, int);
    294 extern int TerminalSpecialChars(int);
    295 extern int tn(int, char **);
    296 extern int tninit(void);
    297 extern int ttyflush(int);
    298 extern int getconnmode(void);
    299 extern int xmitAO(void);
    300 extern int sendbrk(void);
    301 extern int dosynch(void);
    302 
    303 extern cc_t *tcval(int);
    304 
    305 extern void	auth_encrypt_init(char *, char *, char *);
    306 extern void	auth_encrypt_user(char *);
    307 extern int	net_write(unsigned char *, int len);
    308 extern void	net_encrypt(void);
    309 extern void	telnet_spin(void);
    310 extern void	printd(unsigned char *, int);
    311 
    312 #ifndef	USE_TERMIO
    313 
    314 extern struct	tchars ntc;
    315 extern struct	ltchars nltc;
    316 extern struct	sgttyb nttyb;
    317 
    318 #define	termEofChar		ntc.t_eofc
    319 #define	termEraseChar		nttyb.sg_erase
    320 #define	termFlushChar		nltc.t_flushc
    321 #define	termIntChar		ntc.t_intrc
    322 #define	termKillChar		nttyb.sg_kill
    323 #define	termLiteralNextChar	nltc.t_lnextc
    324 #define	termQuitChar		ntc.t_quitc
    325 #define	termSuspChar		nltc.t_suspc
    326 #define	termRprntChar		nltc.t_rprntc
    327 #define	termWerasChar		nltc.t_werasc
    328 #define	termStartChar		ntc.t_startc
    329 #define	termStopChar		ntc.t_stopc
    330 #define	termForw1Char		ntc.t_brkc
    331 extern cc_t termForw2Char;
    332 extern cc_t termAytChar;
    333 
    334 #define	termEofCharp		(cc_t *)&ntc.t_eofc
    335 #define	termEraseCharp		(cc_t *)&nttyb.sg_erase
    336 #define	termFlushCharp		(cc_t *)&nltc.t_flushc
    337 #define	termIntCharp		(cc_t *)&ntc.t_intrc
    338 #define	termKillCharp		(cc_t *)&nttyb.sg_kill
    339 #define	termLiteralNextCharp	(cc_t *)&nltc.t_lnextc
    340 #define	termQuitCharp		(cc_t *)&ntc.t_quitc
    341 #define	termSuspCharp		(cc_t *)&nltc.t_suspc
    342 #define	termRprntCharp		(cc_t *)&nltc.t_rprntc
    343 #define	termWerasCharp		(cc_t *)&nltc.t_werasc
    344 #define	termStartCharp		(cc_t *)&ntc.t_startc
    345 #define	termStopCharp		(cc_t *)&ntc.t_stopc
    346 #define	termForw1Charp		(cc_t *)&ntc.t_brkc
    347 #define	termForw2Charp		(cc_t *)&termForw2Char
    348 #define	termAytCharp		(cc_t *)&termAytChar
    349 
    350 #else
    351 
    352 extern struct	termio new_tc;
    353 
    354 #define	termEofChar		new_tc.c_cc[VEOF]
    355 #define	termEraseChar		new_tc.c_cc[VERASE]
    356 #define	termIntChar		new_tc.c_cc[VINTR]
    357 #define	termKillChar		new_tc.c_cc[VKILL]
    358 #define	termQuitChar		new_tc.c_cc[VQUIT]
    359 
    360 #define	termSuspChar		new_tc.c_cc[VSUSP]
    361 #define	termFlushChar		new_tc.c_cc[VDISCARD]
    362 #define	termWerasChar		new_tc.c_cc[VWERASE]
    363 #define	termRprntChar		new_tc.c_cc[VREPRINT]
    364 #define	termLiteralNextChar	new_tc.c_cc[VLNEXT]
    365 #define	termStartChar		new_tc.c_cc[VSTART]
    366 #define	termStopChar		new_tc.c_cc[VSTOP]
    367 #define	termForw1Char		new_tc.c_cc[VEOL]
    368 #define	termForw2Char		new_tc.c_cc[VEOL]
    369 extern cc_t termAytChar;
    370 
    371 #define	termEofCharp		&termEofChar
    372 #define	termEraseCharp		&termEraseChar
    373 #define	termIntCharp		&termIntChar
    374 #define	termKillCharp		&termKillChar
    375 #define	termQuitCharp		&termQuitChar
    376 #define	termSuspCharp		&termSuspChar
    377 #define	termFlushCharp		&termFlushChar
    378 #define	termWerasCharp		&termWerasChar
    379 #define	termRprntCharp		&termRprntChar
    380 #define	termLiteralNextCharp	&termLiteralNextChar
    381 #define	termStartCharp		&termStartChar
    382 #define	termStopCharp		&termStopChar
    383 #define	termForw1Charp		&termForw1Char
    384 #define	termForw2Charp		&termForw2Char
    385 #define	termAytCharp		&termAytChar
    386 #endif
    387 
    388 
    389 /* Ring buffer structures which are shared */
    390 
    391 #include "ring.h"
    392 
    393 extern Ring netoring;
    394 extern Ring netiring;
    395 extern Ring ttyoring;
    396 extern Ring ttyiring;
    397 
    398 #ifdef	__cplusplus
    399 }
    400 #endif
    401 
    402 #endif	/* _EXTERNS_H */
    403