⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 telnetd.h

📁 linux下telnet服务端的源码实现
💻 H
字号:
/* Copyright (C) 1998,2001,2005 Free Software Foundation, Inc.   This file is part of GNU Inetutils.   GNU Inetutils is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2, or (at your option)   any later version.   GNU Inetutils is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with GNU Inetutils; see the file COPYING.  If not, write   to the Free Software Foundation, Inc., 51 Franklin Street,   Fifth Floor, Boston, MA 02110-1301 USA. */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <sys/types.h>#include <sys/time.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <unistd.h>#include <signal.h>#include <errno.h>#include <syslog.h>#include <string.h>#ifdef HAVE_STRINGS_H# include <strings.h>#endif#ifdef HAVE_SYS_FILIO_H# include <sys/filio.h>#endif#ifdef HAVE_SYS_TTY_H# include <sys/tty.h>#endif#ifdef HAVE_SYS_PTYVAR_H# include <sys/ptyvar.h>#endif#ifdef HAVE_STROPTS_H# include <stropts.h>#endif#include <sys/ioctl.h>#include <arpa/telnet.h>#include <libtelnet/auth.h>#ifndef	P# if defined PROTOTYPES || (defined __STDC__ && __STDC__)#  define P(x)	x# else#  define P(x)	()# endif#endif#if defined(HAVE_TERMIOS_H)# include <termios.h>#elif defined(HAVE_TERMIO_H)# include <termio.h>#else# include <sgtty.h>#endif#define obstack_chunk_alloc malloc#define obstack_chunk_free free#include <obstack.h>#include "xalloc.h"#ifndef HAVE_CC_Ttypedef unsigned char cc_t;#endiftypedef enum debug_mode{    debug_options,    debug_report,    debug_net_data,    debug_pty_data,    debug_auth,    debug_max_mode} debug_mode_t;#define MAX_DEBUG_LEVEL 100extern int debug_level[];#define DEBUG(mode,level,c) if (debug_level[mode]>=level) cstruct telnetd_clocks{  int system;           /* what the current time is */           int echotoggle;	/* last time user entered echo character */   int modenegotiated;	/* last time operating mode negotiated */  int didnetreceive;	/* last time we read data from network */  int ttypesubopt;	/* ttype subopt is received */           int tspeedsubopt;	/* tspeed subopt is received */          int environsubopt;	/* environ subopt is received */         int oenvironsubopt;	/* old environ subopt is received */     int xdisplocsubopt;	/* xdisploc subopt is received */        int baseline;		/* time started to do timed action */    int gotDM;		/* when did we last see a data mark */ };#define	settimer(x)	(clocks.x = ++clocks.system)#define	sequenceIs(x,y)	(clocks.x < clocks.y)/* * Structures of information for each special character function. */typedef struct{  unsigned char	flag;  /* the flags for this function */  cc_t		val;   /* the value of the special character */} slcent, *Slcent;typedef struct{  slcent defset;       /* the default settings */  slcent current;      /* the current settings */  cc_t *sptr;	       /* a pointer to the char in */		       /* system data structures */} slcfun, *Slcfun;#ifdef HAVE_UNAME   /* Prefix and suffix if the IM string can be generated from uname.  */#  define UNAME_IM_PREFIX "\r\n"#  define UNAME_IM_SUFFIX " (%h) (%t)\r\n\n"#else /* ! HAVE_UNAME */#  define UNAME_IM_PREFIX "\r\n"#  define UNAME_IM_SUFFIX "\r\n"#endif/* ********************* *//* State machine *//* * We keep track of each side of the option negotiation. */#define	MY_STATE_WILL		0x01#define	MY_WANT_STATE_WILL	0x02#define	MY_STATE_DO		0x04#define	MY_WANT_STATE_DO	0x08/* * Macros to check the current state of things */#define	my_state_is_do(opt)		(options[opt]&MY_STATE_DO)#define	my_state_is_will(opt)		(options[opt]&MY_STATE_WILL)#define my_want_state_is_do(opt)	(options[opt]&MY_WANT_STATE_DO)#define my_want_state_is_will(opt)	(options[opt]&MY_WANT_STATE_WILL)#define	my_state_is_dont(opt)		(!my_state_is_do(opt))#define	my_state_is_wont(opt)		(!my_state_is_will(opt))#define my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))#define my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))#define	set_my_state_do(opt)		(options[opt] |= MY_STATE_DO)#define	set_my_state_will(opt)		(options[opt] |= MY_STATE_WILL)#define	set_my_want_state_do(opt)	(options[opt] |= MY_WANT_STATE_DO)#define	set_my_want_state_will(opt)	(options[opt] |= MY_WANT_STATE_WILL)#define	set_my_state_dont(opt)		(options[opt] &= ~MY_STATE_DO)#define	set_my_state_wont(opt)		(options[opt] &= ~MY_STATE_WILL)#define	set_my_want_state_dont(opt)	(options[opt] &= ~MY_WANT_STATE_DO)#define	set_my_want_state_wont(opt)	(options[opt] &= ~MY_WANT_STATE_WILL)/* * Tricky code here.  What we want to know is if the MY_STATE_WILL * and MY_WANT_STATE_WILL bits have the same value.  Since the two * bits are adjacent, a little arithmatic will show that by adding * in the lower bit, the upper bit will be set if the two bits were * different, and clear if they were the same. */#define my_will_wont_is_changing(opt) \			((options[opt]+MY_STATE_WILL) & MY_WANT_STATE_WILL)#define my_do_dont_is_changing(opt) \			((options[opt]+MY_STATE_DO) & MY_WANT_STATE_DO)/* * Make everything symetrical */#define	HIS_STATE_WILL			MY_STATE_DO#define	HIS_WANT_STATE_WILL		MY_WANT_STATE_DO#define HIS_STATE_DO			MY_STATE_WILL#define HIS_WANT_STATE_DO		MY_WANT_STATE_WILL#define	his_state_is_do			my_state_is_will#define	his_state_is_will		my_state_is_do#define his_want_state_is_do		my_want_state_is_will#define his_want_state_is_will		my_want_state_is_do#define	his_state_is_dont		my_state_is_wont#define	his_state_is_wont		my_state_is_dont#define his_want_state_is_dont		my_want_state_is_wont#define his_want_state_is_wont		my_want_state_is_dont#define	set_his_state_do		set_my_state_will#define	set_his_state_will		set_my_state_do#define	set_his_want_state_do		set_my_want_state_will#define	set_his_want_state_will		set_my_want_state_do#define	set_his_state_dont		set_my_state_wont#define	set_his_state_wont		set_my_state_dont#define	set_his_want_state_dont		set_my_want_state_wont#define	set_his_want_state_wont		set_my_want_state_dont#define his_will_wont_is_changing	my_do_dont_is_changing#define his_do_dont_is_changing		my_will_wont_is_changing/* ******* */void fatal (int f, char *msg);/* * Linemode support states, in decreasing order of importance */#define REAL_LINEMODE	0x04#define KLUDGE_OK	0x03#define	NO_AUTOKLUDGE	0x02#define KLUDGE_LINEMODE	0x01#define NO_LINEMODE	0x00#include <arpa/telnet.h>#define NETSLOP 64#define ttloop(c) while (c) io_drain ()/* External variables */extern char	options[256];extern char	do_dont_resp[256];extern char	will_wont_resp[256];extern int	linemode;	/* linemode on/off */extern int	uselinemode;	/* what linemode to use (on/off) */extern int	editmode;	/* edit modes in use */extern int	useeditmode;	/* edit modes to use */extern int	alwayslinemode;	/* command line option */extern int	lmodetype;	/* Client support for linemode */extern int	flowmode;	/* current flow control state */extern int	restartany;	/* restart output on any character state */extern int	diagnostic;	/* telnet diagnostic capabilities */#if defined(AUTHENTICATION)extern int	auth_level;extern int      autologin;#endifextern slcfun	slctab[NSLC + 1];	/* slc mapping table */extern char *terminaltype;extern char *remote_hostname;extern char *local_hostname;extern char *login_invocation;extern char *user_name;extern int	pty, net;extern int	SYNCHing;		/* we are in TELNET SYNCH mode */extern struct telnetd_clocks clocks;extern char line[];extern char *xstrdup P((const char *));extern int argcv_get P((const char *command, const char *delim,			int *argc, char ***argv));void io_setup P((void));int net_has_data P((void));int net_get_char P((int peek));void set_neturg P((void));int net_output_data P((const char *format,...));int net_output_datalen P((const void *buf, size_t l));int net_buffer_level P((void));void io_drain P((void));int stilloob P((int s));void ptyflush P((void));char * nextitem P((char *current));void netclear P(());void netflush P(());int pty_buffer_is_full P((void));void pty_output_byte P((int c));void pty_output_datalen P((const void *data, size_t len));int pty_buffer_level P(());/* Debugging functions */extern void printoption P((char *, int));extern void printdata P((char *, char *, int));extern void printsub P((int, unsigned char *, int));extern void debug_output_datalen P((const char *data, size_t len));extern void debug_output_data P((const char *fmt, ...));/* TTY functions */extern void init_termbuf P((void));extern void set_termbuf P((void));extern int spcset P((int func, cc_t *valp, cc_t **valpp));extern void term_send_eof P((void));extern int term_change_eof P((void));extern void tty_binaryin P((int));extern void tty_binaryout P((int));extern int tty_flowmode P((void));extern int tty_restartany P((void));extern int tty_isbinaryin P((void));extern int tty_isbinaryout P((void));extern int tty_iscrnl P((void));extern int tty_isecho P((void));extern int tty_isediting P((void));extern int tty_islitecho P((void));extern int tty_isnewmap P((void));extern int tty_israw P((void));extern int tty_issofttab P((void));extern int tty_istrapsig P((void));extern int tty_linemode P((void));extern void tty_rspeed P((int));extern void tty_setecho P((int));extern void tty_setedit P((int));extern void tty_setlinemode P((int));extern void tty_setlitecho P((int));extern void tty_setsig P((int));extern void tty_setsofttab P((int));extern void tty_tspeed P((int));extern char * expand_line P((const char *fmt));/*  FIXME */extern void _termstat P((void));extern void add_slc P((char func, char flag, cc_t val));extern void check_slc P((void));extern void change_slc P((char func, char flag, cc_t val));extern void cleanup P((int));extern void clientstat P((int, int, int));extern void copy_termbuf P(());extern void deferslc P((void));extern void defer_terminit P((void));extern void do_opt_slc P((unsigned char *, int));extern void dooption P((int));extern void dontoption P((int));extern void edithost P((char *, char *));extern void fatal P((int, char *));extern void fatalperror P((int, char *));extern void get_slc_defaults P((void));extern void localstat P((void));extern void flowstat P((void));extern void netclear P((void));extern void send_do P((int, int));extern void send_dont P((int, int));extern void send_slc P((void));extern void send_status P((void));extern void send_will P((int, int));extern void send_wont P((int, int));extern void set_termbuf P((void));extern void start_login P((char *, int, char *));extern void start_slc P((int));extern void start_slave P((char *, int, char *));extern void suboption P((void));extern void telrcv P((void));extern void ttloop P((void));  extern int end_slc P((unsigned char **));extern int spcset P((int, cc_t *, cc_t **));extern int stilloob P((int));extern int terminit P((void));extern int termstat P((void));extern void willoption P((int));extern void wontoption P((int));#ifdef	ENCRYPTIONextern void	(*encrypt_output) P((unsigned char *, int));extern int	(*decrypt_input) P((int));#endif	/* ENCRYPTION */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -