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