/ appl / telnet / telnet / externs.h
externs.h
  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. All advertising materials mentioning features or use of this software
 14   *    must display the following acknowledgement:
 15   *	This product includes software developed by the University of
 16   *	California, Berkeley and its contributors.
 17   * 4. Neither the name of the University nor the names of its contributors
 18   *    may be used to endorse or promote products derived from this software
 19   *    without specific prior written permission.
 20   *
 21   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 22   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 24   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 25   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 27   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 28   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 29   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 30   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 31   * SUCH DAMAGE.
 32   *
 33   *	@(#)externs.h	8.3 (Berkeley) 5/30/95
 34   */
 35  
 36  /* $Id$ */
 37  
 38  #ifndef	BSD
 39  # define BSD 43
 40  #endif
 41  
 42  #ifndef	_POSIX_VDISABLE
 43  # ifdef sun
 44  #  include <sys/param.h>	/* pick up VDISABLE definition, mayby */
 45  # endif
 46  # ifdef VDISABLE
 47  #  define _POSIX_VDISABLE VDISABLE
 48  # else
 49  #  define _POSIX_VDISABLE ((cc_t)'\377')
 50  # endif
 51  #endif
 52  
 53  #define	SUBBUFSIZE	256
 54  
 55  extern int
 56      autologin,		/* Autologin enabled */
 57      skiprc,		/* Don't process the ~/.telnetrc file */
 58      eight,		/* use eight bit mode (binary in and/or out */
 59      binary,
 60      flushout,		/* flush output */
 61      connected,		/* Are we connected to the other side? */
 62      globalmode,		/* Mode tty should be in */
 63      telnetport,		/* Are we connected to the telnet port? */
 64      localflow,		/* Flow control handled locally */
 65      restartany,		/* If flow control, restart output on any character */
 66      localchars,		/* we recognize interrupt/quit */
 67      donelclchars,	/* the user has set "localchars" */
 68      showoptions,
 69      wantencryption,	/* User has requested encryption */
 70      net,		/* Network file descriptor */
 71      tin,		/* Terminal input file descriptor */
 72      tout,		/* Terminal output file descriptor */
 73      crlf,		/* Should '\r' be mapped to <CR><LF> (or <CR><NUL>)? */
 74      autoflush,		/* flush output when interrupting? */
 75      autosynch,		/* send interrupt characters with SYNCH? */
 76      SYNCHing,		/* Is the stream in telnet SYNCH mode? */
 77      donebinarytoggle,	/* the user has put us in binary */
 78      dontlecho,		/* do we suppress local echoing right now? */
 79      crmod,
 80      netdata,		/* Print out network data flow */
 81      prettydump,		/* Print "netdata" output in user readable format */
 82      termdata,		/* Print out terminal data flow */
 83      debug;		/* Debug level */
 84  
 85  extern int intr_happened, intr_waiting;	/* for interrupt handling */
 86  
 87  extern cc_t escape;	/* Escape to command mode */
 88  extern cc_t rlogin;	/* Rlogin mode escape character */
 89  #ifdef	KLUDGELINEMODE
 90  extern cc_t echoc;	/* Toggle local echoing */
 91  #endif
 92  
 93  extern char
 94      *prompt;		/* Prompt for command. */
 95  
 96  extern char
 97      doopt[],
 98      dont[],
 99      will[],
100      wont[],
101      do_dont_resp[],
102      will_wont_resp[],
103      options[],		/* All the little options */
104      *hostname;		/* Who are we connected to? */
105  #if	defined(ENCRYPTION)
106  extern void (*encrypt_output) (unsigned char *, int);
107  extern int (*decrypt_input) (int);
108  #endif
109  
110  /*
111   * We keep track of each side of the option negotiation.
112   */
113  
114  #define	MY_STATE_WILL		0x01
115  #define	MY_WANT_STATE_WILL	0x02
116  #define	MY_STATE_DO		0x04
117  #define	MY_WANT_STATE_DO	0x08
118  
119  /*
120   * Macros to check the current state of things
121   */
122  
123  #define	my_state_is_do(opt)		(options[opt]&MY_STATE_DO)
124  #define	my_state_is_will(opt)		(options[opt]&MY_STATE_WILL)
125  #define my_want_state_is_do(opt)	(options[opt]&MY_WANT_STATE_DO)
126  #define my_want_state_is_will(opt)	(options[opt]&MY_WANT_STATE_WILL)
127  
128  #define	my_state_is_dont(opt)		(!my_state_is_do(opt))
129  #define	my_state_is_wont(opt)		(!my_state_is_will(opt))
130  #define my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))
131  #define my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))
132  
133  #define	set_my_state_do(opt)		{options[opt] |= MY_STATE_DO;}
134  #define	set_my_state_will(opt)		{options[opt] |= MY_STATE_WILL;}
135  #define	set_my_want_state_do(opt)	{options[opt] |= MY_WANT_STATE_DO;}
136  #define	set_my_want_state_will(opt)	{options[opt] |= MY_WANT_STATE_WILL;}
137  
138  #define	set_my_state_dont(opt)		{options[opt] &= ~MY_STATE_DO;}
139  #define	set_my_state_wont(opt)		{options[opt] &= ~MY_STATE_WILL;}
140  #define	set_my_want_state_dont(opt)	{options[opt] &= ~MY_WANT_STATE_DO;}
141  #define	set_my_want_state_wont(opt)	{options[opt] &= ~MY_WANT_STATE_WILL;}
142  
143  /*
144   * Make everything symmetrical
145   */
146  
147  #define	HIS_STATE_WILL			MY_STATE_DO
148  #define	HIS_WANT_STATE_WILL		MY_WANT_STATE_DO
149  #define HIS_STATE_DO			MY_STATE_WILL
150  #define HIS_WANT_STATE_DO		MY_WANT_STATE_WILL
151  
152  #define	his_state_is_do			my_state_is_will
153  #define	his_state_is_will		my_state_is_do
154  #define his_want_state_is_do		my_want_state_is_will
155  #define his_want_state_is_will		my_want_state_is_do
156  
157  #define	his_state_is_dont		my_state_is_wont
158  #define	his_state_is_wont		my_state_is_dont
159  #define his_want_state_is_dont		my_want_state_is_wont
160  #define his_want_state_is_wont		my_want_state_is_dont
161  
162  #define	set_his_state_do		set_my_state_will
163  #define	set_his_state_will		set_my_state_do
164  #define	set_his_want_state_do		set_my_want_state_will
165  #define	set_his_want_state_will		set_my_want_state_do
166  
167  #define	set_his_state_dont		set_my_state_wont
168  #define	set_his_state_wont		set_my_state_dont
169  #define	set_his_want_state_dont		set_my_want_state_wont
170  #define	set_his_want_state_wont		set_my_want_state_dont
171  
172  
173  extern FILE
174      *NetTrace;		/* Where debugging output goes */
175  extern char
176      NetTraceFile[];	/* Name of file where debugging output goes */
177  extern void
178      SetNetTrace (char *);	/* Function to change where debugging goes */
179  
180  extern jmp_buf
181      peerdied,
182      toplevel;		/* For error conditions. */
183  
184  int Scheduler(int);
185  extern int scheduler_lockout_tty;
186  
187  
188  /* authenc.c */
189  
190  #if	defined(AUTHENTICATION) || defined(ENCRYPTION)
191  int telnet_net_write(unsigned char *str, int len);
192  void net_encrypt(void);
193  int telnet_spin(void);
194  char *telnet_getenv(const char *val);
195  char *telnet_gets(char *prompt, char *result, int length, int echo);
196  #endif
197  
198  /* commands.c */
199  
200  struct env_lst *env_define (unsigned char *, unsigned char *);
201  struct env_lst *env_find(unsigned char *var);
202  void env_init (void);
203  void env_undefine (unsigned char *);
204  void env_export (unsigned char *);
205  void env_unexport (unsigned char *);
206  void env_send (unsigned char *);
207  void env_list (void);
208  unsigned char * env_default(int init, int welldefined);
209  unsigned char * env_getvalue(unsigned char *var);
210  
211  void set_escape_char(char *s);
212  int sourceroute(struct addrinfo *ai, char *arg, char **cpp,
213  		int *prototp, int *optp);
214  
215  #if	defined(AUTHENTICATION)
216  int auth_enable (char *);
217  int auth_disable (char *);
218  int auth_status (void);
219  #endif
220  
221  #if defined(ENCRYPTION)
222  int 	EncryptEnable (char *, char *);
223  int 	EncryptDisable (char *, char *);
224  int 	EncryptType (char *, char *);
225  int 	EncryptStart (char *);
226  int 	EncryptStartInput (void);
227  int 	EncryptStartOutput (void);
228  int 	EncryptStop (char *);
229  int 	EncryptStopInput (void);
230  int 	EncryptStopOutput (void);
231  int 	EncryptStatus (void);
232  #endif
233  
234  #ifdef SIGINFO
235  RETSIGTYPE ayt_status(int);
236  #endif
237  int tn(int argc, char **argv);
238  void command(int top, char *tbuf, int cnt);
239  
240  /* main.c */
241  
242  void tninit(void);
243  void set_forward_options(void);
244  
245  /* network.c */
246  
247  void init_network(void);
248  int stilloob(void);
249  void setneturg(void);
250  int netflush(void);
251  
252  /* sys_bsd.c */
253  
254  void init_sys(void);
255  int TerminalWrite(char *buf, int n);
256  int TerminalRead(unsigned char *buf, int n);
257  int TerminalAutoFlush(void);
258  int TerminalSpecialChars(int c);
259  void TerminalFlushOutput(void);
260  void TerminalSaveState(void);
261  void TerminalDefaultChars(void);
262  void TerminalNewMode(int f);
263  cc_t *tcval(int func);
264  void TerminalSpeeds(long *input_speed, long *output_speed);
265  int TerminalWindowSize(long *rows, long *cols);
266  int NetClose(int fd);
267  void NetNonblockingIO(int fd, int onoff);
268  int process_rings(int netin, int netout, int netex, int ttyin, int ttyout,
269  		  int poll);
270  
271  /* telnet.c */
272  
273  void init_telnet(void);
274  
275  void tel_leave_binary(int rw);
276  void tel_enter_binary(int rw);
277  int opt_welldefined(char *ep);
278  int telrcv(void);
279  int rlogin_susp(void);
280  void intp(void);
281  void sendbrk(void);
282  void sendabort(void);
283  void sendsusp(void);
284  void sendeof(void);
285  void sendayt(void);
286  
287  void xmitAO(void);
288  void xmitEL(void);
289  void xmitEC(void);
290  
291  
292  void     Dump (char, unsigned char *, int);
293  void     printoption (char *, int, int);
294  void     sendnaws (void);
295  void     setconnmode (int);
296  void     setcommandmode (void);
297  void     setneturg (void);
298  void     sys_telnet_init (void);
299  void     my_telnet (char *);
300  void     tel_enter_binary (int);
301  void     TerminalFlushOutput (void);
302  void     TerminalNewMode (int);
303  void     TerminalRestoreState (void);
304  void     TerminalSaveState (void);
305  void     willoption (int);
306  void     wontoption (int);
307  
308  
309  void     send_do (int, int);
310  void     send_dont (int, int);
311  void     send_will (int, int);
312  void     send_wont (int, int);
313  
314  void     lm_will (unsigned char *, int);
315  void     lm_wont (unsigned char *, int);
316  void     lm_do (unsigned char *, int);
317  void     lm_dont (unsigned char *, int);
318  void     lm_mode (unsigned char *, int, int);
319  
320  void     slc_init (void);
321  void     slcstate (void);
322  void     slc_mode_export (void);
323  void     slc_mode_import (int);
324  void     slc_import (int);
325  void     slc_export (void);
326  void     slc (unsigned char *, int);
327  void     slc_check (void);
328  void     slc_start_reply (void);
329  void     slc_add_reply (unsigned char, unsigned char, cc_t);
330  void     slc_end_reply (void);
331  int	 slc_update (void);
332  
333  void     env_opt (unsigned char *, int);
334  void     env_opt_start (void);
335  void     env_opt_start_info (void);
336  void     env_opt_add (unsigned char *);
337  void     env_opt_end (int);
338  
339  unsigned char     *env_default (int, int);
340  unsigned char     *env_getvalue (unsigned char *);
341  
342  int get_status (void);
343  int dosynch (void);
344  
345  cc_t *tcval (int);
346  
347  int quit (void);
348  
349  /* terminal.c */
350  
351  void init_terminal(void);
352  int ttyflush(int drop);
353  int getconnmode(void);
354  
355  /* utilities.c */
356  
357  int SetSockOpt(int fd, int level, int option, int yesno);
358  void SetNetTrace(char *file);
359  void Dump(char direction, unsigned char *buffer, int length);
360  void printoption(char *direction, int cmd, int option);
361  void optionstatus(void);
362  void printsub(int direction, unsigned char *pointer, size_t length);
363  void EmptyTerminal(void);
364  void SetForExit(void);
365  void Exit(int returnCode);
366  void ExitString(char *string, int returnCode);
367  
368  extern struct	termios new_tc;
369  
370  # define termEofChar		new_tc.c_cc[VEOF]
371  # define termEraseChar		new_tc.c_cc[VERASE]
372  # define termIntChar		new_tc.c_cc[VINTR]
373  # define termKillChar		new_tc.c_cc[VKILL]
374  # define termQuitChar		new_tc.c_cc[VQUIT]
375  
376  # ifndef	VSUSP
377  extern cc_t termSuspChar;
378  # else
379  #  define termSuspChar		new_tc.c_cc[VSUSP]
380  # endif
381  # if	defined(VFLUSHO) && !defined(VDISCARD)
382  #  define VDISCARD VFLUSHO
383  # endif
384  # ifndef	VDISCARD
385  extern cc_t termFlushChar;
386  # else
387  #  define termFlushChar		new_tc.c_cc[VDISCARD]
388  # endif
389  # ifndef VWERASE
390  extern cc_t termWerasChar;
391  # else
392  #  define termWerasChar		new_tc.c_cc[VWERASE]
393  # endif
394  # ifndef	VREPRINT
395  extern cc_t termRprntChar;
396  # else
397  #  define termRprntChar		new_tc.c_cc[VREPRINT]
398  # endif
399  # ifndef	VLNEXT
400  extern cc_t termLiteralNextChar;
401  # else
402  #  define termLiteralNextChar	new_tc.c_cc[VLNEXT]
403  # endif
404  # ifndef	VSTART
405  extern cc_t termStartChar;
406  # else
407  #  define termStartChar		new_tc.c_cc[VSTART]
408  # endif
409  # ifndef	VSTOP
410  extern cc_t termStopChar;
411  # else
412  #  define termStopChar		new_tc.c_cc[VSTOP]
413  # endif
414  # ifndef	VEOL
415  extern cc_t termForw1Char;
416  # else
417  #  define termForw1Char		new_tc.c_cc[VEOL]
418  # endif
419  # ifndef	VEOL2
420  extern cc_t termForw2Char;
421  # else
422  #  define termForw2Char		new_tc.c_cc[VEOL]
423  # endif
424  # ifndef	VSTATUS
425  extern cc_t termAytChar;
426  #else
427  #  define termAytChar		new_tc.c_cc[VSTATUS]
428  #endif
429  
430  /* Ring buffer structures which are shared */
431  
432  extern Ring
433      netoring,
434      netiring,
435      ttyoring,
436      ttyiring;
437  
438  extern int resettermname;
439  extern int linemode;
440  #ifdef KLUDGELINEMODE
441  extern int kludgelinemode;
442  #endif
443  extern int want_status_response;